首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 調用系統相機拍照並顯示:權限與 FileProvider 完整方案

     編輯:程式設計疑難解答

崩潰原因

清單文件缺少相機權限或 `FileProvider` 配置,導致 `Uri.fromFile` 在 Android 7+ 拋 `FileUriExposedException`,或無權寫入外部存儲。

完整實現步驟

  1. AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application ...>
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
</application>
  1. res/xml/file_paths.xml:
<paths>
    <external-files-path name="photos" path="Pictures/" />
</paths>
  1. 拍照 Intent:
File photoFile = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "IMG_" + System.currentTimeMillis() + ".jpg");
Uri photoUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", photoFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(intent, REQUEST_TAKE_PHOTO);
  1. onActivityResult 直接使用 `photoFile` 路徑載入縮略圖顯示,無需再次解析 Uri。

關鍵點

  • 使用 `getExternalFilesDir` 目錄無需運行時權限(應用專屬目錄)。
  • `FileProvider` 解決 Android 7+ `file://` Uri 禁用問題。
  • 清單權限 `CAMERA`、`WRITE_EXTERNAL_STORAGE`(API 28 以下)必加。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved