บันทึกจากไมโครโฟนของรถยนต์

คุณสามารถใช้ 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