1

В методе службы onBind() я хотел бы проверить, имеет ли вызывающий абонент определенное разрешение. Для этого мне нужно найти личность вызывающего.Получить идентификатор вызывающего абонента в службе onBind() в Android

Я ожидал, что следующий код вернет имя пакета вызывающего абонента, но вместо этого я получаю имя пакета службы. Что я делаю не так?

Binder.getCallingUid() 
String pkg = getPackageManager().getNameForUid(uid); 
+0

Вы знаете, что 'onBind' вызывается один раз (за услугу), а не во время транзакции' Binder'? вам нужно вызвать 'Binder.getCallingUid()' во время транзакции «Binder», а не внутри 'onBind', документы говорят: '' 'Вернуть Linux uid, назначенный процессу, который отправил вам текущую транзакцию, которая обрабатывается. Этот uid можно использовать с системными службами более высокого уровня, чтобы определить его личность и проверить разрешения. ** Если текущий поток в настоящий момент не выполняет входящую транзакцию, возвращается его собственный uid. ** '' ' – pskink

+0

"вам известно, что onBind вызывается один раз (за услугу), а не во время транзакции Binder?" - Я думал, что он был вызван один раз на одного клиента. Моя идея состояла в том, чтобы просто вернуть «null», когда клиент не имеет ожидаемого разрешения. – Daniel

+1

, вам нужно сделать это в методе 'Binder # onTransact', это хорошее место для любых удаленных проверок. – pskink

ответ

0

Нет необходимости выполнять этот вид операции. Если вы хотите защитить привязку, запуска или остановки ваш Service затем добавить атрибут android:permission к вашему манифеста декларации Service:

<service android:name=".MyService" 
     android:permission="com.example.myapp.permission.SERVICE_USER" > 
    <intent-filter> 
    ... 
    </intent-filter> 
</service> 

Система будет автоматически гарантировать, что любое приложение пытается использовать сервис имеет указанное разрешение. Вы используете только API-интерфейсы для обеспечения соблюдения/проверки внутри входящих вызовов. Вы можете найти эту статью полезной: http://po.st/d6eTXj.

+0

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

+0

Я бы предложил разбить его на отдельные реализации 'Service', по одному для каждого открытого интерфейса AIDL. Это позволит ему работать и иметь четкое разделение обязанностей. Вы не можете проверить UID/PID вызывающего в 'onBind()', потому что это происходит в основном потоке процесса вашего приложения, а не в потоке связующего. Кроме того, выставляйте один определенный интерфейс AIDL, но используете разные разрешения для контроля доступа к определенным API. –

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