Android 安卓|有目的地提供图像

Android 安卓|有目的地提供图像,android,android-intent,android-activity,drawable,Android,Android Intent,Android Activity,Drawable,我想将我的图像从一个活动传递到另一个活动。起初,我试图用我的图像的base64字符串来实现这一点。但这只适用于小图片。它可以使用400KB,但不能使用600KB。有更好的方法吗?顺便说一句,我不在本地保存图像,而是从服务器获取图像,因此我没有真正的可绘制图像。如果您只有远程URL,那么您可以直接共享它,否则您可以将图像保存在本地媒体存储中,然后共享其本地URL。比如: Bitmap bitmap = ... String path = MediaStore.Images.Media.insert

我想将我的图像从一个活动传递到另一个活动。起初,我试图用我的图像的base64字符串来实现这一点。但这只适用于小图片。它可以使用400KB,但不能使用600KB。有更好的方法吗?顺便说一句,我不在本地保存图像,而是从服务器获取图像,因此我没有真正的可绘制图像。

如果您只有远程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);
// 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);
}
2-关于你的接收者活动

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);
// 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-如果您的活动因任何原因崩溃,从而导致应用程序崩溃,您将丢失映像,因为它存储在临时内存中。如果在内部保存映像,即使应用程序崩溃,您也可以保留映像


一般最佳做法是在需要时处理图像,将其存储在设备文件夹(可以是内部或外部内存)中,然后在需要时再次检索以进行更多处理。这样可以避免在整个应用程序中分配不必要的内存。

谢谢,这很有效!但是图像的质量并没有原来的好。你有解决这个问题的办法吗@manfcas