Android Studio中如何将Bitmap从第二个Activity回传至第一个Activity
问题分析
你当前的代码存在两个核心问题:
- Bitmap传递方式错误:
bitmap.toString()返回的是对象的内存地址字符串,并非可解析的图像Uri或数据,所以第一个Activity无法通过它获取到有效图像。 - 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
相关产品推荐
相关产品推荐

