【问题标题】:Android Share Multiple Images with Other AppsAndroid 与其他应用共享多张图片
【发布时间】:2017-05-16 17:31:57
【问题描述】:

我正在尝试使用原生 Android 共享功能来共享一组我使用 Glide 检索到的图像。因此,任何与图像兼容的应用都会显示在 Android 的共享菜单中。

我创建了一个在单击共享时调用的方法。

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);
}

然后创建ShareImagesTask,它允许您通过完成通过 Glide 获取图像文件的请求来共享多个图像:

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"));
        }
    }
}

这是我的 AndroidManifest.xml FileProvider:

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

最后,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>

我能够调用FileProvider.getUriForProvider() 并且它给出了以下异常。我还尝试将filepaths.xml 中的路径更改为异常中提到的路径的变体,但我得到了同样的错误。有什么想法吗?

java.lang.IllegalArgumentException:找不到配置的根目录 包含 /data/data/com.myapp/cache/image_manager_disk_cache/11fa9845150748cc77d49a75954d92f246cc7095e72e36b85d6a07dbdeb9cf46.0

【问题讨论】:

    标签: java android android-glide android-fileprovider


    【解决方案1】:

    替换:

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

    与:

    <cache-path name="shared_images" />
    

    或者可能有:

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

    如果您试图将FileProvider 限制为getCacheDir() 的子集。

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 2014-09-06
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 2020-09-15
      • 2018-06-10
      • 1970-01-01
      相关资源
      最近更新 更多