【问题标题】:Setting the speaker on doesn't always work设置扬声器并不总是有效
【发布时间】:2013-02-24 15:12:02
【问题描述】:

我正在制作一个应用程序,用户可以通过我的应用程序呼叫他最喜欢的联系人。 通话开始时,扬声器打开。 为了使用这个 Intent 拨打电话。

               Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel: "+contactnum.get(0)));
                startActivity(callIntent); 

当有一个外出呼叫时,会有一个启动 BroadcastReceiver 的 Intent

    <receiver android:name=".MyBroadcast">
    <intent-filter>

        <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        <action android:name="android.intent.action.PHONE_STATE" />

    </intent-filter>
    </receiver>



public class MyBroadcast extends BroadcastReceiver{

    @Override
    public void onReceive(final Context context, Intent intent){
        // TODO Auto-generated method stub

        PhoneStateListener phoneStateListener = new PhoneStateListener(){
            @Override
            public void onCallStateChanged(int state, String incomingNumber){
                if(state == TelephonyManager.CALL_STATE_RINGING){
                }
                else if(state == TelephonyManager.CALL_STATE_IDLE){

                    AudioManager audioManager = (AudioManager) context
                            .getSystemService(Context.AUDIO_SERVICE);

                    audioManager.setSpeakerphoneOn(false);
                }
                else if(state == TelephonyManager.CALL_STATE_OFFHOOK){

                    AudioManager audioManager = (AudioManager) context
                            .getSystemService(Context.AUDIO_SERVICE);
                    audioManager.setSpeakerphoneOn(true);
                }
                super.onCallStateChanged(state, incomingNumber);
            }
        };
        TelephonyManager mgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

        if(mgr != null){
            mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
        }
    }
}

如您所见,onReceive 会在需要时打开扬声器。

问题在于扬声器并不总是打开,而只是在用户第一次通话时打开。奇怪的是,如果用户在应用程序运行时拨打电话但不是通过我的应用程序正常工作,扬声器每次都会打开。 什么会导致这样的事情?

还有别的,即使应用程序没有运行,启动接收器的意图也会继续工作,所以当我拨打电话或接听电话时,它会打开扬声器,尽管应用程序甚至没有运行。

【问题讨论】:

    标签: java android broadcastreceiver telephonymanager android-audiomanager


    【解决方案1】:

    好的,所以我开始工作了。

    我已更改意图过滤器,因此它只有一个操作

     <action android:name="android.intent.action.PHONE_STATE" />
    

    当 TelephonyManager 处于摘机状态时,我设置了 audioManager 模式

    audioManager.setMode(AudioManager.MODE_IN_CALL);
    

    就在打开扬声器之前,它可以工作。

    更新

    所以当应用程序没有运行时它仍然可以工作,但后来我发现了这个问题My Broadcast receiver get execute even if my application is not working 我意识到我应该在我的主要活动中注册接收器并在活动的 onDestroy 中取消注册。

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多