Android 取消静音后手机来电时只震动手机,无法播放铃声

Android 取消静音后手机来电时只震动手机,无法播放铃声,android,broadcastreceiver,android-broadcast,android-audiomanager,phone-state-listener,Android,Broadcastreceiver,Android Broadcast,Android Audiomanager,Phone State Listener,我正在构建一个Android应用程序,当手机中有来电时,取消手机静音 我使用BroadcastReceiver接收来电事件。当BroadcastReceiver接收来电事件时,我将手机从静音模式切换到铃声模式 希望手机能振动并播放铃声 但手机只会振动,,无法播放铃声,尽管手机铃声设置为“最大声音” 我在play store上发现了许多应用程序,它们可以在通话前取消静音,播放铃声并同时振动。例如: 我的代码如下: public void onReceive(Context context, Int

我正在构建一个Android应用程序,当手机中有来电时,取消手机静音

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

希望手机能振动并播放铃声

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

我在play store上发现了许多应用程序,它们可以在通话前取消静音,播放铃声并同时振动。例如:

我的代码如下:

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

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


这种方法在这样的设备上会返回true。

我正在做一些非常类似的工作。您实际上必须在覆盖音频设置后播放铃声。但你只需要在安卓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时提供不同的上下文,并每次创建不同的铃声实例。我启动了一个后台服务来解决这个问题,这样我就可以保存一个对上下文的引用,从而保存一个对铃声的引用。

您正在哪个设备上尝试此操作?还提到android设备版本我尝试支持android API 19-28,我在API 21和23上测试。谢谢你的回复。但这不是我的问题解决方案,我已经找到了我的解决方案。@HasibAkter你能发布你的解决方案并将其标记为已解决以帮助他人吗?是的,我已经解决了这个问题。但你绝对是对的。我也使用服务来停止铃声。我在安卓6.0中测试了这个功能,效果非常好。你确定这在6.0以下不起作用吗?它在android 6.0以下起作用,但我不需要创建铃声并在6.0以下的版本中播放。对于我的案例来说,更换音频管理器已经足够了。我知道你们已经解决了,但若这是正确的,你们能接受并奖励赏金吗?你们告诉过你们已经完成了类似的项目。你有时间谈谈这个项目的其他事情吗?如果你很忙,那没关系,兄弟。对于
请勿打扰
模式,你是如何处理的?对于更改
请勿干扰
到任何其他模式,应用程序已崩溃。虽然我不是在努力寻找,而是在计划找到解决方案。但是如果你能帮我的话,那会节省我的时间。我这一周会有一些时间来讨论我所做的事情。我会在推特上给你发条信息,我们可以从那里开始。听起来不错吧?