2015-08-25 1 views
0

Я подвергаю некоторый API через механизм AIDL. Клиенты должны привязываться к AIDL и вызывать методы синхронно. Есть ли способ получить имя Java-пакета клиента?Извлечение Java-пакета имени потребителя AIDL

Например, если я выставляю метод boolean isFooAvailable() как API AIDL, из реализации isFooAvalable, могу ли я определить имя пакета Java приложения, которое привязывается к службе AIDL?

+2

'Binder.getCallingUid()' должен быть в состоянии предоставить вам UID Linux вызывающего. Оттуда «PackageManager» может помочь вам отследить приложения (приложения), которые используют этот UID. – CommonsWare

ответ

0

Да, вы можете узнать имя пакета из в рамках реализации следующим образом:

IAidl.Stub mBinder = new IAidl.Stub() { 

    @Override 
    public boolean isFooAvailable() throws RemoteException { 

     String pkgName = ""; 
     int pid = Binder.getCallingPid(); 

     ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
     List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses(); 

     for (ActivityManager.RunningAppProcessInfo proc : processes) { 

      if (proc.pid == pid) { 

       pkgName = proc.processName; 
      } 
     } 
     // package name of calling application package 
     Log.e("Package Name", pkgName); 
     return false; 
    } 
} 

Поиск имя пакета с помощью ПИД-регулятора является лучшим подходом по сравнению с UID.