Android Studio Kotlin 取得相機權限詳細教學 (附上完整程式碼)

我們會用到Activity Result API,取得系統分派後的結果
開啟build.gradle(Module:App)
插入下面這行
implementation("androidx.activity:activity-ktx:1.3.1")

開啟AndroidManifest.xml,聲明我們會要用到相機權限
<uses-permission android:name="android.permission.CAMERA" />

請求權限時會遇到三種狀況:
  1. 已經同意
  2. 被拒絕過
  3. 第一次詢問
private fun onClickRequestPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED -> {
// 同意
Toast.makeText(this, "已取得相機權限", Toast.LENGTH_SHORT).show()
}

ActivityCompat.shouldShowRequestPermissionRationale(
this,
Manifest.permission.CAMERA
) -> {
// 被拒絕過,彈出視窗告知本App需要權限的原因
AlertDialog.Builder(this)
.setTitle("需要相機權限")
.setMessage("這個APP需要相機權限,請給予權限")
.setPositiveButton("Ok") { _, _ -> requestPermissionLauncher.launch(Manifest.permission.CAMERA) }
.show()
}
else -> {
// 第一次請求權限,直接詢問
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
}
}
}
要使用就呼叫onClickRequestPermission()
這裡示範時就直接放在onCreate,讓App一打開就會出現視窗
發出請求後用來接收回應的方式:
private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission())
{ isGranted: Boolean ->
if (isGranted) {
Toast.makeText(this, "已取得相機權限", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "未取得相機權限", Toast.LENGTH_SHORT).show()
}
}


基本上這樣就寫完了
但是目前如果被拒絕兩次後就無法再彈出請求權限的視窗
需要使用者到設定裡面給予權限,我們能做的就是引導使用者到我們App的設定頁面

判斷是不是無法再請求權限:
shouldShowRequestPermissionRationale就是字面上的意思:「應該要顯示請求權限理由」
如果沒有再詢問的機會當然不用顯示理由
所以我們可以在回應的地方加上判斷是否已經沒有詢問的機會
這時候我們再禮貌的問一下願不願意到設定幫我們更改,如果人家不願意,我們跳設定介面給他也沒有用
把接收回應的程式碼改成下面這樣:
private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission())
{ isGranted: Boolean ->
if (isGranted) {
Toast.makeText(this, "已取得相機權限", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "未取得相機權限", Toast.LENGTH_SHORT).show()
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
// 被拒絕太多次,無法開啟請求權限視窗
AlertDialog.Builder(this)
.setTitle("需要相機權限")
.setMessage("這個APP需要相機權限,因為被拒絕太多次,無法自動給予權限,請至設定手動開啟")
.setPositiveButton("Ok") { _, _ ->
// 開啟本App在設定中的權限視窗,在內心祈禱使用者願意給予權限
openPermissionSettings()
}
.setNeutralButton("No", null)
.show()
}
}
}
跳到設定的方式:
private fun openPermissionSettings() {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri = Uri.fromParts("package", packageName, null)
intent.data = uri
startActivity(intent)
}
要怎麼知道使用者有沒有在設定頁面給我們權限?
我們可以在onStart再檢查一次就好了
複寫onStart方法:
override fun onStart() {
super.onStart()
onClickRequestPermission()
}
目前我們詢問的時候都沒有給人家拒絕的選項
身為一個好的App,我們要給使用者選擇的權利
例如我們取得相機權限是要掃描信用卡,如果使用者不給相機權限就不讓使用者使用App,這樣不只會損失收益,還會讓使用者在應用程式商店留下不好的評價
所以應該要有替代方案,例如讓他們手動輸入,這部分就看各位發揮了

執行畫面:

下面附上整理後的程式碼:


留言