2015-07-25 10 views
5

Mam wyeksportowanego dostawcę treści, który jest udostępniany przez kilka moich aplikacji, i dla których osoba trzecia może mieć możliwość pisania własnych aplikacji po opublikowaniu interfejsu API.Egzekwuj prawa własności do elementu dla dostawcy treści

Teraz dowolna aplikacja kliencka może wykonać dowolną operację CRUD na dowolnym elemencie dostawcy zawartości. Chcę wymusić pewne uprawnienia dostępu, aby aplikacja mogła tylko modyfikować lub usuwać utworzone przez siebie elementy, a jednocześnie zezwalać dowolnej aplikacji na odczytywanie wszystkich elementów w dostawcy i tworzenie nowych elementów.

Czy jest jakiś sposób uzyskania dostępu do UID aplikacji do wywoływania i zapisania jej w nowo utworzonych pozycjach, a następnie porównania z tą wartością w przyszłych operacjach? Czy byłoby lepiej użyć nazwy pakietu? Zakładam, że UID może się zmienić, jeśli użytkownik odinstalował i ponownie zainstalował aplikację, a ja nie chcę, aby utracili dostęp do tych elementów, jeśli to zrobią.

Odpowiedz

1

Tak, możesz sprawdzić nazwę paczki. Oto w jaki sposób można odzyskać nazwę pakietu w oparciu o UID wywołującego:

private static Collection<String> getCallingPackages(Context context) { 
    int callingUid = Binder.getCallingUid(); 
    if (callingUid == 0) { 
     return Collections.emptyList(); 
    } 

    String[] packages = context.getPackageManager().getPackagesForUid(callingUid); 
    return new ArrayList<>(Arrays.asList(packages)); 
} 

ta zwraca listę nazw pakietów, ponieważ, cytując dokumenty:

W większości przypadków będzie to pojedynczy nazwa pakietu, pakiet, któremu został przypisany ten identyfikator użytkownika.

W przypadku wielu pakietów o tym samym identyfikatorze użytkownika za pośrednictwem mechanizmu "sharedUserId" wszystkie pakiety z tym identyfikatorem zostaną zwrócone.

Powiązane problemy