2013-07-13 3 views
3

휴대 전화 네트워크 상태를 제어하는 ​​앱을 만들고 있습니다 (2G/3G 간 전환).권한 거부 : getIntentSender() : uid = 1001, (필요 uid = 1000)

내 응용 프로그램은 sharedUserId = "android.uid.system"을 사용하지만 전화의 컨텍스트에서 실행됩니다 (예 : android : process = "com.android.phone") 시작했을 때까지 제대로 작동했습니다. AlarmManager를 사용합니다.

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 
을 (물론 프로세스 com.android.phone의 컨텍스트에서 실행) 내 서비스의에서 onCreate() 내부

은 다음 함수는 예외를 제공합니다

AlarmReceiver는 동일한 컨텍스트를 가진 내 서비스의 개인 클래스입니다.

나는 인터넷과이 사이트에서 물론 검색했지만 해결책을 찾을 수 없습니다.

당신이 매니페스트에 <receiver>을 추가했다 :

답변

0

이 질문에

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

편집에 대한 링크를 돕는?

좋아 :

 <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에 있기 때문에 다른 방식으로 해결했습니다. 숨겨진 내부 Android SDK 기능에 액세스하기 위해 ADT를 해킹했습니다. 이제 Phone 객체를 가져 오기 위해 리플렉션을 사용할 필요가 없으며 함수와 객체를 직접 사용합니다. Android.uid.system은 더 이상 UID를 공유 할 필요가 없으므로 android.uid.phone으로 변경했습니다. 이제 내 응용 프로그램은 모든 UID가 동일하고 AlarmManager로 잘 작동합니다. – Saar

+0

이것은 Eclipse에 숨겨진/내부 Android SDK를 추가하는 방법을 안내합니다. https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/ – Saar