2013-07-13 60 views
3

我正在制作一个控制电话网络状态的应用程序(在2G/3G之间切换)。权限拒绝:getIntentSender():uid = 1001,(需要uid = 1000)

出于某种原因,我的应用程序使用sharedUserId =“android.uid.system”,但运行在手机上下文(即android:process =“com.android.phone”) 一切正常,直到我已经开始使用AlarmManager。

里面我服务的onCreate()(它在运行过程中的过程com.android.phone的上下文中),下面的函数给出了异常:

pi = PendingIntent.getBroadcast(this, 0, new Intent(this, AlarmReceiver.class), 0); 

我得到这个错误:

E/AndroidRuntime(21289): Caused by: java.lang.SecurityException: Permission Denial: getIntentSender() from pid=21289, uid=1001, (need uid=1000) is not allowed to send as package com.net_toggle 

AlarmReceiver是我的服务的私有类,它具有相同的上下文。

我在互联网和本网站当然搜索,但无法找到解决方案。

回答

0

帮助对于这个问题

https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

编辑链接:

没有你添加<receiver>到您的清单?

喜欢:

 <receiver android:name="MyScheduleReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
    <receiver android:name="MyStartServiceReceiver" > 
    </receiver> 

,也许可:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
+0

好啊好啊,请比分享您的代码可以帮助一些其他国家的人民! –

+0

我怀疑问题是在BOOT_COMPLETED意图接收。因为问题存在于不一致的UID中,但我通过其他方式解决了问题。我侵入了ADT以访问所有隐藏的和内部的Android SDK功能。现在我不需要使用反射来获得Phone对象,而是直接使用函数和对象。因为我不再需要android.uid.system共享的UID,所以我将它改为android.uid.phone,我的应用程序现在在任何地方都有相同的UID,并且可以很好地与AlarmManager配合使用。 – Saar

+0

这是如何将隐藏/内部Android SDK添加到Eclipse的指南:https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/ – Saar