Android Academy · Oppitunti

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.

Oppitunti 7/713 vaihetta

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-tarkkuus
  • ACCESS_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_IMAGES
  • READ_MEDIA_VIDEO
  • READ_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.

Aloita maksutta

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

  1. Projektin rakenne ja manifesti
  2. Aktiviteetit ja elinkaari
  3. Asettelu ja näkymät
  4. Käyttäjän syötteen käsittely
  5. Intentit ja navigointi
  6. Fragmentit
  7. Käyttöoikeudet ja ajonaikaiset pyynnöt
← Takaisin: Android Academy