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
相关产品推荐
相关产品推荐

