【问题标题】:Intent seems not sent between activity活动之间似乎没有发送意图
【发布时间】:2015-07-30 15:06:49
【问题描述】:

我编写了一个包含 2 个活动的应用程序。一个活动拍了一张照片,第二个活动使用了一些过滤器。

活动一:

Intent FilterSelectionIntent = new Intent(getActivity(), PulsFiltersActivity.class);
FilterSelectionIntent.putExtra("PicTaken", currentBitmap);
startActivity(FilterSelectionIntent);

活动 2:

    Bundle bd = intent.getExtras();
    mBitmap = bd.getParcelable("PicTaken");

我在 Activity 2 中设置了一些断点,它从未停止过。只要我在评论中评论“putExtra”,我就可以到达断点。就我而言,活动没有开始,我认为意图是错误的。

我知道一种解决方案是使用 Bitmap.compress 并将结果转发到输出流中。但就我而言,这需要太多时间。我的 android 设备是一个非常基本的设备,保存 bmp 需要 2 秒。这就是为什么我尝试使用意图来传递参数但它似乎不起作用。

我也可以将 bmp 保存为 tmp 文件,但我可能会丢失 2 秒。

任何想法。

【问题讨论】:

  • 意图意图 = getIntent();位图bitmap = (Bitmap) intent.getParcelableExtra("PicTaken");
  • 最好的方法是作为 byteArray 传递
  • @sanatshukla 你的链接很完美
  • 检查下面的答案。也是可以的。

标签: android android-intent android-bitmap


【解决方案1】:

Bitmap 实现 Parcelable,因此您可以随时在 Intent 中传递它:

Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("BitmapImg", bitmap);

并在另一端检索它:

Intent intent = getIntent();
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImg");

在这里查看:How can I pass a Bitmap object from one activity to another

【讨论】:

    【解决方案2】:

    我认为您混淆了一些发送对象的概念。在您的Activity 1 中,您将额外内容直接放入意图中。在Activity 2 中,您尝试从Bundle 中取回它,您没有将Bitmap 放入其中。所以在你的活动 2 中试试这个:

    mBitmap = (Bitmap) intent.getParcelableExtra("PicTaken");
    

    编辑:我发现一些关于位图太大而无法发送的报告,并且在发送位图时活动没有启动。 Converting them to ByteArray may help.

    【讨论】:

      【解决方案3】:

      您也可以像这样将位图存储到内部存储中:

          final static String IMG_PATH= "bmp2Store"
          FileOutputStream streamOut;
          Bitmap image = currentBitmap;
          try {
                  // Store bitmap into internal storage
                  streamOut = mContext.openFileOutput(IMG_PATH, Context.MODE_PRIVATE);
                  image.compress(Bitmap.CompressFormat.PNG, 100, streamOut);
                  streamOut.close();
      
                  // Call ActivityB
                  Intent intent= new Intent(this, ConsumirOfertaActivity.class);
                  startActivity(intent);
           } catch (FileNotFoundException e) {
                  e.printStackTrace();
           } catch (IOException e){
                  e.printStackTrace();
           }
      

      在活动B中:

          final static String IMG_PATH= "bmp2Store"
          Bitmap bitmap;
          FileInputStream streamIn;
      
          try {
              streamIn = openFileInput(IMG_PATH);
              bitmap = BitmapFactory.decodeStream(streamIn);
              streamIn.close();
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
      

      【讨论】:

        【解决方案4】:

        你不应该在包内传递位图:

        您可以通过 Bundle 或 Intent 传递的数据的大小非常小 (~1MB)。考虑到像 Bitmap 这样的对象,分配给它的内存很有可能大于 1MB。这可能发生在任何类型的对象上,包括字节数组、字符串等。

        解决方案: 在启动 Activity B 之前,将您的位图存储到 File、FileProvider、Singleton(当然是 WeakReference)类等中,并在 Bundle 中仅将 URI 作为参数传递。

        还可以查看以下帖子: Intent.putExtras size limit?Maximum length of Intent putExtra method? (Force close)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-03
          • 2016-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多