【问题标题】:java.lang.SecurityException: Requires VIBRATE permission on Jelly Bean 4.2java.lang.SecurityException:需要 Jelly Bean 4.2 的 VIBRATE 权限
【发布时间】:2012-11-16 03:12:57
【问题描述】:

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

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

【问题讨论】:

  • 有什么异常或问题? .尝试在 Manifest 中使用权限。
  • 我不想那样做,我不想让通知振动,正如你所看到的,我没有将其设置为默认值,它只发生在 Android 4.2 上跨度>
  • 有同样的问题。这确实是 4.2 所需的新权限 - 就我而言,我现在将简单地添加振动权限,但您是对的,在您的情况下不需要它。我会提出一个问题....
  • @Ste - 刚刚从市场收到一份崩溃报告,其中发生了 SGS4 (4.3)。我也没有设置振动。
  • 另外,到目前为止还没有报告。很奇怪。

标签: android notifications push android-4.2-jelly-bean


【解决方案1】:

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

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

注意:maxSdkVersion 属性仅在 API 级别 19 中添加,幸运的是,这正是我们想要的最小值!理论上,我们可以设置任何值

【讨论】:

  • 您能否确认上述android:maxSdkVersion="18" attr 声明将允许在没有振动器的设备上安装应用程序?因为只有&lt;uses-permission android:name="android.permission.VIBRATE" /&gt; 导致应用程序(更新)不可用
  • 对不起,我不知道。
  • @snachmsm 你有没有检查过这个修复程序是否适用于没有振动的设备?
  • 我不知道,但就允许安装而言,我相信只有使用功能(而不是使用权限)会影响。
  • @Sorin 我正在确认 Marks 评论,修复工作,因为它使用 uses-permission,而不是 uses-feature
【解决方案2】:

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

【讨论】:

  • 不是 1 或 2 足以解决此问题。我只喜欢 1,如果您的用户可以接受一点权限蠕变。
  • @Diederik 看到我分享的答案是在我眼中处理此问题的最佳实践,这取决于您想要怎么做,无论 1 还是 2,app 应该可以工作在所有设备上都是需要的
  • 我认为解决方案1(在AndroidManifest.xml文件中添加权限)应该足够了
【解决方案3】:

这是 Android 4.2 中的一个错误,原因是通知振动策略发生了变化;权限错误已由this change 在 4.2.1 中修复。

【讨论】:

  • 刚从市场上得到一份崩溃报告,那里发生了 SGS4 (4.3)。我也不设置振动。
  • 同样的事情,它似乎也没有固定在 4.3 上。
猜你喜欢
  • 2022-07-06
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2017-06-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多