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

Android开发:Activity获取RESULT_CANCELED而非RESULT_OK的问题解决

问题修复方案

1. 移除无效代码,调整相机启动时机

你当前重写的onActivityResult方法完全无用——从MainActivity启动MLTrimVideo用的是startActivity,并未请求返回结果,所以这个方法不会被触发,相机根本没机会启动。

需要把启动相机的逻辑放到用户触发事件中,比如添加按钮点击:

  • 先在布局文件中添加按钮:
<Button
    android:id="@+id/btn_record_video"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="录制视频"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"/>
  • 然后在MLTrimVideo的onCreate方法中绑定点击事件:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mltrim_video);
    videoView = findViewById(R.id.ml_video_view);
    mediaController = new MediaController(this);

    // 绑定按钮点击,触发相机启动逻辑
    findViewById(R.id.btn_record_video).setOnClickListener(v -> {
        checkPermissionsAndLaunchCamera();
    });
}

2. 添加动态权限申请

录制视频需要CAMERA和RECORD_AUDIO权限,Android 6.0(API 23)及以上必须动态申请:

  • 注册权限请求的ActivityResultLauncher:
// 权限请求Launcher
ActivityResultLauncher<String[]> requestPermissionsLauncher = registerForActivityResult(
        new ActivityResultContracts.RequestMultiplePermissions(),
        permissions -> {
            boolean allGranted = true;
            for (Boolean granted : permissions.values()) {
                allGranted &= granted;
            }
            if (allGranted) {
                launchCamera();
            } else {
                Toast.makeText(this, "需要相机和录音权限才能录制视频", Toast.LENGTH_SHORT).show();
            }
        }
);
  • 编写权限检查和相机启动方法:
private void checkPermissionsAndLaunchCamera() {
    String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO};
    boolean cameraGranted = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
    boolean audioGranted = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;

    if (cameraGranted && audioGranted) {
        launchCamera();
    } else {
        requestPermissionsLauncher.launch(permissions);
    }
}

private void launchCamera() {
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    // 设置视频时长限制
    intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30);
    // 检查是否有可用应用处理相机Intent
    if (intent.resolveActivity(getPackageManager()) != null) {
        takeOrSelectVideoResultLauncher.launch(intent);
    } else {
        Toast.makeText(this, "没有可用的相机应用", Toast.LENGTH_SHORT).show();
    }
}

3. 完善回调逻辑,处理返回视频

在takeOrSelectVideoResultLauncher的回调中正确处理返回结果:

ActivityResultLauncher<Intent> takeOrSelectVideoResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
                Uri videoUri = result.getData().getData();
                // 播放录制完成的视频
                videoView.setMediaController(mediaController);
                videoView.setVideoURI(videoUri);
                videoView.start();
            } else if (result.getResultCode() == Activity.RESULT_CANCELED) {
                Toast.makeText(this, "录制已取消", Toast.LENGTH_SHORT).show();
            }
        }
);

4. 在Manifest中声明权限

打开AndroidManifest.xml,添加必要权限声明:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:31:17