切换手机铃声模式时Android应用崩溃问题求助
解决Android铃声模式切换崩溃问题
嘿,我看了你的代码和崩溃日志,问题很明确——是权限处理逻辑搞反了,加上Android 6.0及以上版本修改静音/响铃模式需要特定权限,才导致的崩溃。振动模式正常是因为它不需要这个权限,咱们一步步修复:
1. 修正NotificationManager的权限判断逻辑
你在onCreate里的权限判断完全写反了!现在的代码是已经有权限的时候跳转到设置页面,这完全不对,应该是没有权限的时候才引导用户去开启权限。而且你还在方法里重新声明了局部变量notificationManager,覆盖了成员变量,这也会导致后续权限检查失效。
把原代码:
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if(notificationManager.isNotificationPolicyAccessGranted()) { Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS); startActivity(intent); }
改成:
// 使用成员变量,不要重新声明 notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // 没有权限时才跳转到设置页面 if(!notificationManager.isNotificationPolicyAccessGranted()) { Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS); startActivity(intent); }
2. 在Manifest中添加必要权限
在AndroidManifest.xml里添加这两个权限,Android 6.0+修改铃声模式(静音/响铃)需要ACCESS_NOTIFICATION_POLICY,振动需要VIBRATE:
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> <uses-permission android:name="android.permission.VIBRATE" />
3. 给切换方法添加权限检查(可选但更安全)
为了避免用户拒绝权限后操作崩溃,建议在onSilent和onRing方法里先检查权限,再执行模式切换:
比如修改onSilent:
public void onSilent(View v) { if(notificationManager.isNotificationPolicyAccessGranted()) { myAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); Toast.makeText(this,"Now in Silent Mode",Toast.LENGTH_LONG).show(); } else { Toast.makeText(this,"请先授予通知权限",Toast.LENGTH_LONG).show(); Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS); startActivity(intent); } }
同样给onRing方法加上相同的权限检查逻辑,这样用户操作时如果权限没开,会收到提示并跳转到设置页面,而不是直接崩溃。
为什么振动模式没问题?
因为设置RINGER_MODE_VIBRATE不需要ACCESS_NOTIFICATION_POLICY权限,只有切换到静音或者响铃模式时才需要这个权限,所以振动操作不会崩溃。
现在修改完这些,第一次打开App会自动跳转到权限设置页面,你手动允许后,切换铃声模式就不会崩溃啦!
内容的提问来源于stack exchange,提问作者maximus383




