一文詳解Android無(wú)需權(quán)限調(diào)用系統(tǒng)相機(jī)拍照
正文
在進(jìn)行一些小型APP的開(kāi)發(fā),或者是對(duì)拍照界面沒(méi)有自定義要求時(shí),我們可以用調(diào)起系統(tǒng)相機(jī)的方式快速完成拍照需求
和不需讀寫(xiě)權(quán)限進(jìn)行讀寫(xiě)操作的方案一樣,都是通過(guò)Intent啟動(dòng)系統(tǒng)的activity讓用戶(hù)進(jìn)行操作,系統(tǒng)再將用戶(hù)操作的結(jié)果告訴我們,因?yàn)檫^(guò)程對(duì)APP是完全透明的,所以不會(huì)侵犯用戶(hù)隱私。
有兩種方法可以調(diào)起系統(tǒng)相機(jī)拍照獲取圖片,我們先講比較簡(jiǎn)單的一種
1、直接獲取用戶(hù)拍照結(jié)果
val launcher = registerForActivityResult(ActivityResultContracts.TakePicturePreview()) {bitmap->
bitmap ?: return@registerForActivityResult
vm.process(bitmap)
}
launcher.launch("image/*")
這個(gè)在舊版本的API中就等于
startActivityForResult(Intent(MediaStore.ACTION_IMAGE_CAPTURE),CODE)
等到用戶(hù)完成拍照,返回我們的activity時(shí),我們就可以得到一張經(jīng)過(guò)壓縮的bitmap。這個(gè)方法很簡(jiǎn)單,它的缺點(diǎn)就是獲得的bitmap像素太低了,如果對(duì)圖片像素有要求的話(huà)需要使用第二種方法
2、用戶(hù)拍照之后指定相機(jī)將未壓縮的圖片存放到我們指定的目錄
var uri: Uri? = null
val launcher =
registerForActivityResult(ActivityResultContracts.TakePicture()) {
if(it){
uri?.let { it1 -> vm.process(it1) }
}
}
val picture = File(externalCacheDir?.path, "picture")
picture.mkdirs()
uri = FileProvider.getUriForFile(
this,
"${BuildConfig.APPLICATION_ID}.fileprovider",
File(picture, "cache")
)
launcher.launch(uri)
這里我逐行進(jìn)行解釋?zhuān)?/p>
- 首先,我們需要指定拍攝的照片要存到哪,所以我們先指定圖片的存放路徑為externalCacheDir.path/picture/cache 注意這張圖片在文件系統(tǒng)中的名字就叫做cache了(沒(méi)有文件后綴)。
- 然后我們通過(guò)FileProvider構(gòu)建一個(gè)有授權(quán)的Uri給系統(tǒng)相機(jī),相機(jī)程序拿到我們的臨時(shí)授權(quán),才有權(quán)限將文件存放到APP的私有目錄。
- 系統(tǒng)相機(jī)拍照完成之后就會(huì)走到回調(diào),如果resultCode為RESULT_OK才說(shuō)明用戶(hù)成功拍照并保存圖片了。這樣我們就能得到一張系統(tǒng)相機(jī)拍出來(lái)的原圖的Uri,這樣我們就可以用這張圖片去處理業(yè)務(wù)了。
注意:使用方法二需要用到FileProvider,所以我們還要在AndroidManifest里聲明
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
@xml/provider_paths是我們授權(quán)訪問(wèn)的文件路徑,這里我寫(xiě)的是
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths>
關(guān)于這個(gè)"path.xml",其實(shí)還有一些可以補(bǔ)充說(shuō)明的,后面有空會(huì)補(bǔ)上,這里我簡(jiǎn)單說(shuō)明一下:
因?yàn)槲覀儎?chuàng)建臨時(shí)文件的時(shí)候,文件指定的目錄是externalCacheDir?.path,對(duì)應(yīng)的path就是external-cache-path,表示我們要臨時(shí)授權(quán)的目錄是externalCacheDir,如果文件目錄指定的是其他路徑,那path節(jié)點(diǎn)也需要改成代表對(duì)應(yīng)文件夾的節(jié)點(diǎn),這樣其他應(yīng)用才能訪問(wèn)到我們APP的私有目錄
以上就是一文詳解Android無(wú)需權(quán)限調(diào)用系統(tǒng)相機(jī)拍照的詳細(xì)內(nèi)容,更多關(guān)于Android調(diào)用系統(tǒng)相機(jī)拍照的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android selinux策略文件的編譯與加載
- 簡(jiǎn)述Android中SELinux的TE
- 詳解Android Selinux 權(quán)限及問(wèn)題
- Android 掃描WIFI權(quán)限詳解
- Android無(wú)需讀寫(xiě)權(quán)限通過(guò)臨時(shí)授權(quán)讀寫(xiě)用戶(hù)文件詳解
- Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限案例詳解
- android9.0 默認(rèn)apk權(quán)限添加方法
- 解決Android SELinux權(quán)限問(wèn)題記錄分析
相關(guān)文章
Android開(kāi)發(fā)仿bilibili刷新按鈕的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 仿bilibili刷新按鈕的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-10-10
Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例
這篇文章主要介紹了Android編程之殺毒的實(shí)現(xiàn)原理及具體實(shí)例,結(jié)合實(shí)例形式分析了Android殺毒功能的原理與簡(jiǎn)單實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12
Android 自定義View實(shí)現(xiàn)多節(jié)點(diǎn)進(jìn)度條功能
這篇文章主要介紹了Android 自定義View實(shí)現(xiàn)多節(jié)點(diǎn)進(jìn)度條,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Android Socket服務(wù)端與客戶(hù)端用字符串的方式互相傳遞圖片的方法
這篇文章主要介紹了Android Socket服務(wù)端與客戶(hù)端用字符串的方式互相傳遞圖片的方法的相關(guān)資料,需要的朋友可以參考下2016-05-05
Android 自定義手勢(shì)--輸入法手勢(shì)技術(shù)
這篇文章主要介紹了Android 自定義手勢(shì)--輸入法手勢(shì)技術(shù)的相關(guān)資料,需要的朋友可以參考下2016-10-10
Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤(pán)
這篇文章主要為大家詳細(xì)介紹了Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤(pán),熟練掌握SurfaceVie實(shí)現(xiàn)抽獎(jiǎng)大轉(zhuǎn)盤(pán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android ListView適配器(Adapter)優(yōu)化方法詳解
這篇文章主要介紹了Android ListView優(yōu)化方法詳解的相關(guān)資料,這里舉例說(shuō)明該如何對(duì)ListView 進(jìn)行優(yōu)化,具有一定的參考價(jià)值,需要的朋友可以參考下2016-11-11

