Registra dal microfono dell'auto

Puoi utilizzare le API CarAppService e CarAudioRecord dell'auto per concedere alla tua app l'accesso al microfono dell'auto dell'utente. Gli utenti devono concedere l'autorizzazione alla tua app per accedere al microfono dell'auto. La tua app può registrare ed elaborare l'input dell'utente nella tua app.

Dichiarare l'autorizzazione per registrare

Prima di registrare qualsiasi audio, devi prima dichiarare l'autorizzazione alla registrazione nel tuo AndroidManifest.xml e richiedere all'utente di concederla.

<manifest ...>
   ...
   <uses-permission android:name="android.permission.RECORD_AUDIO" />
   ...
</manifest>

Devi richiedere l'autorizzazione per la registrazione al runtime. Per scoprire di più su come richiedere le autorizzazioni nella tua auto, consulta Richiedere le autorizzazioni.

Registra audio

Dopo che l'utente ha concesso l'autorizzazione alla registrazione, puoi registrare l'audio ed elaborare la registrazione.

val carAudioRecord = CarAudioRecord.create(carContext)
carAudioRecord.startRecording()

val data = ByteArray(CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE)
while (carAudioRecord.read(data, 0, CarAudioRecord.AUDIO_CONTENT_BUFFER_SIZE) >= 0) {
    // Use data array
    // Potentially call carAudioRecord.stopRecording() if your processing finds end of speech
}
carAudioRecord.stopRecording()

Acquisire il focus audio

Quando registri dal microfono dell'auto, devi prima acquisire il focus audio. In questo modo, i contenuti multimediali in riproduzione vengono interrotti. Se perdi il focus audio, interrompi la registrazione. Ad esempio, per acquisire il focus audio:

val carAudioRecord = CarAudioRecord.create(carContext)

// Take audio focus so that user's media is not recorded
val audioAttributes = AudioAttributes.Builder()
    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
    // Use the most appropriate usage type for your use case
    .setUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
    .build()

val audioFocusRequest =
    AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
        .setAudioAttributes(audioAttributes)
        .setOnAudioFocusChangeListener { state: Int ->
            if (state == AudioManager.AUDIOFOCUS_LOSS) {
                // Stop recording if audio focus is lost
                carAudioRecord.stopRecording()
            }
        }
        .build()

val audioManager = carContext.getSystemService(AudioManager::class.java)
if (audioManager == null ||
    audioManager.requestAudioFocus(audioFocusRequest)
    != AudioManager.AUDIOFOCUS_REQUEST_GRANTED
) {
    // Don't record if the focus isn't granted
    return
}

carAudioRecord.startRecording()
// Process the audio and abandon the AudioFocusRequest when done