Android | 使用意图传递图片

3

我希望能够在不同的Activity之间传递我的图片。最初,我尝试使用图片的base64字符串来实现这一点。但是,这种方法只适用于小图片。虽然400kb的图片可以传输成功,但600kb的图片传输失败了。那么,有没有更好的方法呢?顺便说一下,我并没有将图片保存在本地,而是从服务器上获取图片,因此我没有真正的Drawable对象。

3个回答

5

如果你只有远程URL,那么你可以直接分享它,否则你可以将图片保存在本地媒体库中,然后分享它的本地URL。类似这样:

Bitmap bitmap = ...
String path = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Image Description", null);
Uri uri = Uri.parse(path);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, "Share Image"));

谢谢,它可以工作!但是图像的质量不如原来的好。你有解决方法吗?@manfcas - user6586661

3
尽管在Android中通过意图传递大量数据块有些不鼓励(使用单例或将图像存储在内部存储器中等),但您可以通过以下方式实现:

1 - 在发送方活动中:

Intent yourIntent = new Intent(YourActivity.this, DestinationActivity.class);
Bitmap bmp; // store the image in your bitmap 
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 50, baos);
yourIntent.putExtra("yourImage", baos.toByteArray());
startActivity(yourIntent);

2 - 在您的接收器活动中

// parse the intent onCreate()
if(getIntent().hasExtra("yourImage")) {
    ImageView iv = new ImageView(this);
    Bitmap bmp = BitmapFactory.decodeByteArray(getIntent().getByteArrayExtra("yourImage"), 0, getIntent().getByteArrayExtra("yourImage").length);        
    iv.setImageBitmap(bmp);
}

强烈不建议您这样做,因为:
1-传递数据的意图存在内存限制。使用Intent传输的数据量最大为500KB(在API 10、16、19和23上测试)。检查此外部参考 有时,位图可能太大而无法处理,从而导致OOM(我过去曾经历过这种情况),或者导致糟糕的UI体验。
2-如果您的活动由于任何原因崩溃,从而导致应用程序崩溃,您将丢失图片,因为它存储在临时内存中。如果您将其保存在内部,则即使应用程序崩溃,也可以保留该图像。
通常最佳实践是在需要时处理图像,将其存储在设备文件夹中(可以是内部或外部存储器),以后需要时再次检索进行更多处理。这样可以避免在整个应用程序中进行不必要的内存分配。

0

此外,您还可以使用像Picasso或Glide这样的第三方库。我个人更喜欢Glide,因为它在性能方面比其他任何库都要好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接