2

AudioManager は onCallStateChanged では信頼できません。通話中に、スピーカーフォンをオンにして音量を最大に設定する必要があります。スピーカーフォンをオンにすることがあり (通常は 2 回目以降の通話中)、音量を上げることはめったにありません。私の PhoneCallListener クラスは、私の MainActivity クラス内にあります。

private class PhoneCallListener extends PhoneStateListener
{
    private boolean isPhoneCalling = false;

    @Override
    public void onCallStateChanged(int state, String incomingNumber)
    {
        AudioManager aM = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        aM.setMode(AudioManager.MODE_IN_CALL);
        aM.setSpeakerphoneOn(true);

        if(TelephonyManager.CALL_STATE_RINGING == state)
        {
            //phone ringing
            aM.setSpeakerphoneOn(true);
            aM.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
        }

        if(TelephonyManager.CALL_STATE_OFFHOOK == state)
        {
            //phone active
            aM.setSpeakerphoneOn(true);
            aM.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, 0);
            isPhoneCalling = true;
        }

        if(TelephonyManager.CALL_STATE_IDLE == state)
        {
            aM.setSpeakerphoneOn(false);

            if(isPhoneCalling)
            {               
                Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                isPhoneCalling = false;
            }
        }
    }
}

CALL_STATE_OFFHOOK 内で AudioManager.FLAG_SHOW_UI をオフにする必要がありました。これは、ボリューム UI が継続的に表示されるためです。また、aM.setStreamVolume(AudioManager.STREAM_MUSIC, aM.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); を設定します。何らかの理由でアプリがクラッシュします。

通話中にスピーカーフォンがオンになり、音量が最大になるように、AudioManager を毎回動作させる方法に関する提案はありますか?


編集: onCallStateChanged メソッドが呼び出されるとすぐに speackphoneon を true に設定しても、スピーカーフォンを確実にオンにすることはできません。音量も信頼できず、クラッシュせずに最大に設定できないようです.

4

1 に答える 1

0

以下は、これを行うコードです。ロリポップを実行している電話でテストしました。PhoneStateListener を次のように記述します。

  private class myPhoneStateListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);

        switch (state) {

            case TelephonyManager.CALL_STATE_OFFHOOK: //Call is established
                Log.d("s@urav", "Call is Offhook now!");
                try {
                    Thread.sleep(500); //We never know when the call is actually OffHook
                } catch (InterruptedException e) {
                Log.d("s@urav","Exception is:"+e);
                }
                audioManager.setSpeakerphoneOn(true);
                break;

            case TelephonyManager.CALL_STATE_IDLE: //Call is finished
                    //Maintain a flag and do this only if speakerphone has been set on OFFHOOK
                    /*audioManager.setMode(AudioManager.MODE_NORMAL);
                    audioManager.setSpeakerphoneOn(false);*/
                break;
        }
    }
}

通話の音量を上げるには、STREAM_VOICE_CALL の音量を上げる必要があります。このコード + 通話ストリームの量を増やすと、要件が満たされます。

于 2016-06-01T13:05:43.963 に答える