Przyjęta odpowiedź nie była całkiem poprawna! Dlaczego? Jeśli dwóch lub więcej aplikacji używać tego samego android:sharedUserId
metoda Binder.getCallingUid()
zwróci samo uid i getPackageManager().getNameForUid(uid)
zwróci ten sam ciąg, wygląda na to: com.codezjx.demo: 10058, ale nie jest to nazwa pakietu!
Właściwy sposób jest używać pid:
int pid = Binder.getCallingPid();
a następnie użyć PID, aby uzyskać nazwę pakietu przez ActivityManager
, każdy proces może pomieścić wiele pakietów, tak to wygląda:
private String[] getPackageNames(Context context, int pid) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> infos = am.getRunningAppProcesses();
if (infos != null && infos.size() > 0) {
for(RunningAppProcessInfo info : infos) {
if(info.pid == pid) {
return info.pkgList;
}
}
}
return null;
}
Warnning: W przypadku korzystania z metody Binder.getCallingPid()
i jeśli bieżący wątek nie wykonuje aktualnie transakcji przychodzącej, wówczas jej własny pid jest równy urne. Oznacza to, że musisz wywołać tę metodę w metodzie narażonych interfejsów AIDL.
Jeśli zgłoszę kod dostarczany w funkcji onBind, zwraca nazwę packageName z apk który przebywa usługa. Znaczy nie powrócić od rozmówcy packageName innego apk, zwraca tylko sam packageName która usługa pozostaje w. – umituzun84
z dokumentacji Android public static końcowy int getCallingUid() Powrót identyfikator użytkownika przypisany do procesu, który was wysłał bieżąca transakcja, która jest przetwarzany. Ten identyfikator może być używany z usługami systemu wyższego poziomu w celu określenia jego tożsamości i uprawnień kontrolnych. Jeśli bieżący wątek nie wykonuje aktualnie transakcji przychodzącej, zwracany jest jego własny identyfikator UID. –
Oba komentarze na temat tej odpowiedzi są poprawne - ale jeśli wywołasz to w metodach ujawnionych przez twój plik AIDL, wydaje się, że raport jest poprawny. Bardzo przydatna odpowiedź dla mnie. – brandall