安卓開發(fā)調(diào)用攝像頭一直失敗的原因及解決(權(quán)限問題)
最近開發(fā)安卓的時候,發(fā)現(xiàn)調(diào)用攝像頭一直出錯,導(dǎo)致APP直接崩潰,
錯誤代碼:java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera/.Camera clip={text/uri-list U:file:///storage/emulated/0/DCIM/20181106191203.jpg} (has extras) } from ProcessRecord{2db2ead 2049:com.example.kkk.imagetest/u0a295} (pid=2049, uid=10295) with revoked permission android.permission.CAMERA
查詢了網(wǎng)上的一些博客,發(fā)現(xiàn)大多數(shù)沒有答到點子上,有的人直接把自己的代碼全盤照搬,沒有參考價值?,F(xiàn)在發(fā)現(xiàn)原因如下:
1.Android 6.0之后權(quán)限需求的變動
以前的安卓權(quán)限都在manifest中一次申請,終身可用,到了安卓6.0(targetSdkVersion to 23)之后,為了防止權(quán)限濫用,Google就采取了一些措施:
a.對于targetSdkVersion低于23的APP,使用舊有規(guī)則:用戶在安裝的時候不得不接受所有權(quán)限(APP自帶),安裝后app就有了那些權(quán)限。
b.對于targetSdkVersion大于等于23的APP,使用新規(guī)則:app不得不在運行時一個一個詢問用戶授予權(quán)限。另外,用戶也可以隨時在設(shè)置里取消已經(jīng)授權(quán)的權(quán)限。
2.知道了原因,解決方案:
已經(jīng)在Manifest中配置了權(quán)限信息的情況下,在打開攝像頭之前,加上這樣一段代碼:ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},1);(詢問用戶授予權(quán)限)
解釋:ActivityCompat.requestPermissions(),這個方法接收三個參數(shù),分別是Activity的實例、String數(shù)組(manifest中的請求權(quán)限)、請求碼
注意:第一個參數(shù)需要activity的實例,我的MainActivity繼承的是默認(rèn)的APPCompatActivity,所以要加上".this"。
備注:這是最為直接、簡單的方法,會顯得有些簡陋,實際開發(fā)中會使用更加完善的方法,但是我覺得這對于初學(xué)者是最好理解的,
簡潔即是美。2018/11/6