取消静音后 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);
}
}
}
有些设备可能没有音量控制,可能会以固定音量运行,并且可能无法启用静音或更改音频流的音量。
此方法在此类设备上 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 实例。我启动了一个后台服务来解决这个问题,这样我就可以保存对上下文的单个引用,从而保存对铃声的单个引用。
我正在构建一个 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);
}
}
}
有些设备可能没有音量控制,可能会以固定音量运行,并且可能无法启用静音或更改音频流的音量。
此方法在此类设备上 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 实例。我启动了一个后台服务来解决这个问题,这样我就可以保存对上下文的单个引用,从而保存对铃声的单个引用。