Android 7.0調(diào)用系統(tǒng)相機適配-bo

版權(quán)聲明:本文為博主原創(chuàng)文章绵载,未經(jīng)博主允許不得轉(zhuǎn)載饲梭。

目錄(?)[+]

對于Android N以下,文件直接Uri.fromFile(file)就可以直接使用早歇,Audroid N 即編譯app的版本 compileSdkVersion 24時倾芝,此時會報出FileUriExposedException異常,解釋如下:

對于面向AndroidN 的應用箭跳,Android框架執(zhí)行的 StrictMode晨另,API 禁止向您的應用外公開 file://URI。

如果一項包含文件 URI 的 Intent 離開您的應用谱姓,應用失敗借尿,并出現(xiàn) FileUriExposedException異常。

若要在應用間共享文件屉来,您應發(fā)送一項 content://URI路翻,并授予 URI 臨時訪問權(quán)限。

進行此授權(quán)的最簡單方式是使用 FileProvider類奶躯。

@Overridepublic voidonTakePhoto() {if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.N) {//7.0及其以后版本使用升級后的代碼處理Intent takePictureIntent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);if(takePictureIntent.resolveActivity(getPackageManager()) !=null) {//判斷是否有相機應用picName= DateUtil.format(newDate(),"yyyyMMddHHmmss") +".jpg";File imagePath =newFile(Files.photoPath,picName);Uri photoURI =getUriForFile(this,"xxx.xxx.xxx",imagePath);takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加這一句表示對目標應用臨時授權(quán)該Uri所代表的文件takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI);startActivityForResult(takePictureIntent,PHOTO_REQUEST_TAKEPHOTO);}? ? }else{//7.0之前還保持原來方案進行處理即可Intent cameraintent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);picName= DateUtil.format(newDate(),"yyyyMMddHHmmss") +".jpg";File f =newFile(Files.photoPath,picName);cameraintent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(f));PrefTool.setBooleanSave(this,Prefs.PRE_NOT_TO_BACKGROUD, true);startActivityForResult(cameraintent,PHOTO_REQUEST_TAKEPHOTO);}}

現(xiàn)在帚桩,需要配置FileProvider。在應用程序的清單嘹黔,提供者添加到您的應用程序账嚎,authorities=”applicationId.fileprovider”,使用時

file-path

表示你應用內(nèi)部存儲區(qū)域的文件的子目錄儡蔓。這個子目錄和getFilesDir()的返回值一樣郭蕉。external-path

表示你應用外部存儲區(qū)域的文件的子目錄。這個子目錄和getExternalFilesDir()的返回值一樣喂江。cache-path

表示你應用內(nèi)部存儲區(qū)域的緩存子目錄召锈。這個子目錄的根目錄和getCacheDir()的返回值一樣。(如果你修改了provider和paths中的值获询,需要把應用卸載重裝或者開關(guān)機一下才能看到變化涨岁。)

@Overrideprotected voidonActivityResult(intrequestCode, intresultCode,Intent data) {super.onActivityResult(requestCode,resultCode,data);switch(requestCode) {casePHOTO_REQUEST_TAKEPHOTO:// 當選擇拍照時調(diào)用if(resultCode ==RESULT_CANCELED) {return;}else if(resultCode !=RESULT_OK) {? ? ? ? ? ? ? ? showMsg("Take photo failed.");}else{? ? ? ? ? ? ? //處理返回數(shù)據(jù)}break;

}

}

關(guān)于FileProvider

FileProvider 是 ContentProvider 的一個特殊的子類拐袜,它有利于安全地分享應用相關(guān)的文件,通過對一個文件創(chuàng)建content:// Uri而不是file:/// Uri梢薪。

由于FileProvider的默認功能包括文件的content URI的生成蹬铺,你并不需要在代碼中定義一個子類。相反秉撇,你可以在你的應用中包含一個FileProvider通過在XML文件中指定它甜攀。對于指定FileProvider,添加一個元素在你應用的清單文件中琐馆。設(shè)置android:name屬性為android.support.v4.content.FileProvider规阀。根據(jù)你控制的域名設(shè)置android:authorities屬性為一個URI authority(authorities可以隨意填寫,但是要保證使用時與authority保持一致瘦麸,推薦applicationId.fileprovider谁撼,以免定義重復)。設(shè)置android:exported屬性為false瞎暑;FileProvider不需要公開彤敛。設(shè)置android:grantUriPermissions屬性為true,為了允許你進行臨時訪問文件的授權(quán)了赌。

一個FileProvider只能生成一個content

URI

對應你事先指定目錄下的文件墨榄。對于指定一個目錄,使用元素的子元素勿她,在XML中指定它的存儲區(qū)域和路徑袄秩。例如,下面的paths元素告訴FileProvider你打算請求你的私有文件區(qū)域的

images/ 子目錄的content URIs

以下摘自Androiddeveloper 文檔:

虛擬文件

在較早的 Android 版本中逢并,您的應用可以使用存儲訪問框架來允許用戶從他們的云存儲帳戶中選擇文件之剧,如 Google Drive。但是砍聊,不能表示沒有直接字節(jié)碼表示的文件背稼;每個文件都必須提供一個輸入流。

Android 7.0 在存儲訪問框架中添加了虛擬文件的概念玻蝌。虛擬文件功能可以讓您的DocumentsProvider返回可與ACTION_VIEWintent

使用的文件 URI蟹肘,即使它們沒有直接字節(jié)碼表示。Android 7.0 還允許您為用戶文件(虛擬或其他類)提供備用格式俯树。

為獲得您的應用中的虛擬文件的 URI帘腹,首先您應創(chuàng)建一個Intent以打開文件選擇器 UI。由于應用不能使用openInputStream()方法來直接打開一個虛擬文件许饿,因此如果您包括了CATEGORY_OPENABLE類別阳欲,您的應用不會收到任何虛擬文件。

在用戶選擇之后,系統(tǒng)調(diào)用onActivityResult()方法球化。您的應用可以檢索虛擬文件的 URI秽晚,并得到一個輸入流,這表現(xiàn)在以下片段中的代碼赊窥。

// Other Activity code ...finalstaticprivateintREQUEST_CODE=64;// We listen to the OnActivityResult event to respond to the user's selection.@OverridepublicvoidonActivityResult(intrequestCode,intresultCode,IntentresultData){try{if(requestCode==REQUEST_CODE&&resultCode==Activity.RESULT_OK){Uriuri=null;if(resultData!=null){uri=resultData.getData();ContentResolverresolver=getContentResolver();// Before attempting to coerce a file into a MIME type,// check to see what alternative MIME types are available to// coerce this file into.String[]streamTypes=resolver.getStreamTypes(uri,"*/*");AssetFileDescriptordescriptor=resolver.openTypedAssetFileDescriptor(uri,streamTypes[0],null);// Retrieve a stream to the virtual file.InputStreaminputStream=descriptor.createInputStream();}}}catch(Exceptionex){Log.e("EXCEPTION","ERROR: ",ex);}}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爆惧,一起剝皮案震驚了整個濱河市狸页,隨后出現(xiàn)的幾起案子锨能,更是在濱河造成了極大的恐慌,老刑警劉巖芍耘,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件址遇,死亡現(xiàn)場離奇詭異,居然都是意外死亡斋竞,警方通過查閱死者的電腦和手機倔约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坝初,“玉大人浸剩,你說我怎么就攤上這事■郏” “怎么了绢要?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拗小。 經(jīng)常有香客問我重罪,道長,這世上最難降的妖魔是什么哀九? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任剿配,我火速辦了婚禮,結(jié)果婚禮上阅束,老公的妹妹穿的比我還像新娘呼胚。我一直安慰自己,他們只是感情好息裸,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布蝇更。 她就那樣靜靜地躺著,像睡著了一般界牡。 火紅的嫁衣襯著肌膚如雪簿寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天宿亡,我揣著相機與錄音常遂,去河邊找鬼。 笑死挽荠,一個胖子當著我的面吹牛克胳,可吹牛的內(nèi)容都是我干的平绩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漠另,長吁一口氣:“原來是場噩夢啊……” “哼捏雌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笆搓,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤性湿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后满败,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肤频,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年算墨,在試婚紗的時候發(fā)現(xiàn)自己被綠了宵荒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡净嘀,死狀恐怖报咳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挖藏,我是刑警寧澤暑刃,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站熬苍,受9級特大地震影響稍走,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柴底,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一婿脸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柄驻,春花似錦狐树、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至野哭,卻和暖如春在塔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拨黔。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工蛔溃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓贺待,卻偏偏與公主長得像徽曲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子麸塞,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容