Meminta izin hardware untuk kacamata audio dan kacamata tampilan

Perangkat XR yang kompatibel
Panduan ini membantu Anda membangun pengalaman untuk jenis perangkat XR ini.
Kacamata Audio &
Tampilan

Sama seperti di ponsel, mengakses hardware sensitif seperti kamera dan mikrofon di kacamata pintar audio dan kacamata pintar dengan layar memerlukan izin eksplisit pengguna. Izin ini dianggap sebagai izin khusus kacamata, dan aplikasi Anda harus memintanya saat runtime, meskipun aplikasi tersebut sudah memiliki izin yang sesuai di ponsel.

Mendeklarasikan izin dalam manifes aplikasi

Sebelum meminta izin, Anda harus mendeklarasikannya dalam file manifes aplikasi menggunakan elemen <uses-permission>. Pernyataan ini tetap sama, baik izinnya untuk fitur khusus ponsel atau kacamata, tetapi Anda tetap harus memintanya secara eksplisit untuk hardware atau fungsi khusus kacamata.

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for the camera. -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>

Sebelum meminta izin kacamata

Tinjau prinsip dan alur kerja izin untuk memastikan Anda memberikan pengalaman terbaik bagi pengguna, seperti memeriksa apakah pengguna telah memberikan izin runtime yang diperlukan aplikasi Anda dan apakah aplikasi Anda harus menampilkan alasan kepada pengguna sebelum meminta izin khusus kacamata.

Skenario izin

Ada berbagai skenario yang mungkin Anda alami saat meminta izin runtime berbahaya di kacamata audio dan layar:

  • Meminta izin runtime dari aktivitas yang diproyeksikan
  • Meminta izin runtime dari aktivitas ponsel

Lihat bagian berikut dalam panduan ini untuk mengetahui detail tentang setiap skenario.

Meminta izin runtime dari aktivitas yang diproyeksikan

Untuk meminta izin runtime untuk kacamata audio atau layar dari aktivitas yang diproyeksikan, gunakan metode ProjectedActivityCompat.requestPermissions.

Memanggil metode ini akan memicu alur pengguna yang terkoordinasi di kacamata dan ponsel host.

  1. Di kacamata: Sistem membuka aktivitas pendamping yang diproyeksikan di kacamata, menginstruksikan pengguna untuk memeriksa ponsel mereka guna merespons permintaan izin.
  2. Di ponsel: Dialog izin sistem Android akan muncul di layar ponsel. Dialog secara eksplisit menunjukkan bahwa pengguna memberikan izin untuk kacamata, bukan ponsel itu sendiri. Kemudian, pengguna dapat memberikan atau menolak permintaan.

Contoh berikut menunjukkan cara meminta izin kacamata dari aktivitas yang diproyeksikan:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
private fun requestCameraPermission() {
    lifecycleScope.launch {
        try {
            ProjectedActivityCompat.requestPermissions(
                this@PermissionsFromProjectedActivity,
                arrayOf(Manifest.permission.CAMERA),
                // CAMERA_PERMISSION_REQUEST_CODE is a developer defined constant
                CAMERA_PERMISSION_REQUEST_CODE,
            )
        } catch (e: IllegalStateException) {
            // Thrown when the projected system service can't be bound.
            Log.e(TAG, "Camera permission request failed: projected service unavailable.", e)
        }
    }
}

Poin penting tentang kode

  • Gunakan ProjectedActivityCompat.requestPermissions, bukan metode ActivityCompat standar. Metode ini secara eksplisit menargetkan izin runtime untuk audio dan kacamata pintar dengan layar, bukan ponsel host.

Menangani hasil izin

Setelah pengguna merespons dialog izin di ponsel, keputusannya akan dikirimkan ke aplikasi Anda dengan memanggil callback onRequestPermissionsResult.

Sistem akan menutup aktivitas pendamping yang diproyeksikan secara otomatis. Di kacamata audio, hal ini terjadi setelah peringatan audio selesai diputar. Di kacamata pintar dengan layar, hal ini terjadi setelah pengguna merespons semua dialog izin.

Untuk menangani respons, ganti onRequestPermissionsResult() dalam instance Activity yang memulai permintaan izin.

Cuplikan kode berikut menunjukkan cara menangani callback dan memverifikasi apakah pengguna memberikan izin yang diminta:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String>,
    grantResults: IntArray,
    deviceId: Int,
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)
    if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return

    val isCameraGranted =
        grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) ==
            PackageManager.PERMISSION_GRANTED

    if (isCameraGranted) {
        initializeCameraFeatures()
    } else {
        onCameraPermissionDenied()
    }
}

Poin penting tentang kode
  • Gunakan overload deviceId dengan callback onRequestPermissionsResult untuk memastikan status izin dipetakan dengan benar ke konteks tertentu, seperti audio atau kacamata pintar dengan layar, bukan ponsel host.
  • Aplikasi Anda harus menangani hasil yang diberikan dan ditolak dengan baik.

Meminta izin runtime dalam aktivitas ponsel

Jika aplikasi Anda berjalan dalam aktivitas ponsel, tetapi memerlukan izin untuk audio atau kacamata pintar dengan layar—misalnya, untuk memungkinkan pengguna mengalihkan streaming video ke kamera kacamata untuk sudut pandang orang pertama—minta izin menggunakan metode Activity#requestPermissions(permissions, requestCode, deviceId) khusus perangkat:

// Request the projected permission from phone activity
requestPermissions(
    arrayOf(Manifest.permission.CAMERA),
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant
    REQUEST_CODE_GLASSES_CAMERA,
    projectedDeviceId
)

Poin penting tentang kode

  • Untuk menargetkan kacamata audio dan layar, dapatkan ID perangkat yang sesuai dari konteks yang diproyeksikan yang telah Anda buat menggunakan createProjectedDeviceContext. Teruskan ID ini dengan panggilan Anda ke metode requestPermissions.

Menangani hasil izin

Setelah pengguna merespons dialog izin di ponsel, keputusannya akan dikirimkan ke aplikasi Anda dengan memanggil callback onRequestPermissionsResult.

Untuk menangani respons, ganti onRequestPermissionsResult dalam instance Activity yang memulai permintaan izin.

Cuplikan kode berikut menunjukkan cara menangani callback dan memverifikasi apakah pengguna memberikan izin yang diminta:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String>,
    grantResults: IntArray,
    deviceId: Int,
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)
    if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return

    val isCameraGranted =
        grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) ==
            PackageManager.PERMISSION_GRANTED

    if (isCameraGranted) {
        initializeCameraFeatures()
    } else {
        onCameraPermissionDenied()
    }
}

Poin penting tentang kode
  • Gunakan penggantian deviceId dengan callback onRequestPermissionsResult untuk memastikan status izin dipetakan dengan benar ke konteks tertentu, seperti kacamata audio atau tampilan, bukan ponsel host.
  • Aplikasi Anda harus menangani hasil yang diberikan dan ditolak dengan baik.