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

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

جاوا

CarAudioRecord carAudioRecord = CarAudioRecord.create(getCarContext());
        carAudioRecord.startRecording();

        byte[] data = new byte[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()

        if (carContext.getSystemService(AudioManager::class.java)
                .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

جاوا

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

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

        if (getCarContext().getSystemService(AudioManager.class).requestAudioFocus(audioFocusRequest)
                != AUDIOFOCUS_REQUEST_GRANTED) {
            // Don't record if the focus isn't granted
            return;
        }

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