2016-04-18 8 views
3

In einer meiner Anwendungen verwende ich einen ContentProvider, um Informationen zu speichern und wiederherzustellen. Dieser ContentProvider wird von der Hauptanwendung sowie von einigen Diensten verwendet, aber alle befinden sich in derselben apk und alle Dienste werden im Standard (Haupt) -Prozess ausgeführt.Erlangung einer Zugriffsverweigerung bei der Abfrage meines eigenen ContentProvider über meine eigene App

ist mein Content-Provider wie dies in meinem Manifest erklärt:

<provider android:name="sample.provider.SampleProvider" 
       android:authorities="sample.provider" 
       android:exported="false" 
       android:enabled="true"> 
    </provider> 

Eine meiner Klassen wird als Beobachter an einer URI registriert, und wenn eine Änderung mitgeteilt wird, ich bin an den Anbieter direkt abfragt Aktualisiere den internen Wert.

@Override 
public void onChange(boolean selfChange, @Nullable Uri uri) { 
    if (uri == null) { 
     return; 
    } 
    try { 
     Cursor updated = mContentResolver.query(uri, null, null, null, null); 
     // ... working with the cursor here 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Dieser Code immer Failes, mit folgenden Ausnahme

java.lang.SecurityException: Permission Denial: reading sample.provider.SampleProvider uri 
    content://sample.provider/infos/FOO from pid=0, uid=1000 requires the provider be 
    exported, or grantUriPermission() 
     at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605) 
     at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480) 
     at android.content.ContentProvider$Transport.query(ContentProvider.java:211) 
     at android.content.ContentResolver.query(ContentResolver.java:491) 
     at android.content.ContentResolver.query(ContentResolver.java:434) 
     at sample.foo.Bar.onChange(Bar.java:331) 
     at android.database.ContentObserver.onChange(ContentObserver.java:145) 
     at android.database.ContentObserver.dispatchChange(ContentObserver.java:196) 
     at android.database.ContentObserver.-wrap0(ContentObserver.java) 
     at android.database.ContentObserver$Transport.onChange(ContentObserver.java:231) 
     at android.database.IContentObserver$Stub.onTransact(IContentObserver.java:62) 
     at android.os.Binder.execTransact(Binder.java:453) 

Beachten Sie, dass, wenn ich exported="true" im Manifest verwenden, alles

+0

Ihr Ziel api erkennen? –

+0

target = 23, minsdk = 16 – XGouchet

Antwort

1

Nachdem dieses Problem zu untersuchen funktioniert gut, ich, dass mein Beobachter entdeckt wurde von einer anderen Anwendung aufgerufen (meine Vermutung ist, dass es das Betriebssystem direkt mein Beobachter ist), was bedeutet, dass ich, wenn ich die Abfrage mache, nicht im Kontext meiner eigenen App bin, auch wenn es mein eigener Code ist.

Ich reparierte dieses Problem durch einen Handler in meinem Objekt zu erzeugen, und eine Nachricht zu senden, wenn ich eine Änderung auf der beobachteten URI

+0

Können Sie einige Code-Snippets Ihres Fixes anzeigen? –

+0

Mein Objekt erweitert ContentObserver und ich fügte dies im Konstruktor hinzu: super (neuer Handler (Looper.getMainLooper())); – XGouchet