日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android 蓝牙耳机 判断,Android实现蓝牙耳机连接

發(fā)布時(shí)間:2025/3/21 Android 97 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 蓝牙耳机 判断,Android实现蓝牙耳机连接 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

最近看了下藍(lán)牙耳機(jī)連接的問(wèn)題,查閱了相關(guān)資料,再此做一個(gè)總結(jié)。

本文參考以下鏈接:

Android實(shí)現(xiàn)主動(dòng)連接藍(lán)牙耳機(jī)

再次對(duì)作者表示感謝。

今天涉及的內(nèi)容有:

流程講解

新建廣播BluetoothReceiver,用于監(jiān)聽(tīng)處理藍(lán)牙連接過(guò)程中各狀態(tài)

在MainActivity中調(diào)用

注意的點(diǎn)

效果圖

下面做以講解

一. 流程講解

在實(shí)現(xiàn)藍(lán)牙耳機(jī)鏈接的時(shí)候,需要做一些前期工作,第一步,判斷設(shè)備是否支持藍(lán)牙。

1.1 設(shè)備是否支持藍(lán)牙

/**設(shè)備是否支持藍(lán)牙**/

public boolean isSupportBluetooth() {

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

if (mBluetoothAdapter != null) {

return true;

}

return false;

}

若支持藍(lán)牙,則需要判斷設(shè)備藍(lán)牙是否打開(kāi)

1.2 設(shè)備藍(lán)牙是否開(kāi)啟

/**藍(lán)牙是否已經(jīng)啟動(dòng)**/

public boolean isBluetoothOpen() {

if (mBluetoothAdapter != null) {

return mBluetoothAdapter.isEnabled();

}

return false;

}

如果藍(lán)牙沒(méi)有開(kāi)啟,則需要請(qǐng)求開(kāi)啟藍(lán)牙

1.3 請(qǐng)求開(kāi)啟藍(lán)牙

/**請(qǐng)求啟動(dòng)藍(lán)牙**/

public void requestStartBluetooth(int requestCode,Context context) {

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

((MainActivity)context).startActivityForResult(enableBtIntent, requestCode);

}

當(dāng)然,藍(lán)牙還有一個(gè)強(qiáng)制開(kāi)啟的方法:

/**強(qiáng)制打開(kāi)藍(lán)牙**/

public void openBluetooth(){

if(isSupportBluetooth()){

mBluetoothAdapter.enable();

}

}

藍(lán)牙開(kāi)啟后,接下來(lái)是查詢已配對(duì)過(guò)的設(shè)備

1.3 獲取配對(duì)過(guò)的設(shè)備列表

/**查詢配對(duì)設(shè)備**/

public List checkDevices() {

List devices=new ArrayList<>();

if(mBluetoothAdapter!=null){

Set pairedDevices = mBluetoothAdapter.getBondedDevices();

if (pairedDevices != null && pairedDevices.size() > 0) {

for (BluetoothDevice device : pairedDevices) {

devices.add(device);

}

}

}

return devices;

}

若已配對(duì)列表中沒(méi)有你的藍(lán)牙耳機(jī)設(shè)備,則需要搜索

1.4 搜索新設(shè)備

/**發(fā)現(xiàn)新設(shè)備**/

public void findBluetoothDevice() {

//其實(shí)是啟動(dòng)了一個(gè)異步線程,該方法將立即返回一個(gè)布爾值,指示發(fā)現(xiàn)是否已成功啟動(dòng)。

// 發(fā)現(xiàn)過(guò)程通常涉及大約12秒的查詢掃描,隨后是每個(gè)找到的設(shè)備的頁(yè)面掃描以檢索其藍(lán)牙名稱

if(mBluetoothAdapter!=null && mBluetoothAdapter.isEnabled() && !mBluetoothAdapter.isDiscovering()){

if (mBluetoothAdapter.startDiscovery()) {

LogUtil.i("=======已成功啟動(dòng)尋找新設(shè)備的異步線程=======");

} else {

LogUtil.i("=======啟動(dòng)尋找新設(shè)備的異步線程失敗=======");

}

}

}

