1. 程式人生 > >關於Android 7.0相機遇到的一些問題

關於Android 7.0相機遇到的一些問題

Android  7.0相機遇到的一些問題記錄,在網上看了好久,主要是之前沒有怎麼解除過,所以看起來挺費勁,沒有一個
系統的介紹,所以看起來一臉懵逼,然後在書上查了一下,很簡單的搞定問題,沒有太多的原理詳解,以解決問題為核心,
現分享記錄,親測可用.

(1):
File outputImage = new File(getExternalCacheDir(),"iv_photo_regidter.jpg");
try {
//建立資料夾
if(outputImage.exists()){
outputImage.delete();
    }
outputImage.createNewFile()
; } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT>=24){ imageUri1 = FileProvider.getUriForFile(this,"net.xxxxxxxx.fileprovider",outputImage); }else{ imageUri1 = Uri.fromFile(outputImage); } //啟動相機 Intent i = new Intent("android.media.action.IMAGE_CAPTURE"); i.putExtra(MediaStore
.EXTRA_OUTPUT,imageUri1); i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(i,Flag); 首先建立一個File,並指定照片的儲存路徑,getExternalCacheDir()獲取手機SD卡的應用相關聯目錄,為什麼要使 用應用相關聯目錄呢,因為在Android 6.0 後,SD卡被定義在危險許可權中,訪問相機需要申請執行時許可權,獲取應用 相關聯目錄就可以跳過這一步,FileProvider是Android的一個特殊的內容提供器,它使用了和內容提供器類似的機制 來對資料進行保護,提高了安全性.
這個大家都明白的,但是在指定Uri的時候要進行判斷是否是7.0相機,小於
7.0版本相機的處理方式並沒有什麼變化;注意7.0相機的路徑,需要呼叫 FileProvider.getUriForFile();第一個
引數是上下文,第二個引數是一個任意的字串 + .fileprovider
(注意,這個在後面有用到),第三個引數是file物件,最後得到一個路徑
,就是7.0相機照片儲存的最終路徑,意圖呼叫相機就不贅述了.因為是startActivityForResult隱式意圖呼叫相機,
照片拍攝完成會儲存在output.jsp,再呼叫(7.0相機這樣呼叫拿到相片,見操作(2))

(2): BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri1));得到這張圖片,


(3): 然後需要在清單檔案中進行註冊內容提供器,
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="net.xinyongfu.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
    <meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
provider內的相關屬性,authrities:屬性是你可以自定義的任意字串 .fileprovider ,但是必須和剛才
FileProvider.getUriForFile();裡面的第二個引數是完全一致的;name:是固定的,exported必須是false,
grantUriPermissions 必須是true,
meta-data 裡面的屬性name 屬性是固定的,resource裡面引用了一個xml資源,現在這個資源是不存在的,下面開始
建立,右擊res目錄->New->Directory,建立一個xml目錄,右擊xml建立一個file,下面是xml裡面的程式碼示例
(4):
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path=""/>
</paths>
name可以隨便寫,path= "",代表將整個SD卡目錄進行共享,
但是在Android4.0系統之前,還是要在清單檔案中申明訪問SD卡的許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
這樣程式碼就寫完了,注意:四步操作,缺一不可,相關API方法呼叫都是實現這個功能的基礎.