2015-06-01 11 views
18

La mia app consente agli utenti di importare foto e video da altre app. Ora che Google ha sostituito le Foto Google+ con Google Foto, un paio di cose mi hanno rotto. Una di queste cose è riutilizzare i file importati dopo il riavvio dell'app. Ho la sensazione che abbiano rafforzato le autorizzazioni rilasciate quando Google Photos restituisce l'intento con l'URI immagine, quindi dopo che la mia app viene uccisa, non ha più il permesso di accedere al file caricato. Sto ricevendo l'expection Sicurezza:Utilizzo dei dati dai provider di contesto o richiesta dell'autorizzazione di lettura di Google Foto?

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.MediaContentProvider from ProcessRecord{2c17ab9e 2124:com.myapp.myapp/u0a436} (pid=2124, uid=10436) that is not exported from uid 10427 

EDIT:

Sto anche ricevendo lo stesso problema con il riutilizzo di file forniti da com.google.android.apps.docs.sync.filemanager.FileProvider

qualche suggerimento/soluzione? So che posso leggere il file prima di aver perso il permesso quindi in teoria potrei copiarlo ma non posso dire che mi piaccia molto ..

risposta

17

Sì, questo è di progettazione, come descritto a Android Developer site.

Per motivi di sicurezza, le autorizzazioni sono temporanee, quindi una volta terminato lo stack delle attività dell'applicazione client, il file non è più accessibile. È necessario ottenere i dati del file quando si riceve la risposta intent, nel metodo onActivityResult. Memorizza una copia dei dati del file, perché il file non sarà più disponibile quando ritorna AtActivityResult.

+0

Questa è stata la mia conclusione e quindi sceglierò la risposta come risposta. Grazie – vkislicins

+0

Sembra antipattern. Crea una copia del file nella discussione principale? – tse

+0

@tse Hai accesso da qualsiasi thread per tutto il tempo in cui la tua attività che è stata presa di mira dall'intento non viene interrotta –

2

forse puoi provare ad aggiungere questo permesso utente nel file manifest.

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
+0

non sembra di fare nulla .. – vkislicins

+0

è possibile utilizzare l'InputStream per accedere al file? come "context.getContentResolver(). openInputStream (uri);" ? – Zephyr

+0

questo è esattamente quello che sto facendo quando ottengo l'errore di autorizzazione – vkislicins

0

Sembra this domanda è simular

Credo che quando l'attività (non fragment) muore - tutti recuperati da esso URI diventare invalidato

ho anche lo stesso problema - cercando di caricare foto in sfondo. Ma l'utente nel thread UI può cambiare attività e di URI non è più valido stesso problema

+0

Sì, sembra simile, ma penso che l'autorizzazione sia cambiata per il nuovo fornitore di contenuti app Foto come ho avuto la sensazione che ho provato prima questa autorizzazione senza fortuna. Ho finito per copiare file nel mio territorio e registrarli nel mio fornitore di contenuti per mantenere l'accesso. Fammi sapere se trovi una soluzione migliore! – vkislicins

0
+0

Il mio problema non è la chiamata get iniziale: è la conservazione dei permessi. Dopo aver ottenuto l'accesso al file, l'accesso viene revocato se l'app è sospesa o l'utente si allontana dall'app – vkislicins

+0

Per favore includi la risposta qui, anziché solo i collegamenti. Vedi http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers –

7
  1. È possibile riprodurre questo registro SecurityException quando si utilizza l'app "Foto Google".

  2. La causa principale di questo problema è "Google Foto" condivide ContentUri con una stringa fissa come "content: //com.google.android.apps.photos.contentprovider/1/1" e connetterlo con valori temporanei statici . "Foto Google" non fornisce il percorso del file quando l'attività o il contesto corrente riceve Intent.ACTION_SEND. Forse, è la politica di "Google Foto", non per esporre il file di immagine privato ad altre app.

  3. Ad esempio, si definisce 2 Attività nel file Manifest, Actvity A e Activity B. L'attività A per riceve Intent.ACTION_SEND. Attività B per l'elaborazione del file immagine. Attività A inoltrare l'attività all'attività B. Quindi Attività B non è l'attività corretta per "Foto di Google", si incontra SecurityException.

Quindi, vi consiglio di salvare il file temporaneamente attività A e utilizzare il percorso del file temporaneo Attività B

+0

grazie! Penso che la tua risposta sia giusta per il mio problema. –

+1

Ho lo stesso problema, le foto di Google causano un sacco di problemi: -/ –

1

È necessario impostare le autorizzazioni in modo esplicito su tutti i pacchetti che corrispondono all'intenzione. Accade di solito in Android 4.4.

è possibile utilizzare questa utilità per farlo:

List<ResolveInfo> resInfoList = getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
     for (ResolveInfo resolveInfo : resInfoList) { 
      String packageName = resolveInfo.activityInfo.packageName; 
      getContext().grantUriPermission(packageName, imageFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     } 
Problemi correlati