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

安卓拍照应用显示空白页: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:50:06