2010-11-26 6 views
1

J'enregistre un BroadcastReceiver pour recevoir des SMS dans un SystemService, mais nous n'avons pas la permission "android.permission.RECEIVE_SMS". Alors, comment utiliser la permission dans le cadre android? Dans SystemService, son contexte provient de ActivityManagerService.main().Comment utiliser la permission dans le cadre 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; 
} 

Répondre

0

Declare the permissions vous aurez besoin dans votre application de AndroidManifest.xml.

Cette autorisation est en fait dans l'exemple exact de la documentation (ainsi que d'autres choses utiles si vous search pour elle):

<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

Le SystemService s'exécute dans le cadre android, dont le contexte est le contexte système. Et il n'y a pas un AndroidManifest.xml – Yong

+0

Il y en a probablement un quelque part, mais pas à la place d'une application sdk. –

+0

Hm ouais j'ai mal compris ce que vous demandiez. Avez-vous essayé de fouiller dans la source pour comprendre comment les autres services "système" qui ont besoin d'autorisations les obtiennent? Même l'application MMS d'Android utilise uniquement un service normal avec des autorisations dans le manifeste. Voir cet article de Diane Hackborn: http://groups.google.com/group/android-porting/browse_thread/thread/f9a383ce949d1557 –

0

C'est peut-être la mauvaise façon de s'y prendre tout ce que vous essayez de faire . Plutôt que de couper une nouvelle "porte" du monde extérieur dans une partie centrale du système, il pourrait être une meilleure idée d'ajouter une nouvelle interface au système que les applications SDK peuvent utiliser, puis écrire une application SDK qui reçoit des SMS et peut utiliser cette nouvelle interface pour accomplir quelque chose.

0

Vous n'avez pas besoin de déclarer une autorisation si votre service système est implémenté correctement.

1

Vous pouvez essayer de faire ce qui suit:

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

Vous pouvez ajouter cette autorisation dans AndroidManifest.xml placé à des cadres/base/core/res

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

Nous avons eu le même problème et essayé de trouver le meilleur moyen d'accéder à un service système protégé par une autorisation à partir d'un autre service système.

Dans ce cas, la solution est généralement déjà dans le code Android, par exemple jeter un oeil dans frameworks/base/services/java/com/android/server/NotificationManagerService.java qui utilise le VibratorService.java de la même paquet.

Vous pouvez voir que la structure d'appel est quelque chose comme ceci:

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

Selon le docs clearCallingIdentity() est exactement ce dont vous avez besoin:

Blockquote Réinitialiser l'identité de l'entrée IPC sur le thread actuel. Cela peut être utile si, lors de la gestion d'un appel entrant, vous appelez des interfaces d'autres objets qui peuvent être locaux à votre processus et devez effectuer des vérifications d'autorisation sur les appels entrants (afin qu'ils vérifient la permission de votre propre processus local, et non pas le processus qui vous a appelé à l'origine).

Questions connexes