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 sudah memiliki izin yang sesuai di ponsel.

Mendeklarasikan izin dalam manifes aplikasi Anda

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 akses 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 dan menangani izin runtime dari aktivitas yang diproyeksikan

Untuk meminta izin bagi kacamata pintar audio dan kacamata pintar dengan layar, pertama-tama gunakan ActivityResultLauncher dengan metode ProjectedPermissionsResultContract untuk mendaftarkan peluncur izin. Setelah pengguna menindaklanjuti permintaan izin, callback akan menerima peta nama izin ke status yang diberikan.

// Register the permissions launcher using the ProjectedPermissionsResultContract.
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
    registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
        if (results[Manifest.permission.CAMERA] == true) {
            isPermissionDenied = false
            initializeGlassesFeatures()
        } else {
            // Handle permission denial.
            isPermissionDenied = true
        }
    }

Poin penting tentang kode

Untuk memicu alur permintaan izin, teruskan daftar ProjectedPermissionsRequestParams ke metode launch peluncur izin yang terdaftar. Objek ProjectedPermissionsRequestParams menggabungkan izin manifes yang diminta dengan string rationale kustom. String rationale harus menjelaskan dengan jelas dan ringkas alasan aplikasi memerlukan akses ke fitur hardware kacamata (seperti kamera atau mikrofon).

private fun requestHardwarePermissions() {
    val params = ProjectedPermissionsRequestParams(
        permissions = listOf(Manifest.permission.CAMERA),
        rationale = "Camera access is required to overlay digital content on your physical environment."
    )
    requestPermissionLauncher.launch(listOf(params))
}

Poin penting tentang kode

Memahami alur pengguna permintaan izin

Saat Anda meluncurkan permintaan izin menggunakan metode ProjectedPermissionsResultContract, sistem akan memulai alur pengguna yang terkoordinasi di kacamata dan ponsel.

Selama alur penggunaan izin, berikut yang dapat diharapkan aplikasi dan pengguna:

  1. Di kacamata: Aktivitas muncul di perangkat yang diproyeksikan (kacamata), yang menginstruksikan pengguna untuk melihat ponsel mereka untuk melanjutkan.

  2. Di ponsel: Secara bersamaan, aktivitas diluncurkan di perangkat host (ponsel). Layar ini menampilkan string alasan yang Anda berikan dan memberi pengguna opsi untuk melanjutkan atau membatalkan.

  3. Di ponsel: Jika pengguna menerima alasan, dialog izin sistem Android yang diubah akan muncul di ponsel, yang memberi tahu pengguna bahwa mereka memberikan izin untuk kacamata (bukan ponsel), dan pengguna dapat memberikan atau menolak izin secara resmi.

  4. Menerima hasil: Setelah pengguna membuat pilihan terakhir, aktivitas di ponsel dan kacamata akan ditutup. Callback ActivityResultLauncher Anda kemudian dipanggil dengan peta yang berisi status yang diberikan untuk setiap izin yang diminta.

Meminta izin runtime dalam aktivitas ponsel

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

Untuk menargetkan kacamata audio dan tampilan, dapatkan ID perangkat yang sesuai dengan memanggil getDeviceId pada konteks perangkat yang diproyeksikan. Teruskan ID ini saat meminta izin dari aktivitas ponsel Anda, seperti yang ditunjukkan dalam contoh berikut:

// 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
)

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:

private companion object {
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant.
    const val REQUEST_CODE_GLASSES_CAMERA = 1001
}

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

    // Handle the result of the permission request
    if (requestCode == REQUEST_CODE_GLASSES_CAMERA && deviceId == projectedDeviceId) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Proceed with glasses camera features
        } else {
            // Handle glasses permission denied
        }
    }
}

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.