以编程方式连接到配对的蓝牙扬声器并播放音频 [英] Programmatically connect to paired Bluetooth speaker and play audio

查看:38
本文介绍了以编程方式连接到配对的蓝牙扬声器并播放音频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我们的应用中,我想连接到之前配对的 A2DP 蓝牙扬声器,并使用 Android v4.2 或更高版本直接播放音频.

In our app, I'd like to connect to a previously paired A2DP Bluetooth Speaker and direct audio playback to it, using Android v4.2 or later.

我可以使用此代码成功创建 A2DP 配置文件对象以启动流程:

I can successfully create an A2DP profile object using this code to start the process:

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

<小时>

// Get the default adapter
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

// Establish connection to the proxy.
mBluetoothAdapter.getProfileProxy(this, mProfileListener, BluetoothProfile.A2DP)

以及以下监听器来响应连接:

And the following listener to respond to the connection:

private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {

    if (profile == BluetoothProfile.A2DP) {

        mBluetoothSpeaker = (BluetoothA2dp) proxy;

        // no devices are connected         
        List<BluetoothDevice> connectedDevices = mBluetoothSpeaker.getConnectedDevices();

        //the one paired (and disconnected) speaker is returned here
        int[] statesToCheck = {BluetoothA2dp.STATE_DISCONNECTED};           
        List<BluetoothDevice> disconnectedDevices = mBluetoothSpeaker.getDevicesMatchingConnectionStates(statesToCheck);



        BluetoothDevice btSpeaker = disconnectedDevices.get(0); 

        //WHAT NOW?

    }
}
public void onServiceDisconnected(int profile) {
    if (profile == BluetoothProfile.A2DP) {
        mBluetoothSpeaker = null;
    }
}
};

我对现在要做什么、连接设备并将音频输出定向到它有点不知所措.我已经尝试连接到设备,如 Android 文档中所述,使用以下代码,但最终的 BluetoothSpeaker.getConnectedDevices() 调用返回未连接的设备.

I'm just a little lost as to what to do now, to connect the device, and direct the audio output to it. I've tried connecting to the device, as detailed in the Android docs, with the following code, but the final BluetoothSpeaker.getConnectedDevices() call returns no connected devices.

    BluetoothSocket tmp = null;
    UUID MY_UUID = UUID.fromString("00001108-0000-1000-8000-00805f9b34fb");
    try {           
        tmp = btSpeaker.createInsecureRfcommSocketToServiceRecord(MY_UUID);

    } catch (IOException e1) {
        // TODO Auto-generated catch block
        Log.d("createRfcommSocketToServiceRecord ERROR", e1.getMessage());
    }
    mmSocket = tmp;

    try {
        // Connect the device through the socket. This will block
        // until it succeeds or throws an exception
        mmSocket.connect();
    } catch (IOException connectException) {
        // Unable to connect; close the socket and get out
        try {
            Log.d("connectException", connectException.getMessage());
            mmSocket.close();
        } catch (IOException closeException) { }
        return;
    }

    connectedDevices = mBluetoothSpeaker.getConnectedDevices();

代码似乎确实以某种方式连接到设备,因为当我停止执行时,蓝牙扬声器会通知它已准备好配对(就像它与音频源断开连接时一样).

The code does seem to connect to the device in some way though, as when I stop execution, the Bluetooth speaker annouces that it is ready to pair (as it always does when it disconnects from an audio source).

BluetoothA2dp 的旧版本似乎有一个 connect(BluetoothDevice device) 方法,但现在已被删除(从 4.2 开始),我正在努力找到任何关于如何以编程方式连接到 A2DP 设备并将音频输出定向到它的清晰示例.将不胜感激地收到有关如何处理其中任何一个的任何帮助.

Older versions of the BluetoothA2dp seem to have a connect(BluetoothDevice device) method, but that has now been removed (as of 4.2) and I'm struggling to find any clear examples of how to programmatically connect to an A2DP device, and to direct audio output to it. Any help on how to approach either would be gratefully received.

