2013-02-10 13 views
5

W jednej aplikacji, mam następujący dostawcy treści zadeklarowane w moim AndroidManifest:Żądanie odczytu pozwolenie od własnego ContentProvider w innej aplikacji

<provider android:name="com.example.MyProvider" 
       android:label="@string/provider_name" 
       android:authorities="com.example" 
       android:readPermission="com.example.permission.READ" 
    /> 

I kolejny prosi o zezwolenie aplikacji z niego korzystać:

<uses-permission android:name="com.example.permission.READ" /> 

Ale kiedy uruchomić ten kod:

ContentResolver resolver = this.context.getContentResolver(); 
    Cursor results = resolver.query(BaseballCardContract.CONTENT_URI, BaseballCardContract.PROJECTION, null, null, null); 

pojawia się następujący komunikat o błędzie:

E/DatabaseUtils (1009): java.lang.SecurityException: Odmowa zgody: odczyt bbct.android.common.BaseballCardProvider URI zawartość: //bbct.android.baseballcard/baseball_cards od PID = 996 UID = 10046 Wymaga com.example.permission.READ lub grantUriPermission()

Z tego co wiem, żądam wymaganego pozwolenia. Czego tu mi brakuje? Na co jeszcze muszę zwrócić uwagę?

Odpowiedz

9

W aplikacji definiującej dostawcę treści zdefiniowałeś również uprawnienie, którego wymagasz/żądasz (w twojej drugiej aplikacji)? Podobnie jak (w tagu korzeń <manifest/>):

<permission android:name="com.example.permission.READ" /> 

Ogólnie, trzeba:

  1. zdefiniować jako gość w jednym z oczywistych plików Twoich aplikacji
  2. Żądanie zgody na którykolwiek z pliki manifestu aplikacji, dla aplikacji, które chcą uzyskać zezwolenie, wymagają tego uprawnienia w dowolnym komponencie, który chcesz chronić za pomocą tego uprawnienia, na przykład Działania, Usługi lub Dostawcy zawartości (odczyt, zapis, oba określone podrzędne identyfikatory URI) itp.)

Edytuj: aby być w 100% zrozumiałym, NIE wystarcza, aby "niejawnie" zdefiniować uprawnienie, wymagając go w, powiedzmy, dostawcy treści. Musisz go jawnie zdefiniować w pliku manifestu aplikacji (w tagu <manifest/>).

+1

Dzięki za przesłanie odpowiedzi na moje dawno zapomniane pytanie. To jest rozwiązanie, które wcześniej znalazłem, dlatego cieszę się, że poświęciłeś czas, aby dodać go tutaj. Mam nadzieję, że będzie to pomocne dla przyszłych użytkowników. Dodatkowo dodałem również atrybut 'android: protectionLevel =" signature "' do tagu '', więc tylko moje własne aplikacje będą mogły uzyskać pozwolenie. –

+0

Zawsze uważałem, że ten poziom "podpisu" był domyślny, jeśli chodzi o uprawnienia zdefiniowane przez użytkownika, ale szybko przeczytałem dokumentację i nie mogłem znaleźć żadnych wyraźnych informacji na ten temat. W każdym razie wydaje się, że nie ma nic złego w umieszczeniu tego w twojej definicji, po prostu dla pewności. Dzięki za ten komentarz! – baske

+1

FYI ten wpis na blogu prowadzi do tej odpowiedzi: https://commonsware.com/blog/2018/02/06/vet-your-manifest.html –

Powiązane problemy