Android Framework:系统服务未获得权限

时间:2011-02-01 16:30:54

标签: android

我在Android框架中添加了一个系统服务(一个应用程序)(因此在system_process中运行)。通过Binder.getCallingUid()我可以确定调用进程/应用程序。到现在为止还挺好。 但是,如果我的服务尝试使用其他系统服务(例如LocationManager),则抛出SecurityException,因为LocationManager认为它是由调用我的服务的原始应用程序调用的。

根据我的理解,系统服务默认拥有所有权限,所以情况应该不是这样,是吗?

  

来自programming4.us/Mobile/1304.aspx:   Binder服务可以免费制作其他服务   binder调用,但这些调用总是如此   与服务自己的身份一起发生   (UID和PID)而不是身份   来电者。

这里有一些代码来说明问题:

public class MyService implements IInterface {

    public IBinder asBinder() {
        return mBinder;
    }

    private final IMyService.Stub mBinder = new IMyService.Stub() {

        public void doSomething() {
          int uid = Binder.getCallingUid(); // uid of the calling app
          int myUid = Process.myUid(); // my uid == 1000
          ...
          try {
           ILocationManager lm = ILocationManager.Stub.asInterface(ServiceManager.getService("location"));
           Location myLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
          } catch (Exception e) {
             SecurityException is thrown. Requires ACCESS_FINE_LOCATION
          }
        }

    };
}

提前感谢您的任何帮助或评论!

1 个答案:

答案 0 :(得分:1)

我自己没有尝试过(但是,我会在星期一来到,因为我目前正面临你所描述的情况):Binder有两种方法“clearCallingIdentity”和“restoreCallingIdentity”,它们可能对我有用。我们。如果我正确地解释文档,这就是我相信它们的工作方式。

第一种方法清除传入IPC的标识,这样当您访问LocationManager时,您可以使用自己的身份而不是呼叫者。它返回一个long值,然后传递给第二个方法以恢复调用者标识。这应该使您能够传递LM的权限检查,因为您将有效地从system_process调用它(即LM所在的相同过程)。