对于如何解决这个问题的任何建议将不胜感激.

Any advice on how to approach this would be hugely appreciated.

推荐答案

这个对我有用.收到BluetoothA2dp.STATE_CONNECTED后,就可以正常播放音乐了.

This one works for me. After receive BluetoothA2dp.STATE_CONNECTED, you can play music as normal.

public class A2DPActivity extends Activity {

protected static final String TAG = "ZS-A2dp";

Button mBtPlay;

BluetoothAdapter mBtAdapter;
BluetoothA2dp mA2dpService;

AudioManager mAudioManager;
MediaPlayer mPlayer;

BroadcastReceiver mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context ctx, Intent intent) {
        String action = intent.getAction();
        Log.d(TAG, "receive intent for action : " + action);
        if (action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)) {
            int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, BluetoothA2dp.STATE_DISCONNECTED);
            if (state == BluetoothA2dp.STATE_CONNECTED) {
                setIsA2dpReady(true);
                playMusic();
            } else if (state == BluetoothA2dp.STATE_DISCONNECTED) {
                setIsA2dpReady(false);
            }
        } else if (action.equals(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED)) {
            int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, BluetoothA2dp.STATE_NOT_PLAYING);
            if (state == BluetoothA2dp.STATE_PLAYING) {
                Log.d(TAG, "A2DP start playing");
                Toast.makeText(A2DPActivity.this, "A2dp is playing", Toast.LENGTH_SHORT).show();
            } else {
                Log.d(TAG, "A2DP stop playing");
                Toast.makeText(A2DPActivity.this, "A2dp is stopped", Toast.LENGTH_SHORT).show();
            }
        }
    }

};

boolean mIsA2dpReady = false;
void setIsA2dpReady(boolean ready) {
    mIsA2dpReady = ready;
    Toast.makeText(this, "A2DP ready ? " + (ready ? "true" : "false"), Toast.LENGTH_SHORT).show();
}

private ServiceListener mA2dpListener = new ServiceListener() {

    @Override
    public void onServiceConnected(int profile, BluetoothProfile a2dp) {
        Log.d(TAG, "a2dp service connected. profile = " + profile);
        if (profile == BluetoothProfile.A2DP) {
            mA2dpService = (BluetoothA2dp) a2dp;
            if (mAudioManager.isBluetoothA2dpOn()) {
                setIsA2dpReady(true);
                playMusic();
            } else {
                Log.d(TAG, "bluetooth a2dp is not on while service connected");
            }
        }
    }

    @Override
    public void onServiceDisconnected(int profile) {
        setIsA2dpReady(false);
    }

};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LinearLayout ll = new LinearLayout(this);
    setContentView(ll);

    mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    registerReceiver(mReceiver, new IntentFilter(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED));
    registerReceiver(mReceiver, new IntentFilter(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED));

    mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    mBtAdapter.getProfileProxy(this, mA2dpListener , BluetoothProfile.A2DP);

}

@Override
protected void onDestroy() {
    mBtAdapter.closeProfileProxy(BluetoothProfile.A2DP, mA2dpService);
    releaseMediaPlayer();
    unregisterReceiver(mReceiver);
    super.onDestroy();
}

@Override
protected void onPause() {
    releaseMediaPlayer();
    super.onPause();
}

private void releaseMediaPlayer() {
    if (mPlayer != null) {
        mPlayer.release();
        mPlayer = null;
    }
}

private void playMusic() {
    mPlayer = new MediaPlayer();
    AssetManager assetManager = this.getAssets();
    AssetFileDescriptor fd;
    try {
        fd = assetManager.openFd("Radioactive.mp3");
        Log.d(TAG, "fd = " + fd);
        mPlayer.setDataSource(fd.getFileDescriptor());
        mPlayer.prepare();
        Log.d(TAG, "start play music");
        mPlayer.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

这篇关于以编程方式连接到配对的蓝牙扬声器并播放音频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