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引发exception

我有两个不同的应用程序中的这个问题,我从来没有修改代码

这是Android 4.2中的一个错误,因为通知振动策略发生了变化; 4.2.1中的更改修改了权限错误。

我在果冻豆4.1.2中得到了同样的exception, 然后我做了解决这个更改

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(); } 

由于这个错误只发生在Android 4.2和4.3上,所以你可以使用它作为解决方法(即包含maxSdkVersion):

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

注意:maxSdkVersion属性只是在API级别19中添加的,在这种情况下,幸运地是我们想要的最小值! 理论上我们可以把任何值<= 18来得到相同的效果,但那会很讨厌的。