取消静音后,只有来电会震动,无法播放铃声

时间:2018-10-29 15:31:03

标签: android broadcastreceiver android-broadcast android-audiomanager phone-state-listener

我正在构建一个Android应用,当手机中出现来电时,该手机取消静音

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

并且希望电话会振动并播放铃声

但是只有手机振动,尽管手机铃声设置为最大声音,但无法播放铃声

我发现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);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

isVolumeFixed()

此方法在此类设备上将返回true。

答案 1 :(得分:1)

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

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();

        }
    }
}

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