Android : 不调用 Picasso onBitMapLoaded 加载图像
Android : Load image with Picasso onBitMapLoaded not called
我正在尝试在我的应用程序中在 Instagram 上分享图片。我有 url 个图像并使用 Picasso 库下载图像。
Target target = new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
Log.d(TAG, "Bitmap Loaded");
File outputDir = getApplicationContext().getCacheDir(); // context being the Activity pointer
try {
File outputFile = File.createTempFile("instagram", "png", outputDir);
outputFile.createNewFile();
FileOutputStream ostream = new FileOutputStream(outputFile);
bitmap.compress(Bitmap.CompressFormat.JPEG,100,ostream);
ostream.close();
Log.d(TAG, "Image downloaded");
shareOnInstagram(Uri.fromFile(outputFile));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
Picasso.with(this).load(imageUrl).into(target);
但是永远不会调用 onBitmapLoaded。有没有其他方法可以从 url 在 Instagram 上分享图片?在 Instagram 上分享的意图采用 Intent.EXTRA_STREAM
参数,该参数应该是 media path on device
。
如何将图像从 url 转换为该类型?
Picasso 仅保留对目标的弱引用,因此在您的情况下它将被垃圾收集。结果,没有调用 onBitmapLoaded。
您应该存储对目标的强引用(使目标成为您 class 的成员)。
我使用这种方法
public class ShareToOtherApp extends AsyncTask<Bitmap, Void, Uri> {
@Override
protected Uri doInBackground(Bitmap... bitmaps) {
return bitmaps.length > 0 ? BitmaptoUri(bitmaps[0]) : null;
}
@Override
protected void onPostExecute(Uri uri) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
if (uri != null) {
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
}
shareIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(shareIntent, "Share Image");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApp.GetContext().startActivity(chooserIntent);
}
public File GetSDCardDir(){
boolean ISSDCard;
File[] Dirs = ContextCompat.getExternalFilesDirs(MyApp.GetContext(), null);
ISSDCard = false;
for (File Dir : Dirs) {
if (Dir != null) {
if (Dir.getPath().contains("sdcard")) {
ISSDCard = true;
break;
}
}
}
File SDCardDir;
if(ISSDCard && Dirs[Dirs.length -1] != null){
SDCardDir = Dirs[Dirs.length -1];
}else{
SDCardDir = Dirs[0];
}
return SDCardDir;
}
public Uri BitmaptoUri(Bitmap bitmap){
Uri uri = null;
try {
File file = new File(GetSDCardDir() , HConstants.IMG_FILE_NAME + ".jpg");
if(file.getParentFile() != null){
file.getParentFile().mkdirs();
}else{
GetSDCardDir().mkdirs();
}
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.close();
uri = Uri.fromFile(file);
} catch (IOException e) {
e.printStackTrace();
}
return uri;
}
}
最后使用它。
new ShareToOtherApp().execute(bitmap);
我正在尝试在我的应用程序中在 Instagram 上分享图片。我有 url 个图像并使用 Picasso 库下载图像。
Target target = new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
Log.d(TAG, "Bitmap Loaded");
File outputDir = getApplicationContext().getCacheDir(); // context being the Activity pointer
try {
File outputFile = File.createTempFile("instagram", "png", outputDir);
outputFile.createNewFile();
FileOutputStream ostream = new FileOutputStream(outputFile);
bitmap.compress(Bitmap.CompressFormat.JPEG,100,ostream);
ostream.close();
Log.d(TAG, "Image downloaded");
shareOnInstagram(Uri.fromFile(outputFile));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
Picasso.with(this).load(imageUrl).into(target);
但是永远不会调用 onBitmapLoaded。有没有其他方法可以从 url 在 Instagram 上分享图片?在 Instagram 上分享的意图采用 Intent.EXTRA_STREAM
参数,该参数应该是 media path on device
。
如何将图像从 url 转换为该类型?
Picasso 仅保留对目标的弱引用,因此在您的情况下它将被垃圾收集。结果,没有调用 onBitmapLoaded。
您应该存储对目标的强引用(使目标成为您 class 的成员)。
我使用这种方法
public class ShareToOtherApp extends AsyncTask<Bitmap, Void, Uri> {
@Override
protected Uri doInBackground(Bitmap... bitmaps) {
return bitmaps.length > 0 ? BitmaptoUri(bitmaps[0]) : null;
}
@Override
protected void onPostExecute(Uri uri) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
if (uri != null) {
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
}
shareIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(shareIntent, "Share Image");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApp.GetContext().startActivity(chooserIntent);
}
public File GetSDCardDir(){
boolean ISSDCard;
File[] Dirs = ContextCompat.getExternalFilesDirs(MyApp.GetContext(), null);
ISSDCard = false;
for (File Dir : Dirs) {
if (Dir != null) {
if (Dir.getPath().contains("sdcard")) {
ISSDCard = true;
break;
}
}
}
File SDCardDir;
if(ISSDCard && Dirs[Dirs.length -1] != null){
SDCardDir = Dirs[Dirs.length -1];
}else{
SDCardDir = Dirs[0];
}
return SDCardDir;
}
public Uri BitmaptoUri(Bitmap bitmap){
Uri uri = null;
try {
File file = new File(GetSDCardDir() , HConstants.IMG_FILE_NAME + ".jpg");
if(file.getParentFile() != null){
file.getParentFile().mkdirs();
}else{
GetSDCardDir().mkdirs();
}
file.createNewFile();
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.close();
uri = Uri.fromFile(file);
} catch (IOException e) {
e.printStackTrace();
}
return uri;
}
}
最后使用它。
new ShareToOtherApp().execute(bitmap);