2010-09-02 3 views
1

Я только начинаю с программирования на Android, и я внедрил очень простой удаленный сервис. Я могу привязываться к моей службе из других процессов и отправлять простые сообщения «ping» и «pong» взад и вперед. (Я не использую AIDL, заглушки и т. Д. Я просто прохожу Messages и используя поле what.)getCallingPid(), возвращающий мой PID в onBind()

Теперь я изучаю разрешения, и у меня возникла проблема. В моем методе onBind()checkCallingPermission() всегда возвращает PERMISSION_DENIED, даже если вызывающий процесс имеет соответствующее разрешение (подтверждено вызовом checkCallingOrSelfPermission() в этом процессе). Я подозреваю, что это происходит потому, что Binder.getCallingUid() возвращает PID серверного процесса, а не вызывающего.

Любая идея, что я могу делать неправильно? checkCallingPermission() должен работать таким образом в методе onBind() службы, не так ли?

Спасибо!

ответ

0

onBind() не обрабатывает транзакцию, отправленную с другого процесса - система Android уведомляет ваш процесс о том, что кто-то связан, и вернет данный IBinder в процесс привязки. Чтобы предотвратить процесс от привязки, если он не имеет необходимого разрешения, поместите разрешение в манифесте приложения:

<application android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:permission="my.package.permission.RESTRICT" >   <-- Permission 
    <service android:exported="true" android:name=".MyService"> 
     <intent-filter> 
      <action android:name="my.package.IAidl" /> 
     </intent-filter> 
    </service> 
</application> 
+0

Это не будет работать. Система кэширует связующие. Попробуйте несколько раз связываться с разными процессами. 'onBind()' вызывается только один раз. Если вы хотите проверить разрешения, вам необходимо выполнить проверку разрешений в определении метода AIDL связующего. –

Смежные вопросы