如何在android框架内使用权限?

时间:2010-11-26 16:19:13

标签: android permissions

我注册了一个BroadcastReceiver来接收SystemService中的SMS,但我们没有权限“android.permission.RECEIVE_SMS”。那么如何在android框架内使用权限?在SystemService中,它的上下文来自ActivityManagerService.main()。

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

6 个答案:

答案 0 :(得分:5)

您可以在位于frameworks / base / core / res

的AndroidManifest.xml中添加此权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />

答案 1 :(得分: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);
}

答案 2 :(得分:1)

我们遇到了同样的问题,并试图找到从另一个系统服务访问受权限保护的系统服务的最佳方法。

在这种情况下,解决方案通常已经在Android代码中了,例如看一下框架/ base / services / java / com / android / server / NotificationManagerService.java,它使用同一个包中的VibratorService.java

你可以看到调用结构是这样的:

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

根据docs clearCallingIdentity()正是您所需要的:

  

块引用   重置当前线程上传入IPC的标识。如果在处理来电时,您将调用可能是您的进程本地的其他对象的接口,并且需要对进入它们的呼叫进行权限检查(这样他们将检查您自己的权限)本地流程,而不是最初叫你的流程。)

答案 3 :(得分:0)

您应用程序AndroidManifest.xml中需要

Declare the permissions

该权限实际上是来自文档的确切示例(如果您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>

答案 4 :(得分:0)

这可能是错误的方式,无论你想做什么。

不是将外部世界的新“门道”切割成系统的核心部分,而是向SDK应用程序可以使用的系统添加新界面,然后编写SDK应用程序,这可能是更好的主意。接收短信并可以使用这个新界面来完成某些事情。

答案 5 :(得分:0)

如果正确实施了系统服务,则无需声明权限。