Android 7 (Nougat)以降で、RINGER_MODE_VIBRATE(マナーモード)へ切り替えようとするとクラッシュ

久々に Google Play へ登録したアプリを更新しようとしたら、targetSdkVersion は 26 以上、2019/11/1以降は 28 以上じゃないとアップできねーとか表示されて、ターゲットをあげた途端に色々動作しなくなったり強制終了するようになったのメモ

Android 7 (Nougat)以降で、RINGER_MODE_VIBRATE(マナーモード)へ切り替えようとすると値が AudioManager.RINGER_MODE_VIBRATE (値=1) の時のみエラーが発生
AudioManager AudioMan = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
AudioMan.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); // ←バイブレートはNG
//
AudioMan.setRingerMode(AudioManager.RINGER_MODE_SILENT);  // ←サイレントはOK
どうも、バイブレートへ切り替えるのに権限と確認が必要になったらしい

マニフェストへ
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
を加えて
モード変更の手前で、権限が得られていない場合に設定画面を表示させる記述を入れる
// Android7 以降 マナーモードへの権限設定(初回は設定画面が開く)
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !notificationManager.isNotificationPolicyAccessGranted()) {
    Intent setupIntent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
    startActivity(setupIntent);
}

// モード変更
AudioManager AudioMan = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
AudioMan.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);

コメント