2017-05-16 7 views
0

Ich versuche, die native Android-Freigabe-Funktion zu verwenden, um eine Reihe von Bildern zu teilen, die ich mit Glide abgerufen. Daher wird jede App, die mit den Bildern kompatibel ist, im Freigabe-Menü von Android angezeigt.Android Teilen mehrerer Bilder mit anderen Apps

Ich habe eine Methode erstellt, die beim Klicken auf die Freigabe aufgerufen wird.

private void onShareClicked() { 
    GlideUrl glideUrl = new GlideUrl(url1, new LazyHeaders.Builder().addHeader("x-auth-token", mToken).build()); 
    FutureTarget<File> image1 = mGlide.load(glideUrl).downloadOnly(SIZE_ORIGINAL, SIZE_ORIGINAL); 

    glideUrl = new GlideUrl(url2, new LazyHeaders.Builder().addHeader("x-auth-token", token).build()); 
    FutureTarget<File> image2 = mGlide.load(glideUrl).downloadOnly(SIZE_ORIGINAL, SIZE_ORIGINAL); 

    new ShareImagesTask(this, "image/png").execute(image1, image2); 
} 

erstellt Dann ShareImagesTask, die Sie mehrere Bilder, indem Sie die Anfrage bekommen die Bilder Dateien über Glide gemeinsam nutzen können:

public class ShareImagesTask extends AsyncTask<FutureTarget<File>, Void, ArrayList<Uri>> { 

    private final Context mContext; 
    private final String mMimeType; 

    public ShareImagesTask(Context context, String mimeType) { 
     this.mContext = context; 
     this.mMimeType = mimeType; 
    } 

    @Override 
    protected ArrayList<Uri> doInBackground(FutureTarget<File>... targets) { 
     final ArrayList<Uri> imageUris = new ArrayList<>(targets.length); 

     for(FutureTarget<File> target : targets) { 
      try { 
       File file = target.get(); 
       Uri uri = FileProvider.getUriForFile(mContext, "com.myapp.fileprovider", file); 
       imageUris.add(uri); 
      } catch (Exception ex) { 
       Log.w("SHARE", "Sharing failed for one or more image files.", ex); 
      } 
     } 

     return imageUris; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<Uri> result) { 
     if(!result.isEmpty()) { 
      Intent intent = new Intent(); 
      intent.setAction(Intent.ACTION_SEND_MULTIPLE); 
      intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, result); 
      intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
      intent.setType(mMimeType); 
      mContext.startActivity(Intent.createChooser(intent, "Share Your Photo")); 
     } 
    } 
} 

Hier ist meine AndroidManifest.xmlFileProvider:

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

Und schließlich filepaths.xml:

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <cache-path name="shared_images" path="/data/data/com.myapp/cache/image_manager_disk_cache/"/> 
</paths> 

Ich bin in der Lage, an den Punkt des Aufrufs FileProvider.getUriForProvider() zu kommen, und es gibt die Ausnahme unten. Ich habe auch versucht, den Pfad in filepaths.xml Änderungen des Pfades in der Ausnahme erwähnt, aber ich bekomme den gleichen Fehler. Irgendwelche Ideen?

java.lang.IllegalArgumentException: Fehlgeschlagen konfiguriert zu finden, die Wurzel /data/data/com.myapp/cache/image_manager_disk_cache/11fa9845150748cc77d49a75954d92f246cc7095e72e36b85d6a07dbdeb9cf46.0

Antwort

0

Ersetzen enthält:

<cache-path name="shared_images" path="/data/data/com.myapp/cache/image_manager_disk_cache/"/> 

mit:

<cache-path name="shared_images" /> 

oder möglicherweise mit:

<cache-path name="shared_images" path="image_manager_disk_cache/"/> 

wenn Sie versuchen, FileProvider auf eine Teilmenge von getCacheDir() zu beschränken.

+0

Der erste Vorschlag funktionierte. Ich danke dir sehr! – Adam

Verwandte Themen