Android相机拍照无日志输出:ActivityResult使用问题排查
相机拍摄后无日志输出的问题排查与解决
我在Android中尝试调用相机拍摄照片并打印日志,相机功能可正常使用,能成功拍摄照片,但拍摄完成后没有日志输出,推测是ActivityResult部分的代码存在问题。以下是我的代码:
public class CameraActivity extends AppCompatActivity { private static final String TAG = "CameraActivity"; private static final int ACTIVITY_NUMBER = 2; //Used to identify the activity private static final int PERMISSION_REQUEST_CODE = 1; //Used to request permission to the user private Context context = CameraActivity.this; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); Log.d(TAG, "onCreate: started."); //Check for permissions if(Permissions.checkPermissionsArray(context, Permissions.PERMISSIONS_CAMERA)){ ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { Log.d("dd", "ee"); } } ); Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(cameraIntent); } else { Permissions.requestPermissions(this, Permissions.PERMISSIONS_CAMERA, PERMISSION_REQUEST_CODE); } setupBottomNavigationView(); }
问题原因
- 未使用
ActivityResultLauncher启动相机:你虽然注册了ActivityResultLauncher,但实际启动相机用的是旧版的startActivity(cameraIntent),而非activityResultLauncher.launch(cameraIntent)。这会导致相机返回结果时,无法触发你定义的回调方法,自然没有日志输出。 ActivityResultLauncher作用域不当:你把它定义在权限判断的if代码块内部,虽然当前不会立刻出问题,但这种写法不符合最佳实践,容易因作用域或生命周期问题导致回调失效。
修复方案
调整代码要点
- 将
ActivityResultLauncher声明为Activity的成员变量,提前在onCreate中完成注册,不要放在权限判断的代码块里。 - 使用
launch()方法启动相机意图,替换旧的startActivity()。 - 补充权限申请结果的处理逻辑,确保用户授予权限后能正常启动相机。
修复后的完整代码
public class CameraActivity extends AppCompatActivity { private static final String TAG = "CameraActivity"; private static final int PERMISSION_REQUEST_CODE = 1; // 声明为成员变量,保证作用域覆盖整个Activity生命周期 private ActivityResultLauncher<Intent> cameraResultLauncher; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); Log.d(TAG, "onCreate: started."); // 提前注册ActivityResult回调 cameraResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { Log.d("dd", "ee"); // 可选:处理返回的缩略图 if (result.getResultCode() == RESULT_OK && result.getData() != null) { Bitmap imageBitmap = (Bitmap) result.getData().getExtras().get("data"); // 这里可以添加图片展示或保存逻辑 } } ); // 权限检查与相机启动 if(Permissions.checkPermissionsArray(this, Permissions.PERMISSIONS_CAMERA)){ launchCamera(); } else { Permissions.requestPermissions(this, Permissions.PERMISSIONS_CAMERA, PERMISSION_REQUEST_CODE); } setupBottomNavigationView(); } // 封装相机启动逻辑 private void launchCamera() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 使用ActivityResultLauncher启动意图 cameraResultLauncher.launch(cameraIntent); } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { boolean allPermissionsGranted = true; for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allPermissionsGranted = false; break; } } if (allPermissionsGranted) { launchCamera(); } else { Toast.makeText(this, "相机权限被拒绝,无法使用拍摄功能", Toast.LENGTH_SHORT).show(); } } } }
内容的提问来源于stack exchange,提问作者SKAE
相关产品推荐
相关产品推荐

