2010-11-26 4 views
1

Ich registriere einen BroadcastReceiver, um SMS in einem SystemService zu empfangen, aber wir haben nicht die Berechtigung "android.permission.RECEIVE_SMS". So, wie man Erlaubnis innerhalb des Android-Rahmens verwendet? Im SystemService wird der Kontext von ActivityManagerService.main() abgerufen.Wie verwendet man die Berechtigung im Android-Framework?

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

Antwort

0

Declare the permissions Sie AndroidManifest.xml in Ihrer Anwendung benötigen.

Diese Erlaubnis ist eigentlich in dem genauen Beispiel aus der Dokumentation (zusammen mit anderen hilfreichen Dingen, wenn Sie search für sie):

<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

Der SystemService wird im Android-Framework ausgeführt, dessen Kontext der Systemkontext ist. Und es gibt kein AndroidManifest.xml – Yong

+0

Dort ist wahrscheinlich irgendwo, nur nicht an der Stelle, die es für eine SDK-App wäre. –

+0

Hm yeah Ich habe missverstanden was du verlangst. Haben Sie versucht, durch die Quelle zu stochern, um herauszufinden, wie andere "System" -Dienste, die Berechtigungen benötigen, sie bekommen? Sogar Androids eigene MMS-App verwendet nur einen normalen Dienst mit Berechtigungen im Manifest. Sieh diesen Beitrag von Diane Hackborn: http://groups.google.com/group/android-porting/browse_thread/thread/f9a383ce949d1557 –

0

Dies ist vielleicht der falsche Weg, um zu gehen, was Sie zu tun versuchen, .

Anstatt einen neuen "Eingang" von der Außenwelt in einen Kern des Systems zu schneiden, ist es vielleicht eine bessere Idee, dem System eine neue Schnittstelle hinzuzufügen, die SDK-Apps verwenden können, und dann eine SDK-App zu schreiben welches SMS empfängt und diese neue Schnittstelle benutzen kann, um etwas zu erreichen.

0

Sie müssen die Berechtigung nicht deklarieren, wenn Ihr Systemdienst korrekt implementiert ist.

1

Sie können versuchen, die folgendes zu tun:

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

Sie diese Berechtigung in AndroidManifest.xml hinzufügen können Frameworks/base/Kern platziert/res

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

Wir hatten das gleiche Problem und versuchte, den besten Weg zu finden, um von einem anderen Systemdienst auf einen berechtigungsgeschützten Systemdienst zuzugreifen.

In diesem Fall ist die Lösung in der Regel bereits im Android-Code, zum Beispiel in frameworks/base/services/java/com/android/server/NotificationManagerService.java, die den VibratorService.java aus dem gleichen verwendet Paket.

können Sie sehen, dass der anrufende Struktur so etwas wie dieses:

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

Nach dem docs clearCallingIdentity() ist genau das, was Sie brauchen:

Blockquote Setzen Sie die Identität des eingehenden IPC auf dem aktuellen Thread. Dies kann nützlich sein, wenn Sie während der Bearbeitung eines eingehenden Anrufs Schnittstellen anderer Objekte aufrufen, die sich lokal in Ihrem Prozess befinden, und Berechtigungsprüfungen für die eingehenden Anrufe durchführen müssen (damit diese die Berechtigung prüfen) lokaler Prozess, und nicht irgendein Prozess, der Sie ursprünglich genannt hat).

Verwandte Themen