我有这种情况:
服务正在运行。该服务有一个计时器,它定期对服务器进行 http 调用以搜索数据。该数据已被其他用户存储在数据库中。当该数据可用时,将解析来自服务器的答案,并显示通知。当用户点击通知时,将启动一个 Activity ......直到昨天。我正在使用 Eclipse,它是接收数据的用户的真实设备,以及发送数据的用户的虚拟设备。
当用户点击通知时,Activity 没有启动,这很奇怪,因为正如我所说,它一直工作到昨天。在 Logcat 中我有这个:
05-05 23:12:36.841: W/ActivityManager(1029): Permission Denial: starting Intent { cmp=my.package/.CalledFromNotificationActivity bnds=[0,538][540,632] (has extras) } from null (pid=-1, uid=10221) not exported from uid 10242
05-05 23:12:36.851: W/ActivityManager(1029): Unable to send startActivity intent
05-05 23:12:36.851: W/ActivityManager(1029): java.lang.SecurityException: Permission Denial: starting Intent { cmp=my.package/.CalledFromNotificationActivity bnds=[0,538][540,632] (has extras) } from null (pid=-1, uid=10221) not exported from uid 10242
05-05 23:12:36.851: W/ActivityManager(1029): at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1215)
05-05 23:12:36.851: W/ActivityManager(1029): at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:747)
05-05 23:12:36.851: W/ActivityManager(1029): at com.android.server.am.ActivityManagerService.startActivityInPackage(ActivityManagerService.java:3372)
05-05 23:12:36.851: W/ActivityManager(1029): at com.android.server.am.PendingIntentRecord.sendInner(PendingIntentRecord.java:252)
05-05 23:12:36.851: W/ActivityManager(1029): at com.android.server.am.PendingIntentRecord.send(PendingIntentRecord.java:192)
05-05 23:12:36.851: W/ActivityManager(1029): at android.content.IIntentSender$Stub.onTransact(IIntentSender.java:64)
05-05 23:12:36.851: W/ActivityManager(1029): at android.os.Binder.execTransact(Binder.java:404)
05-05 23:12:36.851: W/ActivityManager(1029): at dalvik.system.NativeStart.run(Native Method)
这是启动 Intent 的代码:
Intent intent=new Intent(c, CalledFromNotificationActivity.class);
Bundle bundle=new bundle();
bundle.setString("somedata", somedata);
intent.putExtras(bundle);
PendingIntent pIntent=PendingIntent.getActivity(c, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Builder notif = new NotificationCompat.Builder(c);
synchronized (notif) {
notif.setContentIntent(pIntent)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setWhen(System.currentTimeMillis())
.setTicker("Notification ticker")
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(getString(R.string.app_name))
.setContentText(getString(R.string.text))
.setAutoCancel(true);
Notification notification = notif.build();
//get instance of NotificationManager
NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationmanager.notify(0, notification);
timer.cancel();
}
我读到在 Manifest 文件的 Activity 声明中添加 android:exported="true"
可以解决它,但我不愿意使用它,因为显然不是预期的用途我的情况。
我认为可能是pid中的-1...但我不知道为什么是-1以及如何解决它。
谁能帮帮我?
谢谢。
最佳答案
我遇到了同样的问题,这是 Kitkat 的问题,我从 here 得到了解决方案.你可以这样尝试:
PendingIntent pIntent = PendingIntent.getActivity(c, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT == 19) {
contentIntent.cancel();
pIntent = PendingIntent.getActivity(c, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
对我有用,希望有用。
关于android - 权限拒绝 : starting Intent from null (pid=-1, uid=10221) 未从 uid 导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30063678/