Включение динамика не всегда работает

Я делаю приложение, в котором пользователь может звонить своим любимым контактам через мое приложение. При начале разговора включается динамик. Чтобы позвонить, я использую этот Intent.

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

И когда есть исходящий вызов, есть намерение, которое запускает BroadcastReceiver

    <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 включает динамик, когда это необходимо.

Проблема в том, что динамик включается не всегда, а только при первом звонке пользователя. Странно то, что если пользователь звонит во время работы приложения, но не через мое приложение, оно работает правильно, динамик включается каждый раз. Что может вызвать подобное?

И еще кое-что, даже когда приложение не запущено, как будто интент, который запускает приемник, продолжает работать, поэтому, когда я звоню или получаю звонки, он крутит динамик, хотя приложение даже не запущено.


person Raz    schedule 24.02.2013    source источник


Ответы (1)


Итак, я получил его на работу.

Я изменил фильтр намерений, чтобы он имел только одно действие.

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

и когда TelephonyManager находится в состоянии Offhook, я устанавливаю режим audioManager

audioManager.setMode(AudioManager.MODE_IN_CALL);

прямо перед включением динамика, и он работает.

Обновлять

Так что все еще работало, когда приложение не работало, но потом я нашел этот вопрос Мой широковещательный приемник выполняется, даже если мое приложение не работает, и я понял, что должен зарегистрировать приемник в своем основном действии и отменить его регистрацию в действии onDestroy.

person Raz    schedule 25.02.2013