You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何将Bitmap从第二个Activity回传至第一个Activity

问题分析

你当前的代码存在两个核心问题:

  1. Bitmap传递方式错误:bitmap.toString()返回的是对象的内存地址字符串,并非可解析的图像Uri或数据,所以第一个Activity无法通过它获取到有效图像。
  2. Activity启动逻辑错误:直接调用startActivity启动MainActivity会创建一个全新的实例,而非回到原来的第一个Activity实例,自然无法在原ImageView中显示图像。
解决方案

推荐使用Activity Result API(替代已过时的startActivityForResult)来实现Activity间的结果回传,以下提供两种可行方案:

方案一:直接传递Bitmap(适合小尺寸图像)

Bitmap实现了Parcelable接口,可以直接通过Intent的putParcelableExtra传递。

第一个Activity(MainActivity)代码修改

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    ImageView image;
    // 注册Activity结果回调
    private final ActivityResultLauncher<Intent> secondActivityLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                    // 获取返回的Bitmap
                    Bitmap bitmap = result.getData().getParcelableExtra("signature_bitmap");
                    if (bitmap != null) {
                        image.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 374, 500, false));
                    }
                }
            }
    );

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btnNext = findViewById(R.id.btnNext);
        image = findViewById(R.id.imgUri);

        btnNext.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            // 用注册的Launcher启动第二个Activity
            secondActivityLauncher.launch(intent);
        });
    }
}

第二个Activity(SecondActivity)代码修改

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.accomplished_signature);

        SignaturePad signaturePad = findViewById(R.id.signature_pad);
        Button buttonSignature = findViewById(R.id.btnSubmit);
        Button buttonClear = findViewById(R.id.btnClear);

        buttonClear.setOnClickListener(v -> signaturePad.clear());

        buttonSignature.setOnClickListener(v -> {
            Bitmap bitmap = signaturePad.getSignatureBitmap();
            // 创建返回结果的Intent
            Intent resultIntent = new Intent();
            resultIntent.putExtra("signature_bitmap", bitmap);
            // 设置结果并关闭当前Activity
            setResult(RESULT_OK, resultIntent);
            finish();
            signaturePad.clear();
        });
    }
}

方案二:保存Bitmap到本地再传递路径(适合大尺寸图像)

如果Bitmap尺寸较大,直接传递可能导致内存问题,建议先将Bitmap保存到应用缓存目录,再传递文件路径。

第二个Activity中添加保存Bitmap的方法

private String saveBitmapToCache(Bitmap bitmap) {
    File cacheDir = getExternalCacheDir();
    File imageFile = new File(cacheDir, "signature_" + System.currentTimeMillis() + ".png");
    try (FileOutputStream fos = new FileOutputStream(imageFile)) {
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        return imageFile.getAbsolutePath();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

修改第二个Activity的提交按钮逻辑

buttonSignature.setOnClickListener(v -> {
    Bitmap bitmap = signaturePad.getSignatureBitmap();
    String imagePath = saveBitmapToCache(bitmap);
    if (imagePath != null) {
        Intent resultIntent = new Intent();
        resultIntent.putExtra("signature_path", imagePath);
        setResult(RESULT_OK, resultIntent);
        finish();
        signaturePad.clear();
    }
});

修改第一个Activity的结果回调

private final ActivityResultLauncher<Intent> secondActivityLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                String imagePath = result.getData().getStringExtra("signature_path");
                if (imagePath != null) {
                    Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
                    image.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 374, 500, false));
                }
            }
        }
);
注意事项
  • 方案一中,若Bitmap过大可能触发TransactionTooLargeException,此时优先选择方案二。
  • 应用缓存目录的文件无需手动申请存储权限(Android 10及以上),系统会自动管理。

内容的提问来源于stack exchange,提问作者marivic valdehueza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:57:27