是否可以通过意图将图像作为参数传递给活动?

时间:2017-01-03 20:27:22

标签: android image android-intent

是否可以将Image作为额外内容传递给活动? 对于Strings,它以这种方式工作:

intent = new Intent(this, 2Activity.class);
intent.putExtra("String", "xy");
startActivity(intent);

这样可以为图像做到这一点吗?或者图像的记忆是一个问题吗?

4 个答案:

答案 0 :(得分:3)

通过intent传递的数据大小有限,所以它可能无效。执行此操作的常规方法是传递图像的文件名或resourceID。

答案 1 :(得分:1)

好问题。首先,没有Image类,所以我不确定这是否来自您所包含的库。你是说Bitmap吗?

答案一般不,你不能。该代码序列是一个进程间调用,它通过Android的binder内核驱动程序传递参数。参数的大小有1MiB的硬性限制。如果您保持图像较小,则可以考虑Bitmap是图像的未压缩表示,因此即使您认为合理大小的图像在内存中也会相当大。还要考虑1MiB缓冲区是与进程之间的所有IPC共享的。如果您的应用程序的某些其他组件正在执行IPC,则会减少可用的缓冲区。

考虑传递可用于读取图像数据的ParcelFileDescriptor,指向可以提供图像数据的内容提供商的content:// URI(请参阅openFile()),或者file:// URI指向文件系统上的图像数据。

答案 2 :(得分:1)

当然可以。无论是作为String,还是创建某种包装器并实现parcelable ......这就是说Bitmap已经是Parcelable ..

然而,不要这样做!这实际上花了我一次面试。如this question points out,限制为1MB。您的图像可能通过哪个。您应该做的是将其保存为文件并传递URI。或者将文件存储在应用程序层。传递URI,这是干净的方式。

SO answer for bad way

请参阅此SO for URI.

答案 3 :(得分:0)

正如其他人在此解释的那样,记忆将成为一个问题。要解决此问题,您可以将图像存储在散列映射中,并在片段和活动之间传递密钥。

您可以使用此包装类在内存中保存图像。

public class DataWrapper {
private static final DataWrapper instance = new DataWrapper();
private final SparseArray<Object> map = new SparseArray<Object>();
private int currentKeyValue = 1;

public static DataWrapper getInstance() {
    return instance;
}

public int putData(final Object data) {
    ++currentKeyValue;
    map.put(currentKeyValue, data);
    return currentKeyValue;
}

public Object getData(final int key) {
    final Object ret = map.get(key);
    map.delete(key);

    return ret;
}

}

你可以像这样把putData放到包装器中:

  final byte[] imageData;
  final int imageDataKey = DataWrapper.getInstance().putData(imageData);
  data.putExtra(EXTRA_IMAGE, imageDataKey);

你可以从包装器中获取getData:

final int imageDataKey = data.getIntExtra(CameraFragment.EXTRA_IMAGE, 0);
final byte[] data = (byte[]) DataWrapper.getInstance().getData(imageDataKey));