使用ShareActionProvider共享图像

时间:2014-02-11 20:11:34

标签: android android-intent bitmap android-file shareactionprovider

我正在尝试通过Android的ShareActionProvider共享下载的位图,而我实际上将位图传递给适当的应用程序(例如Messenger,Google +,Gmail)。当我用uri传递意图时,没有任何反应(第三方应用程序中没有填充图像)。

这是我的意图:

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");
    writeToDirectory(bitmap, "cached-image.png"); // write bitmap to file system in order to share
    intent.putExtra(Intent.EXTRA_STREAM, getFileUri("cached-image.png"))
    mShareActionProvider.setShareIntent(intent);

我目前正在使用以下内容将位图保存到文件:

public String writeToDirectory(Bitmap bitmap, String filename) {
    assert context != null;
    assert bitmap != null;
    assert filename != null;

    // Ensure directory exists and create if not
    String path = Environment.getExternalStorageDirectory() + File.separator + "myApp";
    File f = new File(path);
    boolean dirExists = f.isDirectory();

    if (!f.isDirectory() && !f.exists()) {
        dirExists = f.mkdirs();
    }


    if (dirExists) {
        File file = new File(sharedPrivateExternalPath, filename);
        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.close();
        } catch (IOException ex) {
            e(TAG, "Write failed!");
            e(TAG, ex.getMessage());
            ex.printStackTrace();
        }
        return file.toString();
    } else {
        return "";
    }
}

我正在用这种方法检索Uri

public Uri getFileUri(String filename) {
    assert context != null;
    assert filename != null;

    String path = Environment.getExternalStorageDirectory() + File.separator + "myApp";
    File file = new File(path, filename);
    return Uri.fromFile(file);
}

我已经检查过该文件被写入适当的位置(Uri是file:///storage/emulated/0/myApp/cached-image.png)并且能够在那里查看图像(从设备做了adb pull),尽管图像没有不会过去的。我没有在日志中看到任何错误(没有FileNotFoundException或类似的任何东西)。这是文件权限问题吗?我无法分享到“非公开”的位置吗?

如果我将getExternalStorageDirectory() + File.separator + "myApp";更改为普通getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),它可以正常工作......但是它让我感到困扰它不起作用:)。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

原来它与我没有发布的代码有关(惊喜,惊喜)。我试图在setOnShareTargetSelectedListener中设置shareIntent ...显然你不能这样做。

我的问题在于此代码段

mShareActionProvider = (ShareActionProvider)
            MenuItemCompat.getActionProvider(shareItem);
    mShareActionProvider.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener() {
        @Override
        public boolean onShareTargetSelected(ShareActionProvider shareActionProvider, Intent intent) {
            String urlKey = mImageUrlList.get(mImageGallery.getCurrentItem()) + "\n";

            // This is the problem line
            mShareActionProvider.setShareIntent(getImageIntent(app.getImageCache().get(urlKey)));

            return false;
        }
    })