java - 打开扬声器并不总是有效

标签 java android broadcastreceiver telephonymanager android-audiomanager

我正在制作一个应用程序,用户可以通过我的应用程序调用他最喜欢的联系人。 当通话开始时,扬声器打开。 为了调用电话,我使用此 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 会在需要时打开扬声器。

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

还有其他的事情,即使应用程序没有运行,启动接收器的 Intent 也会继续工作,所以当我调用电话或接到电话时,它会打开扬声器,尽管应用程序甚至没有运行。

最佳答案

好的,我已经开始工作了。

我更改了 Intent 过滤器,因此它只有一个操作

 <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 我意识到我应该在我的主要 Activity 中注册接收器并在 Activity 的 onDestroy 中取消注册它。

关于java - 打开扬声器并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15053107/

相关文章:

java - 从固定选项卡中删除滑动操作

android - 单击另一个 Activity 的按钮时调用检查互联网连接类

java - 生成的 html 显示 ?而不是国际字符

java - 泄露并发布 YouTubeThumbnailLoaders

java - 尝试在比赛后删除最多 2 位数字

android - 无法以编程方式选择 tableRow 的子项(textview)

Java实体表模型

java - 负数组大小异常 -1

android - 滑动清除应用程序时广播接收器停止触发

Android - 如何检测拨出电话是否已接听或已接听?