2015-05-05 75 views
1

我有這種情況:權限拒絕:從null(pid = -1,uid = 10221)未從uid導出的啓動意向

服務正在運行。該服務有一個定時器,定期對服務器進行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"可以解決這個問題,但我我不願意使用它,因爲在我的情況下顯然不是這個意圖。

我認爲這可能是-1在pid中......但我不知道爲什麼是-1以及如何解決它。

任何人都可以幫助我嗎?

謝謝。

+1

請嘗試完全卸載並重新安裝應用程序。順便說一句,你可以擺脫'synchronized(notif)' - 沒有其他線程可以訪問該局部變量,所以你不會同步任何東西。 – CommonsWare

+0

已經卸載應用程序並重新安裝,同樣的問題。感謝您對同步的建議,如果我能夠讓應用程序再次運行,我會做到這一點。 – Fustigador

回答

0

我得到了同樣的問題,這是Kitkat的問題,我從here得到workround解決方案。你可以這樣試試:

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

它適合我,希望有用。

相關問題