Ses gözlüğü ve ekran gözlüğü için donanım izinleri isteme

Uygun XR cihazlar
Bu kılavuz, bu tür XR cihazlar için deneyimler oluşturmanıza yardımcı olur.
Ses ve
Ekran Gözlükleri

Tıpkı telefonda olduğu gibi, ses gözlükleri ve ekran gözlüklerindeki kamera ve mikrofon gibi hassas donanımlara erişmek için kullanıcının açık izni gerekir. Bunlar gözlüğe özel izinler olarak kabul edilir ve uygulamanız, telefonda ilgili izinlere sahip olsa bile bunları çalışma zamanında istemelidir.

Uygulamanızın manifest dosyasındaki izinleri beyan etme

İzin istemeden önce <uses-permission> öğesini kullanarak izinleri uygulamanızın manifest dosyasında beyan etmeniz gerekir. Bu beyan, izin telefona veya gözlüğe özgü bir özellik için olsa da aynı kalır ancak gözlüğe özgü donanım veya işlevler için yine de açıkça istemeniz gerekir.

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

Gözlük izinleri istenmeden önce

Kullanıcılarınıza en iyi deneyimi sunduğunuzdan emin olmak için izin ilkelerini ve iş akışlarını inceleyin. Örneğin, kullanıcının uygulamanızın gerektirdiği çalışma zamanı izinlerini daha önce verip vermediğini kontrol edin ve gözlüğe özgü izinleri istemeden önce uygulamanızın kullanıcıya bir gerekçe gösterip göstermemesi gerektiğini belirleyin.

İzin senaryoları

Ses ve ekran gözlüklerinde tehlikeli çalışma zamanı izinleri istenirken karşılaşabileceğiniz farklı senaryolar vardır:

  • Yansıtılan bir etkinlikten çalışma zamanı izni isteme
  • Telefon etkinliğinden çalışma zamanı izni isteme

Her senaryo hakkında ayrıntılı bilgi için bu kılavuzdaki aşağıdaki bölümlere bakın.

Yansıtılan bir etkinlikten çalışma zamanı izinleri isteme ve bunları işleme

Ses gözlüğü ve ekran gözlüğü için izin istemek üzere önce izin başlatıcıyı kaydetmek için ActivityResultLauncher ile ProjectedPermissionsResultContract yöntemini kullanın. Kullanıcı izin isteğiyle ilgili işlem yaptığında geri çağırma, izin adlarının verilen durumlarına ilişkin bir harita alır.

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

Kodla ilgili önemli noktalar

İzin isteği akışını tetiklemek için kayıtlı izin başlatıcınızın launch yöntemine ProjectedPermissionsRequestParams listesini iletin. ProjectedPermissionsRequestParams nesnesi, istenen manifest izinlerini özel bir rationale dizesiyle birlikte paketler. rationale dizesi, uygulamanın neden gözlüğün donanım özelliklerine (ör. kamera veya mikrofon) erişmesi gerektiğini net ve kısa bir şekilde açıklamalıdır.

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

Kodla ilgili önemli noktalar

İzin isteği kullanıcı akışını anlama

ProjectedPermissionsResultContract yöntemini kullanarak bir izin isteği başlattığınızda sistem, hem gözlük hem de telefon genelinde koordineli bir kullanıcı akışı başlatır.

İzinler kullanıcı işlemleri akışı sırasında uygulamanız ve kullanıcı şunları bekleyebilir:

  1. Gözlükte: Yansıtılan cihazda (gözlük) bir etkinlik görünür ve kullanıcıya devam etmek için telefonuna bakması talimatı verilir.

  2. Telefonda: Aynı anda ana makine cihazında (telefon) bir etkinlik başlatılır. Bu ekranda, sağladığınız gerekçe dizesi gösterilir ve kullanıcıya devam etme veya iptal etme seçeneği sunulur.

  3. Telefonda: Kullanıcı gerekçeyi kabul ederse telefonda değiştirilmiş bir Android sistem izni iletişim kutusu gösterilir. Bu iletişim kutusunda, kullanıcının izni telefon için değil gözlük için verdiği belirtilir. Kullanıcı, izni resmi olarak verebilir veya reddedebilir.

  4. Sonucu alma: Kullanıcı son seçimini yaptıktan sonra hem telefondaki hem de gözlükteki etkinlikler kapatılır. Ardından, istenen her izin için verilen durumu içeren bir harita ile ActivityResultLauncher geri aramanız çağrılır.

Telefon etkinliğinde çalışma zamanı izinleri isteme

Uygulamanız bir telefon etkinliğinde çalışıyorsa ancak ses veya ekran gözlüğü için izin gerektiriyorsa (ör. kullanıcının video akışını birinci şahıs bakış açısı için gözlüğün kamerasına geçirmesine izin vermek) cihaza özel Activity#requestPermissions(permissions, requestCode, deviceId) yöntemini kullanarak izin isteğinde bulunun.

Ses ve ekran gözlüklerini hedeflemek için yansıtılan bir cihaz bağlamında getDeviceId işlevini çağırarak uygun cihaz kimliğini alın. Telefon etkinliğinizden izin isterken bu kimliği aşağıdaki örnekte gösterildiği gibi iletin:

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

İzin sonuçlarını işleme

Kullanıcı telefondaki izin iletişim kutusunu yanıtladıktan sonra, onRequestPermissionsResult geri çağırma işlevi çağrılarak kararı uygulamanıza iletilir.

Yanıtı işlemek için izin isteğini başlatan Activity örneğinde onRequestPermissionsResult değerini geçersiz kılın.

Aşağıdaki kod snippet'inde geri çağırmanın nasıl işleneceği ve kullanıcının istenen izinleri verip vermediğinin nasıl doğrulanacağı gösterilmektedir:

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
        }
    }
}

Kodla ilgili önemli noktalar
  • İzin durumunun, ana makine telefonu yerine ses veya ekran gözlüğü gibi belirli bir bağlama doğru şekilde eşlendiğinden emin olmak için deviceId geri çağırma ile onRequestPermissionsResult aşırı yüklemesini kullanın.
  • Uygulamanız hem verilen hem de reddedilen sonuçları sorunsuz bir şekilde işlemelidir.