Genau wie bei einem Smartphone ist für den Zugriff auf sensible Hardware wie die Kamera auf Audio- und Display-Brillen die ausdrückliche Nutzereinwilligung erforderlich. Diese Berechtigungen gelten als brillenspezifische Berechtigungen und müssen von Ihrer App zur Laufzeit angefordert werden, auch wenn sie bereits die entsprechenden Berechtigungen auf dem Smartphone hat.
Berechtigungen im Manifest Ihrer App deklarieren
Bevor du Berechtigungen anforderst, musst du sie in der Manifestdatei deiner App mit dem Element <uses-permission> deklarieren. Diese Deklaration bleibt gleich, unabhängig davon, ob die Berechtigung für ein Smartphone oder eine brillenspezifische Funktion gilt. Sie müssen sie jedoch weiterhin explizit für brillenspezifische Hardware oder Funktionen anfordern.
<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>
Vor dem Anfordern von Berechtigungen für die Brille
Lies dir die Prinzipien und Workflows für Berechtigungen durch, um deinen Nutzern die bestmögliche Erfahrung zu bieten. Prüfe beispielsweise, ob der Nutzer die von deiner App benötigten Laufzeitberechtigungen bereits erteilt hat und ob deine App dem Nutzer eine Begründung anzeigen sollte, bevor sie brillenspezifische Berechtigungen anfordert.
Berechtigungsszenarien
Beim Anfordern von gefährlichen Laufzeitberechtigungen für Audio- und Display-Brillen können verschiedene Szenarien auftreten:
- Laufzeitberechtigungen von einer projizierten Aktivität anfordern
- Laufzeitberechtigungen von einer Smartphone-Aktivität anfordern
Weitere Informationen zu den einzelnen Szenarien finden Sie in den folgenden Abschnitten dieses Leitfadens.
Laufzeitberechtigungen von einer projizierten Aktivität anfordern
Wenn Sie Laufzeitberechtigungen für Audio- oder Display-Brillen von einer projizierten Aktivität anfordern möchten, verwenden Sie die Methode ProjectedActivityCompat.requestPermissions.
Durch den Aufruf dieser Methode wird ein koordinierter Nutzerablauf sowohl auf der Brille als auch auf dem Host-Smartphone ausgelöst.
- Auf der Brille: Das System öffnet eine projizierte Companion-Aktivität auf der Brille und fordert den Nutzer auf, auf seinem Smartphone auf die Berechtigungsanfrage zu antworten.
- Auf dem Smartphone: Auf dem Display des Smartphones wird ein Dialogfeld für die Android-Systemberechtigung angezeigt. Im Dialogfeld wird ausdrücklich darauf hingewiesen, dass der Nutzer die Berechtigung für die Brille und nicht für das Smartphone selbst erteilt. Der Nutzer kann die Anfrage dann genehmigen oder ablehnen.
Im folgenden Beispiel wird gezeigt, wie Sie von einer projizierten Aktivität aus Berechtigungen für die Brille anfordern:
@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) } } }
Wichtige Punkte zum Code
- Verwenden Sie
ProjectedActivityCompat.requestPermissionsanstelle der StandardmethodeActivityCompat. Diese Methode zielt explizit auf die Laufzeitberechtigungen für Audio- und Display-Brillen ab, nicht auf das Host-Smartphone.
Berechtigungsergebnisse verarbeiten
Sobald der Nutzer auf das Dialogfeld für die Berechtigung auf dem Smartphone reagiert, wird seine Entscheidung an deine App übermittelt, indem der Callback onRequestPermissionsResult aufgerufen wird.
Das System schließt die projizierte Companion-Aktivität automatisch. Bei Audiobrillen geschieht dies, nachdem das Audiosignal abgespielt wurde. Bei Display-Brillen geschieht dies, nachdem der Nutzer auf alle Berechtigungsdialoge reagiert hat.
Überschreiben Sie zum Verarbeiten der Antwort onRequestPermissionsResult() in der Activity-Instanz, die die Berechtigungsanfrage initiiert hat.
Das folgende Code-Snippet zeigt, wie der Callback verarbeitet und geprüft wird, ob der Nutzer die angeforderten Berechtigungen erteilt hat:
@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() } }
Wichtige Punkte zum Code
- Verwenden Sie die Überladung
deviceIdmit dem CallbackonRequestPermissionsResult, um sicherzustellen, dass der Berechtigungsstatus dem spezifischen Kontext korrekt zugeordnet wird, z. B. der Audio- oder Display-Brille und nicht dem Host-Smartphone. - Ihre App sollte sowohl mit gewährten als auch mit abgelehnten Berechtigungen ordnungsgemäß umgehen.
Laufzeitberechtigungen in einer Smartphone-Aktivität anfordern
Wenn Ihre App in einer Smartphone-Aktivität ausgeführt wird, aber Berechtigungen für Audio- oder Display-Brillen benötigt, z. B. um einem Nutzer zu ermöglichen, einen Videostream auf die Kamera der Brille umzuschalten, um eine Ich-Perspektive zu erhalten, fordern Sie die Berechtigungen mit der gerätespezifischen Methode Activity#requestPermissions(permissions, requestCode,
deviceId) an:
// 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 )
Wichtige Punkte zum Code
- Wenn Sie Audio- und Display-Brillen als Zielgeräte festlegen möchten, rufen Sie die entsprechende Geräte-ID aus einem projizierten Kontext ab, den Sie mit
createProjectedDeviceContexterstellt haben. Übergeben Sie diese ID mit Ihrem Aufruf an die MethoderequestPermissions.
Berechtigungsergebnisse verarbeiten
Sobald der Nutzer auf dem Smartphone auf das Dialogfeld für die Berechtigung reagiert, wird seine Entscheidung über den Callback onRequestPermissionsResult an deine App übermittelt.
Überschreiben Sie zum Verarbeiten der Antwort onRequestPermissionsResult in der Activity-Instanz, die die Berechtigungsanfrage initiiert hat.
Das folgende Code-Snippet zeigt, wie der Callback verarbeitet und geprüft wird, ob der Nutzer die angeforderten Berechtigungen erteilt hat:
@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() } }
Wichtige Punkte zum Code
- Verwenden Sie die Überladung
deviceIdmit dem CallbackonRequestPermissionsResult, um sicherzustellen, dass der Berechtigungsstatus dem spezifischen Kontext korrekt zugeordnet wird, z. B. der Audio- oder Display-Brille und nicht dem Host-Smartphone. - Ihre App sollte sowohl mit gewährten als auch mit abgelehnten Berechtigungen ordnungsgemäß umgehen.