You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

切换手机铃声模式时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. 给切换方法添加权限检查(可选但更安全)

为了避免用户拒绝权限后操作崩溃,建议在onSilentonRing方法里先检查权限,再执行模式切换:

比如修改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

火山引擎 最新活动