1. 程式人生 > >Android 7.0呼叫相機拍照 報錯 FileUriExposedException

Android 7.0呼叫相機拍照 報錯 FileUriExposedException

摘自郭霖 《第一行程式碼》

從Android 7.0系統開始,直接使用本地真實路徑的Uri,被認為是不安全的,會丟擲一個FileUriExposedException異常,,而FileProvider則是一種特殊的內容提供器,它使用了和內容提供器類似的機制來對資料進行保護,可以選擇行地將封裝過的Uri共享給外部,從而提高了應用的安全性。

// 建立File物件,用於儲存拍照後的圖片
File outputImage = new File(getExternalCacheDir(),
    "output_image.jpg");
//判斷當前Android版本號是否大於等於24
if (Build.VERSION.SDK_INT >= 24
){ //如果是則使用FileProvider imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cameraalbum.fileprovider", outputImage); } else { //否則,使用原來的fromFile() imageUri = Uri.fromFile(outputImage); }

在AndroidManifest.xml中對內容提供器進行註冊:

<provider
    android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.camearalbum.fileprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider>

其中,android:name 屬性的值是固定的,android:authoritirs 屬性的值必須要和FileProvider.getUriForFile() 方法中的第二個引數一致。
另外,這裡還在標籤的內部使用來指定Uri的共享路徑,並引用了一個@xml/file_paths資源。

在res目錄下新建一個xml目錄然後新建一個file_paths.xml檔案,並修改檔案中的內容:

<?xml version="1.0" encoding = "utf-8"?>
<paths xmlns:app="http://schemas.android.com/apk/res/android">
    <external-path name = "my_images" path = "" />
</paths>

其中,external-path就是用來指定Uri共享的,name屬性的值可以隨便填,path屬性的值表示共享的具體路徑。這裡設定空就表示將整個SD卡進行共享,也可以僅共享存放output_image.jpg 這張圖片的路徑。

還有一點需要注意,在Android 4.4系統之前,訪問SD卡的應用關聯目錄也是要宣告許可權的,從4.4系統開始不在需要許可權宣告。
為了相容老版本系統,還需要在AndroidManifest.xml 中宣告一下SD卡的許可權:

<uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

結束。

另外還發現一種解決方法,順便記錄下來:

File file = new File(imageFile)
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
Uri mImageUri;  
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//如果是7.0android系統  
    ContentValues contentValues = new ContentValues(1);  
    contentValues.put(MediaStore.Images.Media.DATA,file.getAbsolutePath());  
    mImageUri= getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues); 

}else{  
    mImageUri = Uri.fromFile(file);  
}  

intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);  
startActivityForResult(intent, REQUEST_PICK_FROM_CAMERA); 

相關推薦

Android 7.0呼叫相機拍照 FileUriExposedException

摘自郭霖 《第一行程式碼》 從Android 7.0系統開始,直接使用本地真實路徑的Uri,被認為是不安全的,會丟擲一個FileUriExposedException異常,,而FileProvider則是一種特殊的內容提供器,它使用了和內容提供器類似的機制來對

Android 7.0使用相機拍照,出現FileUriExposedException異常

以前寫的相機模組功能,在7.0手機上遇到錯誤,記錄一下。Android 7.0以下 呼叫方式Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environmen

Android 7.0 呼叫相機 android.os.FileUriExposedException

import android.R.integer; import android.app.Activity; import android.app.Dialog; import android.content.ContentValues; import android.c

android 7.0呼叫相機許可權

Android 7.0之後呼叫相機的方式不允許以file://的方式呼叫,需要以共享檔案的方式content://url ContentValues contentValues = new ContentValues(1); contentValues.put(Medi

Android 7.0適配 afinal

最近專案碰到7.0版本執行直接閃退 錯誤日誌如下 com.android.internal.policy.DecorContext cast to activity 通過列印日誌和檢視原始碼得知 net.tsz.afinal.AFinalUIHelp

android 7.0呼叫相機閃退問題

解決方案一: 一般歸類為手機相容性問題,要麼是軟體系統相容導致,要麼是硬體配置過低導致。 具體實現的程式碼: String photoNameAll = PhotoUtil.getphotoNam

Android 7.0呼叫相機/相簿/裁剪

