从安卓应用程序以编程方式连接到蓝牙耳机 [英] Programmatically connect to bluetooth headset from android app

查看:41
本文介绍了从安卓应用程序以编程方式连接到蓝牙耳机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何从我的安卓应用连接蓝牙耳机?我找到了很多关于发现蓝牙设备和配对的教程,但关于连接的教程却很少.

How to connect to bluetooth headset from my android app? I have found lots of tutorials on discovering bluetooth devices and pairing and very few on connecting.

推荐答案

首先,您需要确保蓝牙已启用,然后搜索未配对的设备,然后使用设备地址,配对设备.

First of All, you need to make sure Bluetooth is Enabled then Search for Unpaired Devices, Then Using Device Address, You pair the Device.

配对成功后,您需要连接到设备以及 HSP 或 HFP 配置文件.请注意,如果没有 HSP(耳机配置文件)或 HFP(免提配置文件),您将无法通过耳机或扬声器连接和流式传输通话.

After Successful Pairing, you will need to connect to the device and Also HSP or HFP profiles. Note without HSP(Headset Profile) or HFP(Hands-Free Profile) you won't be able to connect and stream calls to your Headset or Speaker.

我列出了步骤,您可以通过谷歌搜索轻松找到更多详细信息.希望这对您有所帮助.

I laid down the steps for you can easily find more details by googling each step. Hopefully, this helps you.

更新

我会尽力为您提供更多帮助:您必须在src"下添加一个新包.文件夹名称:android.bluetooth然后创建 IBluetoothHeadset.aidl

I will try and help you a bit more : you have to add a new package under the "src" folder with name: android.bluetooth then create IBluetoothHeadset.aidl

使用以下代码:

package android.bluetooth;

import android.bluetooth.BluetoothDevice;
interface IBluetoothHeadset {

// Public API
boolean connect(in BluetoothDevice device); //Api 11 and above
boolean connectHeadset(in BluetoothDevice device); // Below Api 11

boolean disconnect(in BluetoothDevice device);
boolean disconnectHeadset(in BluetoothDevice device);
    
List<BluetoothDevice> getConnectedDevices();
List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states);
int getConnectionState(in BluetoothDevice device);
int getState(in BluetoothDevice device);
boolean setPriority(in BluetoothDevice device, int priority);
int getPriority(in BluetoothDevice device);
boolean startVoiceRecognition(in BluetoothDevice device);
boolean stopVoiceRecognition(in BluetoothDevice device);
boolean isAudioConnected(in BluetoothDevice device);
boolean sendVendorSpecificResultCode(in BluetoothDevice device,
                                     in String command,
                                     in String arg);

// APIs that can be made public in future
int getBatteryUsageHint(in BluetoothDevice device);

// Internal functions, not be made public
boolean acceptIncomingConnect(in BluetoothDevice device);
boolean rejectIncomingConnect(in BluetoothDevice device);
int getAudioState(in BluetoothDevice device);

boolean isAudioOn();
boolean connectAudio();
boolean disconnectAudio();
boolean startScoUsingVirtualVoiceCall(in BluetoothDevice device);
boolean stopScoUsingVirtualVoiceCall(in BluetoothDevice device);
void phoneStateChanged(int numActive, int numHeld, int callState, String number, int type);
void clccResponse(int index, int direction, int status, int mode, boolean mpty,
                  String number, int type);
}

然后在您的活动中

     BluetoothDevice DeviceToConnect;
     IBluetoothHeadset ibth; 
     //IBluetoothHeadset instance used to connect and disconnect headset afterwards

     // Create and Register BroadCastListener for Action "HEADSET_INTERFACE_CONNECTED"
     // In Broadcast your code has to be something like that
     // if(ibth != null) ibth.connect(DeviceToConnect);

     
     //Then After Pairing DeviceToConnect;
     Intent i = new Intent(IBluetoothHeadset.class.getName());

    if (bindService(i, HSPConnection, Context.BIND_AUTO_CREATE)) {

    } else {
       Log.e("HSP FAILED", "Could not bind to Bluetooth HFP Service");
   }

     
      //Method for bind
  public static ServiceConnection HSPConnection= new ServiceConnection() {
        
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            ibth = IBluetoothHeadset.Stub.asInterface(service);
            //ibth instance used to connect and disconnect headset afterwards
            Intent intent = new Intent();
            intent.setAction("HEADSET_INTERFACE_CONNECTED");
            //same as the one we register earlier for broadcastreciever
                            ctx.sendBroadcast(intent);
            //ctx is Instance of Context
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            ibth=null;
        }

    };

更新 2:

<intent-filter> 
  <action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
  <action android:name="android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED" />
  <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
</intent-filter>

这些是您必须添加到广播接收器中的过滤器.

These are the filters you have to add to your broad cast receiver.

蓝牙连接时ACL_CONNECTED信号和蓝牙断开时ACL_DISCONNECTED信号

ACL_CONNECTED signals when bluetooth is connected and ACL_DISCONNECTED signals bluetooth disconnection

对于特定设备,您必须在广播接收器中检查意图/上下文

For specific device you have to check intents/context in broadcast receiver

所以您的新接收器(包括以前的接收器)将如下所示:

So your new Receiver including the previous will look something like that:

 BroadcastReceiver bcr = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
           //Device found
        }
        else if (BluetoothAdapter.ACTION_ACL_CONNECTED.equals(action)) {
           //Device is now connected
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            //Done searching
        }
        else if (BluetoothAdapter.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
           //Device is about to disconnect
        }
        else if (BluetoothAdapter.ACTION_ACL_DISCONNECTED.equals(action)) {
           //Device has disconnected add whatever way u want to be notified here
           //e.g music-vibration-screen light
        }else if("HEADSET_INTERFACE_CONNECTED".equals(action){
           if(ibth != null) ibth.connect(DeviceToConnect);
        }
    }
};

我忘了在 Manifest 中添加您需要这 2 个权限:

I forgot to add that you need these 2 permissions in Manifest:

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

这篇关于从安卓应用程序以编程方式连接到蓝牙耳机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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