Android按钮onClick方法失效 无法拉起相册选视频上传Firebase
Android 相册选视频功能无法拉起选择器修复方案
问题根因
功能失效核心是3个配置错误:
- 权限适配错误:Android 13(API 级别33)及以上版本,读取设备存储的视频文件不再需要
READ_EXTERNAL_STORAGE权限,必须申请READ_MEDIA_VIDEO权限。你现有代码只申请了旧版存储权限,高版本系统会直接静默拒绝权限请求,而你在onPermissionDenied回调里没有做任何提示或处理,后续启动选择器的逻辑根本不会执行——这和你贴的日志只有按钮点击触摸记录、没有系统Activity启动记录的表现完全吻合。 - 选择器Intent配置不规范:你构造的
ACTION_GET_CONTENT意图没有添加CATEGORY_OPENABLE分类标记,部分定制ROM上会因为找不到匹配的文件处理Activity,导致选择器无响应。 - 上下文使用不当:权限申请和启动系统页面时使用了
getApplicationContext(),部分系统版本下应用上下文启动系统页面会被系统拦截。
具体修复步骤
1. 补全清单文件权限配置
在AndroidManifest.xml的<manifest>节点下添加全版本适配的权限声明:
<!-- Android 12及以下版本读取存储需要 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 13及以上版本读取视频文件需要 --> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
2. 修正按钮点击逻辑
替换原有browse按钮的点击监听代码,适配版本权限、修正Intent配置、替换为Activity上下文:
browse.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 根据系统版本选择需要申请的权限 String targetPermission; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { targetPermission = Manifest.permission.READ_MEDIA_VIDEO; } else { targetPermission = Manifest.permission.READ_EXTERNAL_STORAGE; } Dexter.withContext(YourActivityName.this) // 替换为你当前的Activity类名 .withPermission(targetPermission) .withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) { Intent selectIntent = new Intent(Intent.ACTION_GET_CONTENT); selectIntent.setType("video/*"); selectIntent.addCategory(Intent.CATEGORY_OPENABLE); // 只展示可正常打开的视频文件 // 用系统选择器包装Intent,避免设备无匹配应用时无响应 startActivityForResult( Intent.createChooser(selectIntent, "选择待上传视频"), 101 ); } @Override public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) { Toast.makeText(YourActivityName.this, "需授予存储权限才能选择视频", Toast.LENGTH_SHORT).show(); } @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) { permissionToken.continuePermissionRequest(); } }).check(); } });
3. 兼容优化返回结果逻辑
给onActivityResult增加空值判断,避免用户中途取消选择时触发空指针,可选加选完自动播放预览的逻辑:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 101 && resultCode == RESULT_OK && data != null && data.getData() != null) { uri = data.getData(); reel.setVideoURI(uri); reel.start(); // 选中视频后自动开始预览播放 } }
补充提示:
startActivityForResult属于已废弃API,如果你的应用targetSdkVersion升级到33及以上,建议后续替换为官方推荐的Activity Result API,长期兼容性更好。
内容的提问来源于stack exchange,提问作者Panchumarthi Abhinav
相关产品推荐
相关产品推荐

