6

Ich habe eine App, die Universal Image Loader verwendet, um Fotos aus dem Internet herunterzuladen, sie in Daten/Daten/com.myapp/Cache zwischenzuspeichern und in ImageViews anzuzeigen.Geteilte Bilder mit FileProvider teilen

Ich wollte auch Sharing hinzufügen (WhatsApp, Facebook, Instagram, Dropbox etc.) zu meiner app, so habe ich versucht, diesen Code zu verwenden:

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 der uri im Cache-Ordner war die andere Apps Habe keine Leseberechtigung.

Also ich googled/stackoverflowed und found out, dass ich FileProvider verwenden muss.

ich die FileProvider wie folgt konfiguriert (as was written here) in meinem Manifest:

<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> 

Und die file_paths.xml:

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

Dann habe ich den folgenden Code in meiner Tätigkeit in Taste 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")); 

Aber abhängig von der App bekomme ich seltsam Ausnahme . Wie folgt aus:

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) 

Oder ich sehe nur Protokolle wie folgt aus:

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

Und natürlich apps selbst geben Sie mir Toast mit Fehlern (dass sie nicht öffnen können oder die Datei herunterladen).

Ich habe versucht, gegoogelt, Stackoverflowed viel, also jetzt posten ich hier. Ich denke, ich mache es richtig, vielleicht nur ein kleines Ding ist falsch ...

Jede Hilfe wird geschätzt werden!

+0

können Sie Internet gestellt Erlaubnis in Android-XML-Datei – Riskhan

+0

@kTekkie Ich glaube nicht, dass Sie die Frage richtig verstanden haben, sorry – Makks129

+0

@ Makks129 holen Sie Bilder mit JSON, wenn ja, können Sie einen Beispielcode mit mir teilen oder gibt es Simillar ich kann auf Github Gabel, meine Voraussetzung ist: Universal Image Loader + mit JSON in einer GridView ---- will keine konstanten Links für Bilder verwenden – Sun

Antwort

0

Ich denke, dies könnte ein Problem mit der FileProvider-Infrastruktur oder der Anwendung sein, mit der Sie teilen.

Ich habe versucht, diese Unterstützung zu verwenden, um Bilder mit anderen Anwendungen zu teilen. Es funktioniert gut mit Gallery, Drive, Gmail und Keep. Es schlägt mit Fotos und Google+ fehl.

Ich sehe Einträge wie folgt in LogCat, die mich glauben machen, dass der Uri von einer Aktivität an eine andere weitergegeben wird. Die in der Absicht festgelegte (temporäre) Berechtigung ist jedoch verloren.

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

+0

Haben Sie diesen Ansatz mit Instagram, Facebook oder Messenger versucht? Es sollte funktionieren, aber es scheint nicht so. –