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!
können Sie Internet gestellt Erlaubnis in Android-XML-Datei – Riskhan
@kTekkie Ich glaube nicht, dass Sie die Frage richtig verstanden haben, sorry – Makks129
@ 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