如何访问Picasso的缓存图像以实现共享意图?

lon*_*kai 7 android picasso

我正在使用Picasso来帮助缓存图像.

问题是,如何访问下载的图像以进行共享意图?

有任何想法吗?谢谢!

lon*_*kai 4

我希望你能理解我的问题:-)

抱歉我的延迟,我找到了解决方案,但是不是一个好的解决方案......

首先,我确实搜索了一段时间,看了Picasso的代码。看来你应该提供自己的下载器和其他东西。但是,为什么我应该使用 lib...

然后,我认为毕加索的设计/架构只是将文件缓存在内部存储中。也许是因为外部存储并不总是可用(就像用户可以将 SD 卡插入计算机),或者可能是因为外部存储不如内部存储快……这是我的猜测。总之,其他应用程序无法访问当前应用程序的内部存储,因此无法进行共享。

因此,我做了一个非常普通的解决方案。我只是等Picasso给了Bitmap,然后将其压缩到外部文件中的一个文件,然后进行共享。这似乎是一个糟糕的解决方案,但它确实解决了问题,是的......

您应该注意外部缓存目录是否可用。如果没有,您将无法进行共享。并且您需要将压缩任务放在后台线程中,因此,等待外部文件缓存......这看起来是一个糟糕的解决方案吗?我想是这样...

下面是我的项目代码,你可以试试...

private boolean mSaved; // a flag, whether the image is saved in external storage
private MenuItem mShare;
private Intent mIntent;
private ShareActionProvider mShareActionProvider;
private File mImage; // the external image file would be saved...


private Target target = new Target() {
    @Override
    public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                FileOutputStream os = null;
                try {
                    String dir = CatnutUtils.mkdir(getActivity(), Constants.FANTASY_DIR); // check the exteral dir avaiable or not...
                    String[] paths = Uri.parse(mUrl).getPath().split("/");
                    mImage = new File(dir + File.separator + paths[2] + Constants.JPG); // resoleve the file name
                } catch (Exception e) { // the external storage not available...
                    Log.e(TAG, "create dir error!", e);
                    return;
                }
                try {
                    if (mImage.length() > 10) { // > 0 means the file exists
                        // the file exists, done.
                        mIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mImage));
                        mSaved = true;
                        return;
                    }
                    os = new FileOutputStream(mImage);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
                    mIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mImage));
                    mSaved = true;
                } catch (FileNotFoundException e) {
                    Log.e(TAG, "io error!", e);
                } finally {
                    if (os != null) {
                        try {
                            os.close();
                        } catch (IOException e) {
                            Log.e(TAG, "io closing error!", e);
                        }
                    }
                }
            }
        }).start();
        mFantasy.setImageBitmap(bitmap);
    }
@Override
    public void onBitmapFailed(Drawable errorDrawable) {
        mFantasy.setImageDrawable(errorDrawable);
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
        if (placeHolderDrawable != null) {
            mFantasy.setImageDrawable(placeHolderDrawable);
        }
    }
};

@Override
public void onPrepareOptionsMenu(Menu menu) {
    mShare.setEnabled(mSaved);
}

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fantasy, menu);
    mShare = menu.findItem(R.id.action_share);
    mShareActionProvider = (ShareActionProvider) mShare.getActionProvider();
    mShare.setActionProvider(mShareActionProvider);

    mShareActionProvider.setShareIntent(mIntent);
}
Run Code Online (Sandbox Code Playgroud)

最后,打电话Picasso.with(getActivity()).load(mUrl).into(target);

文件保存后,用户可以点击共享菜单进行共享。