主活动启动即调用相机Intent,拍照后无法返回主活动求助
问题分析与解决方案
这个问题我之前踩过坑,核心问题出在你启动相机Intent的时机上——你把这段逻辑放在了onStart()方法里,而onStart()的生命周期特性刚好导致了这个现象。
为什么会停留在相机应用?
Android中onStart()方法的触发时机是:每次Activity从不可见状态变为可见状态时都会调用。当你拍完照片点击返回时,主Activity会重新回到前台,这时候onStart()会再次执行,又一次启动了相机Intent,所以你看起来像是一直停留在相机里,实际上是刚返回主Activity就又被拉去相机了。
两种可行的解决方案
方案1:把相机启动逻辑移到onCreate()中
onCreate()只会在Activity首次创建时执行一次,这样就不会出现返回后重复启动相机的问题:
final int REQUEST_TAKE_IMAGE = 1; ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); // 将启动相机的代码移到这里 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if(intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_TAKE_IMAGE); } } @Override protected void onStart() { super.onStart(); // 移除原本这里的相机启动逻辑 } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == REQUEST_TAKE_IMAGE){ if(resultCode == RESULT_OK){ assert data != null; Bundle extras = data.getExtras(); assert extras != null; Bitmap bitmap = (Bitmap) extras.get("data"); imageView.setImageBitmap(bitmap); } } }
方案2:添加标记变量避免重复触发
如果你确实需要在onStart()中执行(比如要求每次进入Activity都触发拍照),可以用一个布尔变量标记是否已经启动过相机,防止重复执行:
final int REQUEST_TAKE_IMAGE = 1; ImageView imageView; private boolean hasLaunchedCamera = false; // 新增标记变量 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); } @Override protected void onStart() { super.onStart(); // 仅当未启动过相机时执行 if(!hasLaunchedCamera) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if(intent.resolveActivity(getPackageManager()) != null) { hasLaunchedCamera = true; // 标记为已启动 startActivityForResult(intent, REQUEST_TAKE_IMAGE); } } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == REQUEST_TAKE_IMAGE){ if(resultCode == RESULT_OK){ assert data != null; Bundle extras = data.getExtras(); assert extras != null; Bitmap bitmap = (Bitmap) extras.get("data"); imageView.setImageBitmap(bitmap); } // 如果需要下次进入Activity时再次触发拍照,在这里重置标记 // hasLaunchedCamera = false; } }
额外提醒
注意MediaStore.ACTION_IMAGE_CAPTURE返回的是缩略图,如果需要获取完整尺寸的照片,还需要指定照片保存的Uri,不过这是另一个话题了,当前问题的核心还是生命周期的时机问题。
内容的提问来源于stack exchange,提问作者Wotex
相关产品推荐
相关产品推荐

