6

Ho un'app che utilizza Universal Image Loader per scaricare foto da Internet, memorizzarle nella cache in dati/dati/com.myapp/cache e visualizzarle in ImageViews.Condivisione di immagini memorizzate nella cache con FileProvider

Volevo anche aggiungere condivisione (WhatsApp, Facebook, Instagram, Dropbox, ecc) per la mia app, così ho provato ad usare questo codice:

Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, photoUri); 
intent.setType("image/jpeg"); 
startActivity(Intent.createChooser(intent, "Share image")); 

photoUri era l'uri nella cartella della cache che altre applicazioni non ho il permesso di leggere.

Così ho cercato su google/stackover e found out che ho bisogno di utilizzare FileProvider.

Ho configurato il FileProvider come segue (as was written here) nel mio manifesto:

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

E il file_paths.xml:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <cache-path name="photo_cache" path="/"/> 
</paths> 

Poi ho utilizzare il seguente codice nella mia attività in pulsante onClickListener:

File photoFile = ImageLoader.getInstance().getDiscCache().get("HTTP LINK HERE"); 
// returns File of "/data/data/com.myapp/cache/-1301123243" 
Uri photoUri = FileProvider.getUriForFile(MyActivity.this, "com.myapp.fileprovider", photoFile); 
// returns Uri of "content://com.myapp.fileprovider/photo_cache/-1301123243" 
photoUri = Uri.parse(photoUri.toString() + ".jpg"); 
// then I add .jpg to file name 

// Create intent 
Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, photoUri); 
intent.setType("image/jpeg"); 

// Grant permissions to all apps that can handle this intent 
// thanks to this answer http://stackoverflow.com/a/18332000 
List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
for (ResolveInfo resolveInfo : resInfoList) { 
    String packageName = resolveInfo.activityInfo.packageName; 
    grantUriPermission(packageName, photoUri, 
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
} 

// And start 
startActivity(Intent.createChooser(intent, "Share image")); 

Tuttavia, a seconda dell'app, sto ricevendo strane eccezioni zioni. Come questo:

1974-1974/com.whatsapp W/Bundle﹕ Key android.intent.extra.STREAM expected ArrayList but value was a android.net.Uri$HierarchicalUri. The default value <null> was returned. 
1974-1974/com.whatsapp W/Bundle﹕ Attempt to cast generated internal exception: 
java.lang.ClassCastException: android.net.Uri$HierarchicalUri cannot be cast to java.util.ArrayList 
     at android.os.Bundle.getParcelableArrayList(Bundle.java:1223) 
     at android.content.Intent.getParcelableArrayListExtra(Intent.java:4425) 
     at com.whatsapp.ContactPicker.d(ContactPicker.java:320) 
     at com.whatsapp.ContactPicker.onCreate(ContactPicker.java:306) 
     at android.app.Activity.performCreate(Activity.java:5104) 

O Ho appena vedere i log come questo:

591-963/system_process W/ActivityManager﹕ Permission denied: checkComponentPermission() 

E naturalmente apps stessi darmi brindisi con errori (che non è possibile aprire o scaricare il file).

Ho provato, google, stackoverflowed MOLTO, quindi ora sto postando qui. Credo che lo stia facendo bene, forse solo qualche piccola cosa è sbagliata ...

Qualsiasi aiuto sarà apprezzato!

+0

si può mettere il permesso internet in file xml Android – Riskhan

+0

@kTekkie Non penso che tu abbia capito bene la domanda, scusa – Makks129

+0

@ Makks129 stai recuperando le immagini usando JSON, se sì puoi condividere un codice di esempio con me o c'è simillar che posso biforcarsi su github, il mio requisito è: Universal Image Loader + con JSON in una GridView ---- non voglio usare collegamenti costanti per le immagini – Sun

risposta

0

Penso che questo potrebbe essere un problema con l'infrastruttura FileProvider o l'applicazione con cui stai condividendo.

Ho cercato di utilizzare questo supporto per condividere immagini con altre applicazioni. Funziona bene con Gallery, Drive, Gmail e Keep. Fallisce con Foto e Google+.

Vedo voci simili a quelle riportate di seguito in LogCat che mi portano a credere che l'Uri sia passato da un'attività all'altra. Tuttavia, il permesso (temporaneo) impostato nell'intento viene perso.

11-19 21: 14: 06,031: I/ActivityManager (433): com.google.android.apps.plus/.phone.HostPhotoViewIntentActivity Mostrato: + 848ms

+0

Hai provato questo approccio con Instagram, Facebook o Messenger? Dovrebbe funzionare, ma non sembra così. –

Problemi correlati