2015-10-08 10 views
5

Sembra che la condivisione di dati ad altre app su Android M sia possibile solo quando l'altra app ha chiesto manualmente il permesso READ_EXTERNAL_STORAGE e mi chiedo se qualcuno conosca un modo per aggirarlo senza aprire manualmente tutte le app a cui posso condividere e selezionare l'autorizzazione di archiviazione.Autorizzazioni su Android M quando si condividono dati con altre app

Per esempio io ho il seguente intento di condividere alcuni dati:

Intent shareIntent = new Intent(Intent.ACTION_SEND); 
    shareIntent.setType("image/*"); 
    shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Some Image Subject"); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(someFile)); 
    startActivity(Intent.createChooser(shareIntent, "Share via...")); 

Assumere someFile esiste e che ho già seguito il modello di autorizzazione runtime consigliato suggerito al http://developer.android.com/training/permissions/requesting.html e l'utente ha accettato di permettere il mio permesso, quindi il file è stato effettivamente creato sul sistema.

C'è un modo per comunicare all'applicazione a cui sto condividendo, che ho concesso questa autorizzazione al mio utente, per favore concedilo per mio conto?

Questo non funziona:

shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

Secondo la documentazione: il permesso

int FLAG_GRANT_READ_URI_PERMISSION

Se impostato, sarà concesso il destinatario di questo intento di eseguire le operazioni di lettura su l'URI nei dati dell'Intent e tutti gli URI specificati nei suoi ClipData.

E ancora più interessante il fatto che, se questo flag è impostato e condivido a Gmail, la bandiera non viene rilevato e Google non richiede di chiedere il permesso, ma piuttosto solo cattura l'eccezione e non allegare il mio file.

Qualsiasi aiuto sarebbe apprezzato.

+0

Hi. Hai già trovato la soluzione? Sto affrontando un errore simile. Voglio condividere video su Youtube. E YouTube si blocca con SecurityException: negazione del permesso. Richiede l'autorizzazione READ_EXTERNAL_STORAGE o il permesso di concessione. – TOP

risposta

2

È possibile condividere file impostando uno FileProvider.

Definire nel AndroidManifest simili:

<manifest> 
    ... 
    <application> 
     ... 
     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.mydomain.fileprovider" 
      android:exported="false" 
      android:grantUriPermissions="true"> 
      ... 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/file_provider_paths" /> 
     </provider> 
     ... 
    </application> 
</manifest> 

dove authorities è un nome arbitrario; quindi creare un file xml in cui definire i percorsi dei file che si desidera condividere. Ad esempio, se si desidera condividere un file che si trova nella memoria esterna, il file file_provider_paths.xml sarà simile a questa:

<paths> 
    <external-path name="share_image" path="/MYAppFolder/Images/" /> 
</paths> 

Quindi utilizzare il FileProvider per ottenere l'URI contenuto dei file che si desidera Condividi:

Uri uri = FileProvider.getUriForFile(context, "com.mydomain.fileprovider", file); 

Maggiori informazioni sul docs

+0

Hai ragione, mio ​​male. – Romain

+0

Perché questa risposta è stata downvoted? – Krystian

+0

A causa della mancanza di sentimenti di qualcuno, credo –

Problemi correlati