Android 呼叫相機/相簿/裁剪,6.0需要申請許可權,7.0有路勁安全問題 1、安全問題需要設定共享路勁,需要在AndroidManifest.xml裡的application下設定provid

Android 7.0呼叫系統相機(檔案訪問crash android.os.FileUriExposedException

最近專案中做圖片上傳的功能中遇到一個問題,就是7.0的手機上呼叫系統相機指定圖片路徑的情況下回crash,報錯android.os.FileUriExposedException uri暴露的錯誤。 Android7.0對應用共享檔案這塊做了一些強制性的要求。

Android 7.0呼叫系統相機適配筆記

對於Android N以下,檔案直接Uri.fromFile(file)就可以直接使用,Audroid N 即編譯app的版本 compileSdkVersion 24時,此時會報出FileUriExposedException異常,解釋如下: 對於面向 Android

android7.0呼叫相機拍照的問題解決方案

最近在應用中開發呼叫系統相機拍照的時候,遇到一個問題,就是在安卓7.0及以上機型使用,按照往常寫法Uri.fromFile(imgFile)回丟擲異常FileUriExposedException導致程

Android開發之呼叫相機拍照與本地相簿選擇圖片

使用者看到的介面如下,也是我的xml介面: demo中有一個按鈕,點選彈出對話方塊提示使用者選擇:拍照、相簿。如下圖: 點選拍照,會開啟手機相機開始拍照,拍攝完後可以裁剪,如下圖: 這時候你可以直接點選確定,也可

Andoid 7.0呼叫系統拍照的正確用法

Android 7.0出來很久了,新特性中最重要的一條就是對檔案許可權進一步升級,提出了新的類FileProvider來獲取檔案。 首先FileProvider是ContentProvider的子

Android 7.0使用相機功能

最近在專案中有用到相機的功能,通常用法 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PE

Android開發之呼叫相機拍照呼叫系統相簿

Android應用程式中呼叫相機進行拍照和選擇相簿中的照片是經常會使用到的,那麼我們就來實現以下這個功能。 首先建立一個工程CameraTest,佈局檔案一個ImageView,兩個Button。 <?xml version="1.0" en

Android 7.0呼叫第三方庫出現載入失敗的問題

在Android7.0 ,自己編譯的APK放到系統裡,呼叫第三方庫沒有問題,但是通過SD卡點選apk檔案安裝,就出現 java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib64/libxxx.

Android 7.0及其以上系統拍照,開啟相簿,裁剪,android.os.FileUriExposedException: file:///storage/emulated/0/.....

全部程式碼:點選下載注意:如果你原先的應用的targetSdkVersion本來就小與27。那就拍照。什麼都不修改。也不會崩潰。但是、一旦你修改了你的targetSdkVersion為27.或者28。那你的應用就會報出這些問題。。具體原因。請自行百度下targetSdkVer

呼叫系統相機拍照--是配到android-7.0

一:獲取縮放圖 直接呼叫相機拍照,無需人和許可權,但是缺點是隻能獲取到縮放圖(不清晰的哦,一般不採用這種) /** * 縮放圖 */ mThumbnail.setOnClickListene

呼叫Android系統自帶相機拍照,從相簿中獲取圖片(相容7.0系統)

一,前言: 在日常的手機應用開發過程中,經常會遇到上傳圖片的需求,像上傳頭像之類的,這就需要呼叫系統的相機,相簿獲取照片。但是在Android 系統7.0之後認為這種操作是不安全的,這篇文章主要就是記錄7.0獲取照片遇到的問題。 二,FileProvider介紹 都

appium在android 7.0真機上運行command failed shell:............ps:'uiautomator"的解決方式

.proto androi sse ces node return std tomato 並且 appium版本:1_4_16 在CSDN中找到相關解決的方案,根據此解決方案順利的解決了讓人惆悵的問題,再次記錄。 1、找到appium安裝目錄下的adb.js文件,目錄為:A

Android 7.0以上系統獲取以content開頭的檔案拿不到正確路徑,column-data-does-not-exist

我們專案的使用場景,手機qq開啟檔案,選擇其他開啟方式,選擇我們自己的應用開啟,通過intent.getData()獲取檔案地址,後來發現在Android7.0之後的版本,獲取到的地址不正確,說檔案不存在。日誌報錯column-data-does-not-exist, 經過一天的折騰,終於在網上