我正在构建一个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);
}
}
}
答案 0 :(得分:1)
答案 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实例。我启动了一项后台服务来解决此问题,因此我可以保留对上下文的单个引用,从而对铃声进行单个引用。