web-dev-qa-db-ja.com

java.lang.SecurityException:Jelly Bean 4.2に対するVIBRATE権限が必要

昨日以来、私はAndroid 4.2で問題を抱えています。プッシュ通知を受け取ると、振動するように設定していなくても、許可が必要です

Notification notification = new Notification(icon, notificationItem.message, when);
notification.setLatestEventInfo(context, "App", notificationItem.message,
            PendingIntent.getActivity(context, 0, intent, 0));
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;

NotificationManager nm =
            (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(notificationItem.notificationID, notification);

例外はnm.notifyによって発生します

2つの異なるアプリでこの問題が発生し、コードを変更することはありません

34
Ste

これは、通知振動ポリシーの変更によるAndroid 4.2のバグでした。権限のバグは、4.2.1の この変更 で修正されました。

25
dsandler

Jelly Bean 4.1.2でも同じ例外が発生しましたその後、これを解決するために行った変更に従います

1.マニフェストファイルに権限を追加しました。

 <uses-permission
 Android:name="Android.permission.VIBRATE"></uses-permission>

2.Try-Catchの対象となる通知の作成

 try
    {
        mNotificationManager = (NotificationManager)          
        this.getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                        this)
                .setSmallIcon(R.drawable.ic_notif_alert)
                .setContentTitle(getResources().getString(R.string.app_name))
                .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                .setContentText(msg)
                .setStyle(bigTextStyle)
                .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
            mBuilder.setAutoCancel(true);
            mBuilder.setContentIntent(contentIntent);
            mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
            Log.d(TAG, "---- Notification Composed ----");
    }
    catch(SecurityException se)
    {
        se.printStackTrace();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
41
swiftBoy

このバグはAndroid 4.2および4.3でのみ発生するため、これを回避策として使用できます(つまり、maxSdkVersionを含めます)。

<uses-permission Android:name="Android.permission.VIBRATE" Android:maxSdkVersion="18"/>

注:maxSdkVersion属性はAPIレベル19でのみ追加されました。この場合、幸いなことに、これは必要な最小値です。理論的には、18以下の任意の値を設定して同じ効果を得ることができますが、それは厄介です。

30
Mark