然后便是進(jìn)行藍(lán)牙耳機(jī)的配對(duì),連接。

以上基本的藍(lán)牙方法,我已經(jīng)封裝到BluetoothManager類中。

在藍(lán)牙耳機(jī)的搜索,配對(duì),連接等過(guò)程中,我們需要新建一個(gè)廣播,對(duì)各個(gè)過(guò)程做一個(gè)監(jiān)聽(tīng)。

二. 新建廣播BluetoothReceiver,用于監(jiān)聽(tīng)處理藍(lán)牙連接過(guò)程中各狀態(tài)

下面給出BluetoothReceiver中主要代碼:

@Override

public void onReceive(Context context, Intent intent){

LogUtil.i("=========藍(lán)牙接收處理廣播========"+intent.getAction());

BluetoothDevice device;

switch (intent.getAction()) {

case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:

switch (intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1)) {

case BluetoothA2dp.STATE_CONNECTING:

device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

LogUtil.i("device: " + device.getName() +" connecting");

break;

case BluetoothA2dp.STATE_CONNECTED:

device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

LogUtil.i("device: " + device.getName() +" connected");

mOnBluetoothListener.deviceConnected(device);

break;

case BluetoothA2dp.STATE_DISCONNECTING:

device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

LogUtil.i("device: " + device.getName() +" disconnecting");

break;

case BluetoothA2dp.STATE_DISCONNECTED:

device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

LogUtil.i("device: " + device.getName() +" disconnected");

break;

default:

break;

}

break;

case BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED:

int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1);

switch (state) {

case BluetoothA2dp.STATE_PLAYING:

LogUtil.i("state: playing.");

break;

case BluetoothA2dp.STATE_NOT_PLAYING:

LogUtil.i("state: not playing");

break;

default:

LogUtil.i("state: unkown");

break;

}

break;

case BluetoothDevice.ACTION_FOUND:

device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

int deviceClassType = device.getBluetoothClass().getDeviceClass();

//找到指定的藍(lán)牙設(shè)備

if (deviceClassType == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET

|| deviceClassType == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) {

LogUtil.i("Found device:" + device.getName()+" address:"+device.getAddress());

if(StringUtil.isNotEmpty(device.getName())){

//添加到設(shè)備列表

mOnBluetoothListener.deviceFound(device);

}

}else{//找到可用藍(lán)牙

if(StringUtil.isNotEmpty(device.getName())){

LogUtil.i("=====Found device====11===" + device.getName()+" address:"+device.getAddress());

//添加到設(shè)備列表

mOnBluetoothListener.deviceFound(device);

}

}

break;

case BluetoothDevice.ACTION_BOND_STATE_CHANGED:

int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);

device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

switch (bondState){

case BluetoothDevice.BOND_BONDED: //配對(duì)成功

LogUtil.i("Device:"+device.getName()+" bonded.");

//取消搜索,連接藍(lán)牙設(shè)備

mOnBluetoothListener.deviceBonded(device);

break;

case BluetoothDevice.BOND_BONDING:

LogUtil.i("Device:"+device.getName()+" bonding.");

break;

case BluetoothDevice.BOND_NONE:

LogUtil.i("Device:"+device.getName()+" not bonded.");

//不知道是藍(lán)牙耳機(jī)的關(guān)系還是什么原因,經(jīng)常配對(duì)不成功

//配對(duì)不成功的話,重新嘗試配對(duì)

mOnBluetoothListener.deviceBondNone(device);

break;

default:

break;

}

break;

case BluetoothAdapter.ACTION_STATE_CHANGED:

state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);

