我怎样才能访问毕加索的缓存图像来制作共享意图?
我正在使用毕加索来帮助缓存图像。
问题是,我如何访问下载的图像来制作共享意图?
有任何想法吗? 谢谢!
我希望你能理解我的问题:-)
对不起,我迟到了,我找到了一个解决方案,但是,不是一个好的...
首先,我真的找了一会儿,看了毕加索的代码。 看起来你应该提供你自己的下载器和其他东西。 但是,为什么要使用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