安卓拍照应用显示空白页:Manifest与路径配置问题排查
我帮你梳理了几个关键问题,这些应该是导致相机无法正常工作、显示空白的主要原因:
1. Manifest配置的语法错误与权限缺失
你的Manifest里WRITE_EXTERNAL_STORAGE权限的标签写法有误,android:maxSdkVersion应该放在权限标签内部,而不是单独成行。另外,你还缺少了相机权限的声明,并且Android 6.0(API 23)及以上需要动态申请相机权限。
修正后的Manifest权限部分:
<uses-feature android:name="android.hardware.camera" android:required="true" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.lowcyandroidow.siekaczzdjecpro.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
动态权限申请代码(在调用拍照前添加):
private static final int REQUEST_CAMERA_PERMISSION = 2; // 调用拍照前先检查权限 private void checkCameraPermissionAndTakePhoto() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); } else { dispatchTakePictureIntent(); } } // 权限回调处理 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CAMERA_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { dispatchTakePictureIntent(); } else { Toast.makeText(this, "需要相机权限才能拍照", Toast.LENGTH_SHORT).show(); } } }
2. FileProvider路径配置错误
你在file_paths.xml里用了<files-path>,但代码里createImageFile()方法是用getExternalFilesDir()获取外部存储的目录,两者不匹配。<files-path>对应APP内部存储的/data/data/包名/files/目录,而你需要用<external-files-path>来匹配外部存储的Android/data/包名/files/目录。
修正后的file_paths.xml:
<?xml version="1.0" encoding="utf-8"?> <paths> <external-files-path name="my_images" path="Pictures" /> </paths>
3. onActivityResult处理逻辑错误
当你通过MediaStore.EXTRA_OUTPUT指定了图片保存路径后,系统不会把缩略图放到Intent的extras里,所以data.getExtras()会返回null,导致你无法获取图片显示。正确的做法是从你保存的mCurrentPhotoPath加载图片。
修正后的onActivityResult:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 注意:这里要保证REQUEST_TAKE_PHOTO和REQUEST_IMAGE_CAPTURE是同一个常量 if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) { // 从保存的路径加载图片 Bitmap imageBitmap = BitmapFactory.decodeFile(mCurrentPhotoPath); mImageView.setImageBitmap(imageBitmap); } }
4. 请求常量不一致问题
你的dispatchTakePictureIntent()里用的是REQUEST_TAKE_PHOTO,但onActivityResult()里判断的是REQUEST_IMAGE_CAPTURE,这两个必须是同一个常量,否则拍照完成后无法触发图片显示逻辑。确保你定义了统一的常量:
private static final int REQUEST_TAKE_PHOTO = 1;
把这些修改都应用后,应该就能解决相机空白、无法显示图片的问题了。
内容的提问来源于stack exchange,提问作者martin123154

