取消静音后 phone 来电时只有振动 phone,无法播放铃声

After Unmute phone when call came only vibrate phone, not able to play ringtone

我正在构建一个 Android 应用程序,当来电取消静音phone phone.

我使用BroadcastReceiver接收来电事件。当 BroadcastReceiver 接收时,我 phone 从 静音模式 切换到 响铃模式 来电事件.

预计 Phone 会 振动并播放铃声

但是Phone只能振动无法播放铃声phone铃声设置为最大声音 .

我在 Play 商店发现许多应用程序可以在通话前取消静音并播放铃声和振动。示例:One App Link

我的代码如下:

public void onReceive(Context context, Intent intent) {
    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);

    if (intent.getAction()!=null && intent.getAction().equals("android.intent.action.PHONE_STATE")){

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){

            audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
            audioManager.setStreamVolume(AudioManager.STREAM_RING, maxVolume/2, AudioManager.FLAG_PLAY_SOUND);
        }
    }
}

有些设备可能没有音量控制,可能会以固定音量运行,并且可能无法启用静音或更改音频流的音量。

isVolumeFixed()

此方法在此类设备上 return 正确。

我正在做一些非常相似的事情。实际上,您必须在覆盖音频设置后播放铃声。但是您只需要在 Android 6.0+ 上执行此操作获取铃声实例并在 phone 状态响起时播放它,否则就停止它。

public void onReceive(Context context, Intent intent) {
    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);

    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
    Ringtone r = RingtoneManager.getRingtone(context, uri);

    if (intent.getAction()!=null && intent.getAction().equals("android.intent.action.PHONE_STATE")){

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){

        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        audioManager.setStreamVolume(AudioManager.STREAM_RING, maxVolume/2, AudioManager.FLAG_PLAY_SOUND);

        r.play();

        }else {

        r.stop();

        }
    }
}

您将 运行 遇到此实现的问题。您将播放多个铃声,因为在 Phone 状态更改期间多次调用 onReceive 方法。每次调用 onReceive 时都会提供不同的上下文,并且每次都会创建不同的 Ringtone 实例。我启动了一个后台服务来解决这个问题,这样我就可以保存对上下文的单个引用,从而保存对铃声的单个引用。