2010-11-26 15 views
1

我註冊了一個BroadcastReceiver來接收SystemService中的SMS,但是我們沒有「android.permission.RECEIVE_SMS」的許可。那麼如何在android框架中使用權限呢?在SystemService中,它的上下文是從ActivityManagerService.main()獲取的。如何使用android框架內的權限?

public void setWindowManager(WindowManagerService wm) { 
    mWindowManager = wm; 
} 

public static final Context main(int factoryTest) { 
    AThread thr = new AThread(); 
    thr.start(); 

    synchronized (thr) { 
     while (thr.mService == null) { 
      try { 
       thr.wait(); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

    ActivityManagerService m = thr.mService; 
    mSelf = m; 
    ActivityThread at = ActivityThread.systemMain(); 
    mSystemThread = at; 
    Context context = at.getSystemContext(); 
    m.mContext = context; 
    m.mFactoryTest = factoryTest; 
    PowerManager pm = 
     (PowerManager)context.getSystemService(Context.POWER_SERVICE); 
    m.mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 
    m.mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 
    m.mLaunchingActivity.setReferenceCounted(false); 

    m.mBatteryStatsService.publish(context); 
    m.mUsageStatsService.publish(context); 

    synchronized (thr) { 
     thr.mReady = true; 
     thr.notifyAll(); 
    } 

    m.startRunning(null, null, null, null); 

    return context; 
} 

回答

0

Declare the permissions你需要在你的應用程序的AndroidManifest.xml

該權限實際上是從文檔的具體例子(連同其他有益的東西,如果你search吧):

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.app.myapp" > 

    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 

</manifest> 
+0

SystemService在android框架中運行,其上下文是系統上下文。並沒有一個AndroidManifest.xml – Yong 2010-11-27 15:51:39

0

這也許是錯誤的方式去任何你正在嘗試做的。

與從外部世界切入新的「門道」成爲系統的核心部分相比,向SDK應用程序可以使用的系統添加新接口可能更好,然後編寫SDK應用程序它接收短信並可以使用這個新界面來完成某件事情。

0

如果系統服務正確實施,則不需要聲明權限。

1

你可以嘗試做如下:

private static final String ANDROID_PERMISSION_RECEIVE_SMS = "android.permission.RECEIVE_SMS"; 

public void setUpPermissions() { 
    PermissionInfo permissionInfo = new PermissionInfo(); 
    permissionInfo.name = ANDROID_PERMISSION_RECEIVE_SMS; 
    getContext().getPackageManager().addPermission(permissionInfo); 
} 
5

您可以在AndroidManifest.xml中添加此權限放置在框架/基/核心/ RES

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
1

我們有同樣的問題,試圖找到從另一個系統服務訪問權限保護系統服務的最佳方式。

在這種情況下,解決方案通常已經在Android代碼中,例如在frameworks/base/services/java/com/android/server/NotificationManagerService.java中查看,它使用的是VibratorService.java包。

你可以看到調用結構是這樣的:

long identity = Binder.clearCallingIdentity(); 
try { 
    mVibrator.cancel(); 
} 
finally { 
    Binder.restoreCallingIdentity(identity); 
} 

按照docs clearCallingIdentity()正是你所需要的:

塊引用 復位輸入的身份IPC在當前線程上。如果在處理傳入呼叫時,您將調用其他對象的接口,這些接口可能對您的進程是本地的,並且需要對進入它們的呼叫進行權限檢查(以便他們將檢查您自己的權限本地進程,而不是最初稱爲你的進程)。