Käyttöoikeudet ja ajonaikaiset pyynnöt
Ilmoittakaa vaaralliset käyttöoikeudet ja pyytäkää niitä ajonaikaisesti ActivityResultContracts-sopimusten avulla, näyttäkää perusteludialogeja ja käsitelkää pysyvä kieltäminen.
Käyttöoikeudet ja ajonaikaiset pyynnöt on ilmainen Android Academy-oppitunti CoddyKitissä. Tämä on oppitunti 7/7. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Android Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Android Academy-kurssilla on yhteensä 7 oppituntia.
Androidin käyttöoikeuksien yleiskatsaus
Android-sovellusten on ilmoitettava, mitä laitteen ominaisuuksia ne tarvitsevat. Käyttöoikeudet suojaavat käyttäjän yksityisyyttä:
- Normaalit käyttöoikeudet — pieni riski, myönnetään automaattisesti (INTERNET, VIBRATE)
- Vaaralliset käyttöoikeudet — antavat pääsyn arkaluonteisiin tietoihin, ja niitä on pyydettävä ajon aikana (CAMERA, LOCATION, READ_CONTACTS)
- Allekirjoituskäyttöoikeudet — vain samalla varmenteella allekirjoitetuille sovelluksille
Määrittäminen Manifest-tiedostossa
Kaikki käyttöoikeudet on ensin määritettävä tiedostossa AndroidManifest.xml:
<!-- AndroidManifest.xml -->
<manifest ...>
<!-- Normal: granted automatically -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- Dangerous: must request at runtime -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application ...>
...
</application>
</manifest>Käyttöoikeuden myöntämisen tarkistaminen
Ennen vaarallisen ominaisuuden käyttöä tarkistakaa aina, onko käyttöoikeus jo myönnetty:
import androidx.core.content.ContextCompat
import android.content.pm.PackageManager
fun isCameraPermissionGranted(): Boolean {
return ContextCompat.checkSelfPermission(
this, // Context
android.Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED
}Käyttöoikeuden pyytäminen ActivityResultLauncherilla
Käyttäkää ActivityResultContracts.RequestPermission()-toimintoa — se on nykyaikainen tapa (vanhentunutta onRequestPermissionsResult-toimintoa ei tarvita):
class CameraActivity : AppCompatActivity() {
private val requestCameraPermission = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted ->
if (isGranted) {
openCamera()
} else {
showPermissionDeniedMessage()
}
}
fun onTakePhotoClick(view: View) {
if (isCameraPermissionGranted()) {
openCamera()
} else {
requestCameraPermission.launch(android.Manifest.permission.CAMERA)
}
}
}Useiden käyttöoikeuksien pyytäminen kerralla
Pyytäkää useita käyttöoikeuksia käyttämällä RequestMultiplePermissions-toimintoa:
private val requestMultiple = registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
val cameraGranted = permissions[android.Manifest.permission.CAMERA] ?: false
val locationGranted = permissions[android.Manifest.permission.ACCESS_FINE_LOCATION] ?: false
if (cameraGranted && locationGranted) {
startFeature()
} else {
showWhichPermissionsDenied(cameraGranted, locationGranted)
}
}
fun requestPermissions() {
requestMultiple.launch(arrayOf(
android.Manifest.permission.CAMERA,
android.Manifest.permission.ACCESS_FINE_LOCATION
))
}Perustelu: milloin syy kannattaa selittää
shouldShowRequestPermissionRationale() palauttaa arvon true, kun käyttäjä on aiemmin evännyt käyttöoikeuden. Näyttäkää selitys ennen uutta pyyntöä:
fun requestCameraWithRationale() {
when {
isCameraPermissionGranted() -> {
openCamera()
}
shouldShowRequestPermissionRationale(android.Manifest.permission.CAMERA) -> {
// Explain why we need it, then request
AlertDialog.Builder(this)
.setTitle("Camera needed")
.setMessage("We use the camera to take profile photos.")
.setPositiveButton("OK") { _, _ ->
requestCameraPermission.launch(android.Manifest.permission.CAMERA)
}
.show()
}
else -> {
requestCameraPermission.launch(android.Manifest.permission.CAMERA)
}
}
}Pysyvästi evätty — siirtyminen asetuksiin
Jos käyttäjä napauttaa vaihtoehtoa ”Älä kysy uudelleen”, shouldShowRequestPermissionRationale palauttaa arvon false, ettekä voi pyytää käyttöoikeutta uudelleen. Ohjatkaa käyttäjä sovelluksen asetuksiin:
fun openAppSettings() {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}Sijainnin käyttöoikeus
Sijainnin käyttöoikeudessa on kaksi tasoa — valitkaa käyttötarkoitukseenne sopiva:
ACCESS_COARSE_LOCATION— kaupunginosan tarkkuus (WiFi-/tukiasemat)ACCESS_FINE_LOCATION— GPS-tarkkuusACCESS_BACKGROUND_LOCATION— Android 10:ssä ja uudemmissa tarvitaan erikseen sijainnin käyttämiseen taustalla
Täydellinen esimerkki kameran käyttöoikeudesta
Täydellinen työnkulku, jossa yhdistyvät tarkistus → perustelu → pyyntö:
class PhotoActivity : AppCompatActivity() {
private val cameraLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
if (granted) openCamera() else showDenied()
}
private fun handleCameraClick() {
val permission = android.Manifest.permission.CAMERA
when {
ContextCompat.checkSelfPermission(this, permission) ==
PackageManager.PERMISSION_GRANTED -> openCamera()
shouldShowRequestPermissionRationale(permission) ->
showRationaleDialog()
else -> cameraLauncher.launch(permission)
}
}
private fun showDenied() {
Snackbar.make(binding.root, "Camera permission required", Snackbar.LENGTH_LONG)
.setAction("Settings") { openAppSettings() }.show()
}
}Käyttöoikeuksien parhaat käytännöt
Tärkeimmät säännöt sujuvan käyttöoikeuskokemuksen varmistamiseksi:
- Pyytäkää käyttöoikeuksia vain tarvittaessa (ei sovelluksen käynnistyessä)
- Pyytäkää vain vähimmäismäärä tarvittavia käyttöoikeuksia
- Käsitelkää evätty käyttöoikeus aina asianmukaisesti
- Älkää kysykö toistuvasti, jos käyttäjä on valinnut vaihtoehdon ”Älä kysy uudelleen”
- Selittäkää syy ennen järjestelmän valintaikkunaa, ei käyttöoikeuden epäämisen jälkeen
Android 13:n ja uudempien tarkat mediaoikeudet
Android 13:sta (API 33) lähtien READ_EXTERNAL_STORAGE on jaettu tarkempiin käyttöoikeuksiin:
READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO
Tarkistakaa aina Build.VERSION.SDK_INT ja pyytäkää käyttöjärjestelmän versiolle sopivaa käyttöoikeutta.
Pikatarkistus
Milloin vaarallisen käyttöoikeuden pyytämistä ennen pitäisi näyttää perusteluvalintaikkuna?
Kertaus: käyttöoikeudet
Ajonaikaisten käyttöoikeuksien oikeaoppinen käyttö:
- Määritä käyttöoikeudet tiedostossa
AndroidManifest.xml - Tarkista ne käyttämällä
ContextCompat.checkSelfPermission()-toimintoa - Pyydä niitä käyttämällä
registerForActivityResult(RequestPermission())-toimintoa - Näytä perustelu, kun
shouldShowRequestPermissionRationale()on arvoltaan true - Ohjaa käyttäjä pysyvän epäämisen tapauksessa Asetuksiin
- Älä koskaan pyydä käyttöoikeuksia ennen kuin käyttäjä tarvitsee niitä
Seuraavaksi: tallenna tiedot paikallisesti DataStorella.
Opi Kotlin tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 36
- Oppitunnit
- 152
Usein kysytyt kysymykset
Onko oppitunti ”Käyttöoikeudet ja ajonaikaiset pyynnöt” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Android Academy-oppimispolun 3 oppituntia, myös oppitunnin “Käyttöoikeudet ja ajonaikaiset pyynnöt”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Android Academy-kurssilla on yhteensä 7 oppituntia.
Mitä opin oppitunnilla ”Käyttöoikeudet ja ajonaikaiset pyynnöt”?
Ilmoittakaa vaaralliset käyttöoikeudet ja pyytäkää niitä ajonaikaisesti ActivityResultContracts-sopimusten avulla, näyttäkää perusteludialogeja ja käsitelkää pysyvä kieltäminen. Harjoittelet Android Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Android Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Android Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 7/7.
Kuinka kauan ”Käyttöoikeudet ja ajonaikaiset pyynnöt”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Android Academy-oppitunnilla?
Kyllä. Jokainen Android Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Projektin rakenne ja manifesti
- Aktiviteetit ja elinkaari
- Asettelu ja näkymät
- Käyttäjän syötteen käsittely
- Intentit ja navigointi
- Fragmentit
- Käyttöoikeudet ja ajonaikaiset pyynnöt