Intent 似乎未在 activity 之间发送

Intent seems not sent between activity

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

Activity 1:

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" ,我就可以到达断点。就我而言,activity 没有启动,我认为意图是错误的。

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

我也愿意将 bmp 保存为 tmp 文件,但我可能会损失 2 秒。

任何想法。

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

中试试这个
mBitmap = (Bitmap) intent.getParcelableExtra("PicTaken");

编辑:我发现一些关于位图太大而无法发送以及发送位图时活动未启动的报告。 Converting them to ByteArray may help.

Bitmap 实现了 Parcelable,因此您始终可以在意图中传递它:

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

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

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

你不应该在 bundle 中传递位图:

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

解法: 将位图存储到 File、FileProvider、Singleton(当然作为 WeakReference)class 等,然后再开始 Activity B,并仅将 URI 作为 Bundle 中的参数传递。

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