我怎样才能访问毕加索的缓存图像来制作共享意图?

我正在使用毕加索来帮助缓存图像。

问题是,我如何访问下载的图像来制作共享意图?

有任何想法吗? 谢谢!


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

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

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

然后,我想这是毕加索的设计/架构,只是将文件缓存在内部存储器中。 也许是因为外部存储并不总是可用的(比如用户可能会将他的SD卡插入到他的计算机中),或者可能是因为外部存储没有内部那么快......这是我的猜测。 总之,其他应用程序无法访问当前应用程序的内部存储,因此共享无法完成。

因此,我做了一个非常普通的解决方案。 我只是等待毕加索提供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);

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


我刚刚发现了这个指南,提供了一个非常好的解决方案。

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中检索位图并将其保存到本地临时文件,然后将其用于共享。 我测试过了,它似乎工作正常。

链接地址: http://www.djcxy.com/p/19289.html

上一篇: how can I access Picasso' s cached image to make a share intent?

下一篇: Angularjs adding dynamically form fields in various forms