ضبط از میکروفون ماشین

شما می‌توانید CarAppService و CarAudioRecord API ماشین خود برای اعطای دسترسی به میکروفون ماشین کاربر به برنامه خود استفاده کنید. کاربران باید به برنامه شما اجازه دسترسی به میکروفون ماشین را بدهند. برنامه شما می‌تواند ورودی کاربر را در برنامه ضبط و پردازش کند.

اعلام اجازه ضبط

قبل از ضبط هرگونه صدا، ابتدا باید مجوز ضبط را در AndroidManifest.xml خود اعلام کنید و از کاربر درخواست کنید که آن را اعطا کند.

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

شما باید در زمان اجرا درخواست مجوز ضبط را بدهید. برای کسب اطلاعات بیشتر در مورد نحوه درخواست مجوز در ماشین خود، به درخواست مجوزها مراجعه کنید.

ضبط صدا

پس از اینکه کاربر اجازه ضبط را داد، می‌توانید صدا را ضبط کرده و ضبط را پردازش کنید.

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

فوکوس صوتی را بدست آورید

هنگام ضبط از میکروفون ماشین، ابتدا باید فوکوس صوتی را فعال کنید. این کار هرگونه رسانه در حال پخش را متوقف می‌کند. اگر فوکوس صوتی را از دست دادید، ضبط را متوقف کنید. به عنوان مثال، برای فعال کردن فوکوس صوتی:

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