switch (state) {

case BluetoothAdapter.STATE_TURNING_ON:

LogUtil.i("BluetoothAdapter is turning on.");

break;

case BluetoothAdapter.STATE_ON:

LogUtil.i("BluetoothAdapter is on.");

// //藍(lán)牙已打開(kāi),開(kāi)始搜索并連接service

// findBluetoothDevice();

// getBluetoothA2DP();

mOnBluetoothListener.blootoothStateOn();

break;

case BluetoothAdapter.STATE_TURNING_OFF:

LogUtil.i("BluetoothAdapter is turning off.");

break;

case BluetoothAdapter.STATE_OFF:

LogUtil.i("BluetoothAdapter is off.");

break;

}

break;

default:

break;

}

}

三. 在MainActivity中調(diào)用

3.1 初始化時(shí)注冊(cè)廣播,掃描設(shè)備列表

//注冊(cè)廣播

registerReceiver();

//初始化設(shè)備列表

initDeviceList();

//發(fā)現(xiàn)新設(shè)備

findDevices();

其中registerReceiver方法為:

/**注冊(cè)廣播**/

private void registerReceiver(){

mBluetoothReceiver=new BluetoothReceiver();

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);

filter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED);

filter.addAction(BluetoothDevice.ACTION_FOUND);

filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);

filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);

mContext.registerReceiver(mBluetoothReceiver, filter);

}

findDevices方法為:

/**發(fā)現(xiàn)新設(shè)備**/

private void findDevices(){

if(BluetoothManager.getInstance().isSupportBluetooth()&&BluetoothManager.getInstance().isBluetoothOpen()){

//強(qiáng)制打開(kāi)藍(lán)牙

BluetoothManager.getInstance().openBluetooth();

Listlist=BluetoothManager.getInstance().checkDevices();

LogUtil.i("====list=====list=="+list.size());

Iterator it = list.iterator();

while (it.hasNext()) {

BluetoothDevice device = it.next();

if (device != null&& StringUtil.isEmpty(device.getName())) {

it.remove();

}

}

mDevices.addAll(list);

myAdapter.notifyDataSetChanged();

}

}

3.2 點(diǎn)擊設(shè)備列表去連接藍(lán)牙耳機(jī)或者開(kāi)啟藍(lán)牙掃描

myAdapter.setOnRecyclerItemClickListener(new MyAdapter.OnRecyclerItemClickListener() {

@Override

public void onRecyclerClick(View view, int position) {

BluetoothDevice device= mDevices.get(position);

if(!BluetoothManager.getInstance().isSupportBluetooth()){

ToastUtil.showShortToast(mContext,"本設(shè)備不支持藍(lán)牙");

return;

}

if(!BluetoothManager.getInstance().isBluetoothOpen()){

//去啟動(dòng)藍(lán)牙

BluetoothManager.getInstance().requestStartBluetooth(REQUEST_ENABLE_BT,mContext);

}else{

LogUtil.i("====開(kāi)始配對(duì)=======");

//綁定BluetoothA2DP,獲得service

BluetoothManager.getInstance().getBluetoothA2DP(mContext);

//開(kāi)始配對(duì)

BluetoothManager.getInstance().createBond(device);

}

}

});

3.3 關(guān)閉資源

退出app的時(shí)候需要關(guān)閉藍(lán)牙耳機(jī)連接

//注銷藍(lán)牙鏈接

BluetoothManager.getInstance().disableAdapter();

注銷廣播

//注銷廣播

if(mBluetoothReceiver!=null){

mContext.unregisterReceiver(mBluetoothReceiver);

}

當(dāng)然,你還可以考慮是否需要關(guān)閉藍(lán)牙

//關(guān)閉藍(lán)牙

BluetoothManager.getInstance().closeBluetooth();

四. 注意的點(diǎn)

藍(lán)牙耳機(jī)的連接需要藍(lán)牙權(quán)限,所以你得在你的mainfast.xml中以下權(quán)限設(shè)置:

五. 效果圖

5.gif

ok,今天的內(nèi)容就講到這里,謝謝。

總結(jié)

以上是生活随笔為你收集整理的android 蓝牙耳机 判断,Android实现蓝牙耳机连接的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。