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

时间:2014-02-28 10:36:24

标签: android picasso

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

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

任何想法?谢谢!

3 个答案:

答案 0 :(得分:4)

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

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

首先,我真的搜索了一会儿,看了毕加索的代码。看起来你应该提供自己的下载器和其他东西。但是,为什么我要使用lib ...

然后,我认为Picasso的设计/架构只是将文件缓存在内部存储中。也许是因为外部存储并不总是可用(比如用户可能将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);
}

最后,请致电Picasso.with(getActivity()).load(mUrl).into(target);

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

答案 1 :(得分:1)

public static File getImageFile(Context context, String url)
{
    final String CACHE_PATH = context.getCacheDir().getAbsolutePath() + "/picasso-cache/";

    File[] files=new File(CACHE_PATH).listFiles();
    for (File file:files)
    {
        String fname= file.getName();
        if (fname.contains(".") && fname.substring(fname.lastIndexOf(".")).equals(".0"))
        {
            try
            {
                BufferedReader br=new BufferedReader(new FileReader(file));
                if (br.readLine().equals(url))
                {
                    File imgfile= new File(CACHE_PATH + fname.replace(".0", ".1"));     

                    if (imgfile.exists())
                    {
                        return imgfile;
                    }
                }
            }
            catch (FileNotFoundException|IOException e)
            {
            }
        }
    }
    return null;
}
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(getImageFile(getActivity(),IMAGE_HTTP_URL)));

答案 2 :(得分:0)

我刚刚找到了一个非常好的解决方案。

https://guides.codepath.com/android/Sharing-Content-with-Intents

代码将是这样的:

// Can be triggered by a view event such as a button press
public void onShareItem(View v) {
    // Get access to bitmap image from view
    ImageView ivImage = (ImageView) findViewById(R.id.ivResult);
    // Get access to the URI for the bitmap
    Uri bmpUri = getLocalBitmapUri(ivImage);
    if (bmpUri != null) {
        // Construct a ShareIntent with link to image
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
        shareIntent.setType("image/*");
        // Launch sharing dialog for image
        startActivity(Intent.createChooser(shareIntent, "Share Image"));    
    } else {
        // ...sharing failed, handle error
    }
}

// Returns the URI path to the Bitmap displayed in specified ImageView
public Uri getLocalBitmapUri(ImageView imageView) {
    // Extract Bitmap from ImageView drawable
    Drawable drawable = imageView.getDrawable();
    Bitmap bmp = null;
    if (drawable instanceof BitmapDrawable){
       bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
    } else {
       return null;
    }
    // Store image to default external storage directory
    Uri bmpUri = null;
    try {
        File file =  new File(Environment.getExternalStoragePublicDirectory(  
            Environment.DIRECTORY_DOWNLOADS), "share_image_" + System.currentTimeMillis() + ".png");
        file.getParentFile().mkdirs();
        FileOutputStream out = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
        out.close();
        bmpUri = Uri.fromFile(file);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bmpUri;
}

它主要包括从imageview中检索位图并将其保存到本地临时文件,然后使用它进行共享。我已经对它进行了测试,似乎工作正常。