【问题标题】:java.lang.SecurityException from NotificationManager?来自 NotificationManager 的 java.lang.SecurityException?
【发布时间】:2018-02-27 05:24:14
【问题描述】:

当游戏收到来自引擎的暂停/暂停调用时,我们在游戏中使用推送通知来通知用户某些游戏内事件。

我一直在查看来自 Google Developer Console 的崩溃日志,其中很大一部分是由使用推送通知的 SecurityException 引起的。

调用栈:

 java.lang.RuntimeException: 

  at android.app.ActivityThread.handleReceiver (ActivityThread.java:2697)
  at android.app.ActivityThread.access$1500 (ActivityThread.java:178)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1466)
  at android.os.Handler.dispatchMessage (Handler.java:107)
  at android.os.Looper.loop (Looper.java:194)
  at android.app.ActivityThread.main (ActivityThread.java:5560)
  at java.lang.reflect.Method.invokeNative (Native Method)
  at java.lang.reflect.Method.invoke (Method.java:525)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:844)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:611)
  at dalvik.system.NativeStart.main (Native Method)

Caused by: java.lang.SecurityException: 
  at android.os.Parcel.readException (Parcel.java:1425)
  at android.os.Parcel.readException (Parcel.java:1379)
  at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag (INotificationManager.java:239)
  at android.app.NotificationManager.notify (NotificationManager.java:132)
  at android.app.NotificationManager.notify (NotificationManager.java:108)
  at tinytitan.tinylib.NotificationPublisher.onReceive (NotificationPublisher.java:21)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:2690)

'tinytitan' 行来自我们的 Java 推送通知插件。源代码:

package tinytitan.tinylib;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class NotificationPublisher extends BroadcastReceiver {

    public static String NOTIFICATION_ID = "notification-id";
    public static String NOTIFICATION = "notification";

    /**
     * Called when the BroadcastReceiver is receiving an Intent
     */
    public void onReceive(Context context, Intent intent) {
        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = intent.getParcelableExtra(NOTIFICATION);
        int id = intent.getIntExtra(NOTIFICATION_ID, 0);
        notificationManager.notify(id, notification); // <-- LINE# 21
    }
}

这是清单文件(我们使用不同的插件有多种原因):

为什么会出现此异常以及如何解决?

编辑我尝试发布清单文件内容,但格式不允许我这样做,所以我去掉了尖括号。

uses-permission android:name="android.permission.INTERNET"
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
uses-permission android:name="com.android.vending.BILLING"
uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"
uses-permission android:name="android.permission.WAKE_LOCK"
uses-permission android:name="android.permission.VIBRATE"
uses-permission android:name="android.permission.GET_TASKS"
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
uses-permission android:name="com.android.vending.CHECK_LICENSE"
uses-permission android:name="android.permission.android.permission.READ_PHONE_STATE"
uses-permission android:name="android.permission.ACCESS_WIFI_STATE"

编辑:插件的其余代码:

/**
 * Shows a Notification with a delay
 */
public static void scheduleNotification(int id, long delayMs, String title, String message, boolean vibrate, boolean lightBlink, boolean sound, String largeImage, String smallImage)
{
    Notification notification = getNotification(title, message, vibrate, lightBlink, sound, smallImage, largeImage);

    Intent notificationIntent = new Intent(UnityPlayer.currentActivity, NotificationPublisher.class);
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, id);
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(UnityPlayer.currentActivity, id, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    long futureInMillis = SystemClock.elapsedRealtime() + delayMs;
    AlarmManager alarmManager = (AlarmManager)UnityPlayer.currentActivity.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
}

/**
 * Cancels a notification waiting to be added to the notification query or removes a notification
 * from the notification query.
 */
public static void cancelNotification(int id)
{
    //Remove it from the alarm manager (if present)
    AlarmManager am = (AlarmManager)UnityPlayer.currentActivity.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(UnityPlayer.currentActivity, NotificationPublisher.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(UnityPlayer.currentActivity, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.cancel(pendingIntent);

    //remove it from the notification query (if present)
    android.app.NotificationManager notificationManager = (android.app.NotificationManager)UnityPlayer.currentActivity.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.cancel(id);
}

/**
 * Removes all notifications that are in the notification query
 */
public static void clearAll(){
    android.app.NotificationManager notificationManager = (android.app.NotificationManager)UnityPlayer.currentActivity.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.cancelAll();
}

来自 C# 的调用:

    TinyAndroidServices.ScheduleNotification(id, delay, title, message, true, true, true, "app_icon", androidSmallIcon);

【问题讨论】:

  • 请在您的 mainfest 中分享权限
  • @Hala.M 完成。请检查我的编辑。
  • 您好,您找到解决方案了吗?我有相同的崩溃报告
  • @j2esu 还没有,我们只是暂时禁用了推送通知。
  • @vexe 你找到解决办法了吗?

标签: java android unity3d push-notification securityexception


【解决方案1】:

您应该使用此权限

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

不是这个:

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

【讨论】:

  • 感谢您的回复。我已经有那个权限了。我已编辑以包含我使用的权限。
  • 显示你的通知对象@vexe
  • 抱歉,我不确定您所说的“通知对象”是什么意思,我发布了插件代码的其余部分。也许您的意思是 getNotification 函数的结果?
  • READ_PHONE_STATE 与崩溃有何关系?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多