Java Android:通过Sco蓝牙耳机播放声音

Java Android:通过Sco蓝牙耳机播放声音,java,android,audio,bluetooth,Java,Android,Audio,Bluetooth,在过去的几天里,我一直在尝试通过我的android手机上的sco蓝牙耳机播放任何声音。我这个项目的最终目标是最终制作车库门开启器,但首先我需要能够通过耳机播放声音 以下是我正在使用的当前代码的基础: ==Manifest== <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> ==Code== audioManager = (AudioManager) getSystemS

在过去的几天里,我一直在尝试通过我的android手机上的sco蓝牙耳机播放任何声音。我这个项目的最终目标是最终制作车库门开启器,但首先我需要能够通过耳机播放声音

以下是我正在使用的当前代码的基础:

==Manifest==
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />


==Code==
    audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);

    audioManager.setMode(AudioManager.MODE_IN_CALL);
    audioManager.startBluetoothSco();
    audioManager.setBluetoothScoOn(true);

    short[] soundData = new short [8000*20];
    for (int iii = 0; iii < 20*8000; iii++) {
        soundData[iii] = 32767;
        iii++;
        soundData[iii] = -32768;
    }

    audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
            8000, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, soundData.length
            * Short.SIZE, AudioTrack.MODE_STATIC);
    audioTrack.write(soundData, 0, soundData.length);
    audioTrack.play();
无论我做什么,这句话都会使我所有的声音停止工作,所以它通常会被注释掉

    audioManager.startBluetoothSco();
    audioManager.setBluetoothScoOn(true);
这两条线使声音停止从前扬声器中传出,使我的耳机发出咔哒声和嘶嘶声,好像它已打开,但没有输出

AudioManager.STREAM_VOICE_CALL
这是我调用AudioTrack构造函数的一部分,但它有很大的不同。由于设置为STREAM_VOICE_CALL,声音从前扬声器传出,如果我将其设置为STREAM_MUSIC,则声音从后扬声器传出

当我在通话中打开应用程序时:

    audioManager.setMode(AudioManager.MODE_IN_CALL);
在通话过程中,此线路无效,因为已设置通话中的模式。但不同的是,我的声音和电话是混在一起的,而通常它根本不播放

    audioManager.startBluetoothSco();
    audioManager.setBluetoothScoOn(true);
这些,与他们的对半关闭,控制音频来自何处。如果我关闭这些,我的声音和电话来自前扬声器,当这些打开时,电话来自我的耳机,我的声音丢失

至于为什么我的代码不起作用,我真的不知道。我相信我已经完成了使用清单


那么,有人知道我做错了什么吗?有一次我设法通过耳机播放我的声音,但当我忘记停止我的音轨时,那只是一个短音(),所以我不得不假设这是一个小故障。

尝试将audiomanager设置为audiomanager.MODE\u NORMAL。这些对我有用。

添加到清单:

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />


我实际上设法解决了这个问题。问题是我在耳机上播放的音调频率太高。我只需将创建音频文件的代码加倍,使其变为高-高-低-低,而不是高-低-高-低,就解决了这个问题。

我找到了解决方案。 您必须调用
audioManager.setMode(audioManager.MODE\u IN\u call)仅在连接插座后,即您收到
AudioManager.SCO\u AUDIO\u STATE\u connected
。我可以听到Spica上运行android 2.2.2的TTS

编辑: 以下是我的(旧)实现:

public class BluetoothNotificationReceiver
extends BroadcastReceiver
{   

    /**
     * 
     */
    public BluetoothNotificationReceiver(Handler h)
    {
        super();
        bnrHandler = h;
    }

    /* (non-Javadoc)
     * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
     */
    @Override
    public void onReceive(Context arg0, Intent arg1)
    {
        String action = arg1.getAction();
        if (action.equalsIgnoreCase(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED))
        {
            int l_state = arg1.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
            Log.d("bnr", "Audio SCO: " + AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED);
            switch(l_state)
            {
            case AudioManager.SCO_AUDIO_STATE_CONNECTED:
            { 
                Log.i("bnr", "SCO_AUDIO_STATE_CONNECTED");
            }
            break;
            case AudioManager.SCO_AUDIO_STATE_DISCONNECTED:
                { 
                    Log.e("bnr", "SCO_AUDIO_STATE_DISCONNECTED");                   
                }
            break;
            default: Log.e("bnr", "unknown state received:"+l_state);
            }
        }
        else
            Log.e("bnr", "onReceive:action="+action);
    }
}

我不知道它是否仍在使用新的API。

在这段代码中,您在哪里将AudioManager.MODE\u设置为正常?因为我从来没有真正弄乱过蓝牙设置,所以不需要这些设置。我很确定我在使用这段代码时,我将它设置为正常模式,声音只是通过主扬声器而不是手机听筒播放。虽然我可能错了,但它现在可以工作了。如果音频管理器启用了mode type
mode\u NORMAL
,它就不能与蓝牙一起工作。我对android非常陌生。我面临的问题与提问者(工程师77)面临的问题完全相同。我检查了所有可能的原因,但没有运气。你的解决方案很可能会解决这个问题。但不幸的是,我无法理解你解决问题的方式。如果您能解释一下,您所说的“将创建音频文件的代码加倍”和“高-高-低-低”是什么意思,这将对我有所帮助。你是说给“AudioTrack”构造器增加价值吗?我没听懂你说的
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
public class BluetoothNotificationReceiver
extends BroadcastReceiver
{   

    /**
     * 
     */
    public BluetoothNotificationReceiver(Handler h)
    {
        super();
        bnrHandler = h;
    }

    /* (non-Javadoc)
     * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
     */
    @Override
    public void onReceive(Context arg0, Intent arg1)
    {
        String action = arg1.getAction();
        if (action.equalsIgnoreCase(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED))
        {
            int l_state = arg1.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
            Log.d("bnr", "Audio SCO: " + AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED);
            switch(l_state)
            {
            case AudioManager.SCO_AUDIO_STATE_CONNECTED:
            { 
                Log.i("bnr", "SCO_AUDIO_STATE_CONNECTED");
            }
            break;
            case AudioManager.SCO_AUDIO_STATE_DISCONNECTED:
                { 
                    Log.e("bnr", "SCO_AUDIO_STATE_DISCONNECTED");                   
                }
            break;
            default: Log.e("bnr", "unknown state received:"+l_state);
            }
        }
        else
            Log.e("bnr", "onReceive:action="+action);
    }
}