35

从昨天开始,当我收到推送通知时,我在 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 引发

我在两个不同的应用程序中遇到了这个问题,我从不修改代码

4

3 回答 3

41

我在 Jelly Bean 4.1.2 中遇到了同样的异常,然后按照我为解决这个问题所做的更改

1.在清单文件中添加权限。

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

2.Try-Catch 覆盖的Notification 撰写

 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();
    }
于 2014-01-03T07:13:52.357 回答
31

由于此错误仅发生在 Android 4.2 和 4.3 上,您可以将其用作解决方法(即包括 maxSdkVersion):

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

注意:maxSdkVersion 属性仅在 API 级别 19 中添加,幸运的是,这正是我们想要的最小值!理论上,我们可以设置任何值 <= 18 来获得相同的效果,但这会很糟糕。

于 2015-03-14T05:47:39.097 回答
26

由于通知振动策略的变化,这是 Android 4.2 中的一个错误;4.2.1 中的此更改修复了权限错误。

于 2012-12-05T04:39:57.853 回答