我正在尝试仅使用耳机在Android中产生声音

问题描述

我正在使用Flutter开发一个应用程序,我只想通过耳机或顶部扬声器(用于通话的声音)发出声音。目前它同时使用大扬声器和耳机,但我想更改它,以便仅在连接耳机时才能收听。我当前用于流式传输和播放音频的程序包是https://pub.dev/packages/sound_stream

这是初始化播放器的代码

private fun initializePlayer(@NonNull call: MethodCall,@NonNull result: Result) {
    mPlayerSampleRate = call.argument<Int>("sampleRate") ?: mPlayerSampleRate
    debugLogging = call.argument<Boolean>("showLogs") ?: false
    mPlayerFormat = AudioFormat.Builder()
            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
            .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
            .setSampleRate(mPlayerSampleRate)
            .build()

    mPlayerBufferSize = AudioTrack.getMinBufferSize(mPlayerSampleRate,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT)

    if (mAudioTrack?.state == AudioTrack.STATE_INITIALIZED) {
        mAudioTrack?.release()
    }

    /*
    // I have tried with different examples but they don't work

    var value = this.pluginContext?.getSystemService(Context.AUdio_SERVICE) as AudioManager

    //For phone ear piece
    value.mode = AudioManager.MODE_IN_COMMUNICATION;
    value.stopBluetoothSco();
    value.isBluetoothScoOn = false;
    value.isspeakerphoneOn = false;

    //For BT
    value.setMode(AudioManager.MODE_IN_COMMUNICATION);
    value.startBluetoothSco();
    value.setBluetoothScoOn(true);

    //For phone speaker(loadspeaker)
    value.setMode(AudioManager.MODE_norMAL);
    value.stopBluetoothSco();
    value.setBluetoothScoOn(false);
    value.setSpeakerphoneOn(true);

     */

    val audioAttributes = AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
            .build()
    mAudioTrack = AudioTrack(audioAttributes,mPlayerFormat,mPlayerBufferSize,AudioTrack.MODE_STREAM,AudioManager.AUdio_SESSION_ID_GENERATE)

    result.success(true)
    sendplayerStatus(SoundStreamStatus.Initialized)
}

这是播放音频代码

private fun startPlayer(result: Result) {
    try {
        if (mAudioTrack?.state == AudioTrack.PLAYSTATE_PLAYING) {
            result.success(true)
            return
        }
        var value = this.pluginContext!!.getSystemService(Context.AUdio_SERVICE) as AudioManager

        if(value.isWiredHeadseton()){
            mAudioTrack!!.play()
        }

        sendplayerStatus(SoundStreamStatus.Playing)
        result.success(true)
    } catch (e: Exception) {
        result.error(SoundStreamErrors.FailedToPlay.name,"Failed to start Player",e.localizedMessage)
    }
}

代码在kotlin的Android部分中使用。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...