【发布时间】:2016-07-24 11:18:07
【问题描述】:
我想将我的图像从一个活动传递到另一个活动。起初我试图用我的图像的 base64 字符串来做到这一点。但这仅适用于小图片。它适用于 400 kb,但不适用于 600 kb。有一个更好的方法吗?顺便说一句,我没有在本地保存图像,我从服务器获取图像,所以我没有真正的 Drawable。
【问题讨论】:
标签: android android-intent android-activity drawable
我想将我的图像从一个活动传递到另一个活动。起初我试图用我的图像的 base64 字符串来做到这一点。但这仅适用于小图片。它适用于 400 kb,但不适用于 600 kb。有一个更好的方法吗?顺便说一句,我没有在本地保存图像,我从服务器获取图像,所以我没有真正的 Drawable。
【问题讨论】:
标签: android android-intent android-activity drawable
如果你只有远程 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"));
【讨论】:
尽管在 android 中通过 Intent 传递大“块”数据有点不鼓励(使用单例或将图像存储在内部存储器中等),但您可以通过以下方式实现:
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 上测试)。 check this external reference
有时,位图可能太大而无法处理,从而导致OOM(我过去曾遇到过这种情况)或导致糟糕的UI体验。
2 - 如果您的活动因任何原因崩溃,从而导致应用程序崩溃,您将丢失图像,因为它存储在临时内存中。如果您将其保存在内部,您可以即使应用程序崩溃,也要保留图像。
一般来说,最佳做法是在需要时处理图像,将其存储在设备文件夹(可以是内部或外部存储器)中,然后在需要时再次检索它以进行更多处理。这样可以避免在整个应用程序中分配不必要的内存。
【讨论】:
此外,您还可以使用第三方库,例如 Picasso 或 Glide。我个人喜欢 Glide,因为它的性能比其他任何产品都好。
【讨论】: