Android 权限拒绝:未从uid导出从null(pid=-1,uid=10221)启动意图

Android 权限拒绝:未从uid导出从null(pid=-1,uid=10221)启动意图,android,android-intent,Android,Android Intent,我有这样一个场景: 服务正在运行。此服务有一个计时器,它定期对服务器执行http调用以搜索数据。该数据已由其他用户存储在数据库中。当该数据可用时,将解析来自服务器的答案,并显示通知。当用户点击通知时,将启动一个活动…直到昨天。我使用的是Eclipse,它是接收数据的用户的真实设备,也是发送数据的用户的虚拟设备 当用户点击通知时,活动没有启动,这很奇怪,因为正如我所说,它一直工作到昨天。在Logcat中,我有以下内容: 05-05 23:12:36.841: W/ActivityManager(1

我有这样一个场景:

服务正在运行。此服务有一个计时器,它定期对服务器执行http调用以搜索数据。该数据已由其他用户存储在数据库中。当该数据可用时,将解析来自服务器的答案,并显示通知。当用户点击通知时,将启动一个活动…直到昨天。我使用的是Eclipse,它是接收数据的用户的真实设备,也是发送数据的用户的虚拟设备

当用户点击通知时,活动没有启动,这很奇怪,因为正如我所说,它一直工作到昨天。在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=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();
                            }
我已经读到在清单文件的活动声明中添加
android:exported=“true”
可以解决这个问题,但我不愿意使用它,因为这显然不是我的预期用途

我想可能是pid中的-1…但我不知道为什么是-1以及如何解决它

谁能帮我一下吗


谢谢。

我遇到了同样的问题,这是Kitkat的问题,我从中得到了解决方案。您可以这样尝试:

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

它对我很有用。

尝试完全卸载并重新安装该应用程序。顺便说一句,你可以摆脱
已同步(notif)
——没有其他线程可以访问该局部变量,因此你将不会同步任何内容。已卸载该应用程序并重新安装,同样的问题。感谢您对同步应用程序的建议,如果我能够让应用程序再次运行,我会这样做。