Telefonda olduğu gibi, ses arabirimli gözlük ve görüntü arabirimli gözlüklerde kamera gibi hassas donanımlara erişmek için kullanıcının açık rızası gerekir. Bunlar gözlüğe özel izinler olarak kabul edilir ve uygulamanızın, telefonda ilgili izinlere sahip olsa bile çalışma zamanında bu izinleri istemesi gerekir.
Uygulamanızın manifest dosyasında izinleri beyan etme
İzin istemeden önce <uses-permission> öğesini kullanarak izinleri uygulamanızın manifest dosyasında beyan etmeniz gerekir. Bu beyan, iznin telefon veya gözlüğe özel bir özellik için olup olmadığına bakılmaksızın aynı kalır ancak gözlüğe özel donanım veya işlevler için bu izni 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>
Akıllı gözlük izinlerini istemeden önce
Kullanıcılarınıza en iyi deneyimi sunmak için izin ilkelerini ve iş akışlarını inceleyin. Örneğin, kullanıcının uygulamanızın gerektirdiği çalışma zamanında istenen izinleri verip vermediğini ve gözlüğe özel izinleri istemeden önce uygulamanızın kullanıcıya bir gerekçe göstermesi gerekip gerekmediğini kontrol edin.
İzin senaryoları
Ses ve görüntülü gözlüklerde tehlikeli çalışma zamanında istenen izinler istenirken karşılaşabileceğiniz farklı senaryolar vardır:
- Yansıtılan bir etkinlikten çalışma zamanında istenen izinleri isteme
- Telefon etkinliğinden çalışma zamanında istenen izinleri isteme
Her senaryoyla ilgili ayrıntılar için bu kılavuzdaki aşağıdaki bölümlere bakın.
Yansıtılan bir etkinlikten çalışma zamanında istenen izinleri isteme
Yansıtılan bir etkinlikten ses veya görüntü arabirimli gözlük için çalışma zamanında istenen izinleri talep etmek üzere ProjectedActivityCompat.requestPermissions yöntemini kullanın.
Bu yöntemin çağrılması, hem gözlükte hem de ana telefonda koordineli bir kullanıcı işlemleri akışını tetikler.
- Gözlükte: Sistem, gözlükte planlanan bir tamamlayıcı etkinlik açarak kullanıcıdan izin isteğine yanıt vermek için telefonunu kontrol etmesini ister.
- Telefonda: Telefon ekranında bir Android sistem izni iletişim kutusu görünür. İletişim kutusunda, kullanıcının telefonun kendisi için değil, gözlük için izin verdiği açıkça belirtilir. Kullanıcı, isteği onaylayabilir veya reddedebilir.
Aşağıdaki örnekte, yansıtılan bir etkinlikten gözlük izinlerinin nasıl isteneceğini gösterilmektedir:
@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) } } }
Kodla ilgili önemli noktalar
- Standart
ActivityCompatyöntemi yerineProjectedActivityCompat.requestPermissionskullanın. Bu yöntem, ana makine telefonu yerine görüntülü gözlük ve ses için çalışma zamanında istenen izinleri açıkça hedefler.
İzin sonuçlarını işleme
Kullanıcı telefondaki izin iletişim kutusuna yanıt verdiğinde, kararı onRequestPermissionsResult geri çağırma işlevi çağrılarak uygulamanıza iletilir.
Sistem, yansıtılan tamamlayıcı etkinliği otomatik olarak kapatır. Ses arabirimli gözlüklerde bu durum, sesli uyarı sona erdikten sonra gerçekleşir. Görüntülü gözlüklerde, kullanıcı tüm izin iletişim kutularına yanıt verdikten sonra gerçekleşir.
Yanıtı işlemek için izin isteğini başlatan Activity örneğinde onRequestPermissionsResult() yöntemini geçersiz kılın.
Aşağıdaki kod snippet'inde, geri çağırma işlevinin nasıl işleneceği ve kullanıcının istenen izinleri verip vermediğinin nasıl doğrulanacağı gösterilmektedir:
@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() } }
Kodla ilgili önemli noktalar
- İzin durumunun, ana makine telefonu yerine ses veya görüntü arabirimli gözlük gibi belirli bağlama doğru şekilde eşlendiğinden emin olmak için
onRequestPermissionsResultgeri çağırma işleviyledeviceIdaşırı yüklemesini kullanın. - Uygulamanız hem izin verilen hem de reddedilen sonuçları sorunsuz bir şekilde işlemelidir.
Telefon etkinliğinde çalışma zamanında istenen izinleri isteme
Uygulamanız bir telefon etkinliğinde çalışıyor ancak ses veya görüntü arabirimli gözlük için izin gerektiriyorsa (ör. kullanıcının video akışını gözlüğün kamerasına geçirerek birinci şahıs bakış açısı elde etmesini sağlamak için) cihaza özel Activity#requestPermissions(permissions, requestCode,
deviceId) yöntemini kullanarak izinleri isteyin:
// 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 )
Kodla ilgili önemli noktalar
- Ses ve görüntü arabirimli gözlükleri hedeflemek için
createProjectedDeviceContextkullanarak oluşturduğunuz öngörülen bağlamdan uygun cihaz kimliğini alın. Bu kimliği,requestPermissionsyöntemine yaptığınız çağrıyla iletin.
İzin sonuçlarını işleme
Kullanıcı telefondaki izin iletişim kutusuna yanıt verdiğinde, kararı onRequestPermissionsResult geri çağırma işlevi çağrılarak uygulamanıza iletilir.
Yanıtı işlemek için izin isteğini başlatan Activity örneğinde onRequestPermissionsResult yöntemini geçersiz kılın.
Aşağıdaki kod snippet'inde, geri çağırma işlevinin nasıl işleneceği ve kullanıcının istenen izinleri verip vermediğinin nasıl doğrulanacağı gösterilmektedir:
@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() } }
Kodla ilgili önemli noktalar
- İzin durumunun, ana makine telefonu yerine ses veya görüntü arabirimli gözlük gibi belirli bağlama doğru şekilde eşlendiğinden emin olmak için
onRequestPermissionsResultgeri çağırma işleviyledeviceIdaşırı yüklemesini kullanın. - Uygulamanız hem izin verilen hem de reddedilen sonuçları sorunsuz bir şekilde işlemelidir.