【问题标题】:Is it possible to pass image as argument through intent to activity?是否可以通过意图将图像作为参数传递给活动?
【发布时间】:2017-01-03 20:27:21
【问题描述】:

是否可以将Image 作为附加项传递给活动?
对于字符串,它是这样工作的:

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

那么可以为图像做到这一点吗?还是图像的记忆有问题?

【问题讨论】:

标签: android image android-intent


【解决方案1】:

通过 Intent 传递的数据大小有限制,因此它可能不起作用。执行此操作的正常方法是传递图像的文件名或资源 ID。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      当然可以。要么作为一个字符串,要么创建某种包装器并实现 parcelable ......也就是说 Bitmap 已经是 Parcelable ......

      但是不要这样做!这实际上让我失去了一次工作面试。 this question points out 有 1MB 的限制。您的图像可能会通过。您应该做的是将其保存为文件并传递 URI。或者将文件存储在应用层。传递 URI,这是干净的方式。

      看到这个SO answer for bad way

      看到这个SO for URI.

      【讨论】:

      • Android 的 Bitmap 已经是 Parcelable。如果数据不是Bitmap,您已经可以将byte[] 放入可打包的Bundle
      • @JeffreyBlattman 是的,我正要进行编辑。很好的收获。
      【解决方案4】:

      正如其他人在这里解释的那样,内存将是一个问题。要解决这个问题,您可以将图像存储在哈希图中并在片段和活动之间传递密钥。

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

      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;
      }
      

      }

      您可以像这样将数据放入包装器中:

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

      您可以像这样从包装器中获取数据:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        相关资源
        最近更新 更多