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

می‌توانید از 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