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

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代码块内部,虽然当前不会立刻出问题,但这种写法不符合最佳实践,容易因作用域或生命周期问题导致回调失效。

修复方案

调整代码要点

  1. 将ActivityResultLauncher声明为Activity的成员变量,提前在onCreate中完成注册,不要放在权限判断的代码块里。
  2. 使用launch()方法启动相机意图,替换旧的startActivity()。
  3. 补充权限申请结果的处理逻辑,确保用户授予权限后能正常启动相机。

修复后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:35:23