我希望你能理解我的问题:-)
抱歉我的延迟,我找到了解决方案,但是不是一个好的解决方案......
首先,我确实搜索了一段时间,看了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);
文件保存后,用户可以点击共享菜单进行共享。