2017-01-29 8 views
1

このサービスを開始するために必要なアクセス許可があるかどうかを動的にチェックしたいサービスがあります。呼び出し元のIDは、サービスを使用しているアプリケーションの実際のIDではなく、サービスが定義されているアプリケーションであることがわかりました(これはonStartCommand()のgetCallingUid()メソッドとgetCallingPid onStartCommand()にない場合、このチェックをどこで実行するのですか?これを行うにはどうしたらいいですか?サービスで発信者のアクセス許可を動的に確認する

public class MyService extends Service { 
     @Nullable 
     @Override 
     public IBinder onBind(Intent intent) { 
      return null; 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      Log.d("TAG", "uid: " + getCallingUid() + " pid: " + getCallingPid()); 
int hasPermission = checkCallingPermission(MainActivity.CUSTOM_PERMISSION); 
      if (hasPermission == PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, "Created", Toast.LENGTH_SHORT).show(); 
      } 
      return flags; 
     } 
} 
+0

'Service'マニフェスト内の['permission'属性](https://developer.android.com/guide/topics/manifest/service-element.html#prmsn)で定義できます。なぜこれを動的にチェックしたいのですか? –

+0

問題は、そのサービスをホストするアプリケーションのIDではなく、呼び出し元のアプリケーションのIDを取得することです。上記のコードでは、pidとuidは常にサービスが実装されているアプリからのものです。 –

+0

私はあなたが私の以前のコメントのポイントを逃したと思う。 'onStartCommand'が呼び出された場合は、呼び出し元に必要な権限があることをすでに知っています。 –

答えて

0

これを達成する唯一の方法は、AIDLを使用するBound Servicesを使用することでした。 Hereはそれをどうやって始めましょうか。それはあなたが[OnBind]の中Binder.getCallingPid()を呼び出す場合、あなたはあなたのインターフェイス用のスタブでそれを呼び出す必要が動作しません:

public class MyService extends Service { 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() { 
     @Override 
     public void myMethod() { 
      //PID 
      int pid = Binder.getCallingPid(); 
      Log.d("ITestService in AIDL", String.format("Calling pid in service: %d", pid)); 
     } 
    }; 
} 

そして、これは、インターフェイスがどのように見えるかです:

interface IMyAidlInterface { 
    /** 
    * Demonstrates some basic types that you can use as parameters 
    * and return values in AIDL. 
    */ 
    void myMethod(); 
} 
関連する問題