Android Bluetooth-搜索藍牙

前言

Hello,現(xiàn)在的工作苫拍,必須要學(xué)習(xí)Bluetooth的一些使用,在這里記錄一下

一.藍牙權(quán)限

不管如何,開發(fā)藍牙,首先加上權(quán)限再說

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

二.藍牙API

1.BluetoothAdapter
本地藍牙適配器(如:自己的手機)

2.BlueDevice
遠程藍牙(如:一個藍牙音箱)

3.BluetoothSocket
藍牙socket的接口

4.BluetoothServerSocket
開放的服務(wù)器socket睦袖,它監(jiān)聽接受的請求(與TCP ServerSocket類似)


三.使用

1.BluetoothAdapter下的方法

//開始搜索
startDiscovery()
//取消搜索
cancelDiscovery()
//直接打開藍牙
enable()
//直接關(guān)閉藍牙
disable()
//彈窗申請權(quán)限打開藍牙
Intemtenabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enabler,reCode);
//獲得本地藍牙名字
getName()
//本地藍牙地址
getAddress()
//獲取本地藍牙適配器
getDefaultAdapter()
//根據(jù)藍牙地址獲取遠程藍牙設(shè)備
getRemoteDevice(String address)
//獲取本地藍牙適配器當(dāng)前狀態(tài)
getState()
//判斷當(dāng)前是否正在查找設(shè)備
isDiscovering()
//判斷藍牙是否打開
isEnabled()
//根據(jù)名稱珊肃,UUID創(chuàng)建并返回BluetoothServerSocket
listenUsingRfcommWithServiceRecord(String name,UUID uuid)


2.實際使用

// 獲取本地藍牙適配器
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//獲得本地藍牙name和mac地址
mBluetoothAdapter.getName();
mBluetoothAdapter.getAddress();
 // 判斷有沒有藍牙硬件支持
if (mBluetoothAdapter == null) {   
 Toast.makeText(this, "設(shè)備不支持藍牙", Toast.LENGTH_SHORT).show();    finish();
 }
 // 判斷是否打開了藍牙
        if (!mBluetoothAdapter.isEnabled()) {
            // 我們通過startActivityForResult()方法發(fā)起的Intent將會在onActivityResult()回調(diào)方法中獲取用戶的選擇,比如用戶單擊了Yes開啟,
            // 那么將會收到RESULT_OK的結(jié)果伦乔,
            // 如果RESULT_CANCELED則代表用戶不愿意開啟藍牙
            // 彈出對話框提示用戶是否打開
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(intent, 1);
            // 沒有提示強制打開藍牙(用enable()方法來開啟厉亏,無需詢問用戶(實惠無聲息的開啟藍牙設(shè)備),這時就需要用到android.permission.BLUETOOTH_ADMIN權(quán)限)
            // mBluetoothAdapter.enable();
// 獲取已經(jīng)配對的設(shè)備
    Set<BluetoothDevice>  myDevices = mBluetoothAdapter.getBondedDevices();
        // 判斷是否有配對過的設(shè)備
        if (myDevices.size() > 0) {
            for (BluetoothDevice device :  myDevices ) {
                // 遍歷到列表中
                tv_devices.append(device.getName() + ":" + device.getAddress());
                Log.i("已配對設(shè)備", tvDevices.getText().toString());
            }
        }

// 獲得連接中藍牙的name和mac地址
    BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);     
    String bltname= device.getName().toString();
    String bltmac= device.getAddress().toString();

xml代碼

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.zxnet.mybluetoothdome.MainActivity">

    <Button
        android:id="@+id/btn_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="搜索藍牙設(shè)備"
        android:background="#54FF9F"
        />

    <ListView
        android:id="@+id/mylistview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_search"
        android:textSize="18sp"
        />
</RelativeLayout>

MainActivity.class類

import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
    private static final String TAG = "MainActivity";
    // 本地藍牙適配器
    private BluetoothAdapter mBluetoothAdapter;
    // 搜索按鈕
    private Button btn_search;
    //搜索到藍牙顯示列表
    private ListView mylistview;
    // listview的adapter
    private ArrayAdapter<String> mylistAdapter;
    // 存儲搜索到的藍牙
    private List<String> bluetoothdeviceslist = new ArrayList<String>();

    private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkBluetoothPermission();
        initview();
        SearchBluetoot();

    }

    private void initview() {
        mylistview = (ListView) findViewById(R.id.mylistview);
        btn_search = (Button) findViewById(R.id.btn_search);

        // 獲取本地藍牙適配器
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                setTitle("正在搜索...");
                // 判斷是否在搜索,如果在搜索,就取消搜索
                if (mBluetoothAdapter.isDiscovering()) {
                    mBluetoothAdapter.cancelDiscovery();
                }
                // 開始搜索
                mBluetoothAdapter.startDiscovery();
            }
        });

    }

    public void SearchBluetoot() {
        // 判斷有沒有藍牙硬件支持
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "設(shè)備不支持藍牙", Toast.LENGTH_SHORT).show();
            finish();
        }

        // 判斷是否打開了藍牙
        if (!mBluetoothAdapter.isEnabled()) {
            // 我們通過startActivityForResult()方法發(fā)起的Intent將會在onActivityResult()回調(diào)方法中獲取用戶的選擇烈和,比如用戶單擊了Yes開啟爱只,
            // 那么將會收到RESULT_OK的結(jié)果,
            // 如果RESULT_CANCELED則代表用戶不愿意開啟藍牙
            // 彈出對話框提示用戶是否打開
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(intent, 1);
            // 沒有提示強制打開藍牙(用enable()方法來開啟招刹,無需詢問用戶(實惠無聲息的開啟藍牙設(shè)備),這時就需要用到android.permission.BLUETOOTH_ADMIN權(quán)限)
            // mBluetoothAdapter.enable();

            // 獲的已經(jīng)配對的設(shè)備
            Set<BluetoothDevice> myDevices = mBluetoothAdapter.getBondedDevices();
            /// 判斷是否有配對過的設(shè)備
            if (myDevices.size() > 0) {
                for (BluetoothDevice device : myDevices) {
                    // 遍歷到列表中
                    bluetoothdeviceslist.add(device.getName() + ":" + device.getAddress() + "\n");
                }
            }
// adapter
            mylistAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, android.R.id.text1, bluetoothdeviceslist);
            mylistview.setAdapter(mylistAdapter);

            // 找到設(shè)備的廣播
            IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
            // 注冊廣播
            registerReceiver(myreceiver, filter);
            // 搜索完成的廣播
            filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
            // 注冊廣播
            registerReceiver(myreceiver, filter);
        }
    }

    // 廣播接收器
    private final BroadcastReceiver myreceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 收到的廣播類型
            String action = intent.getAction();
            // 發(fā)現(xiàn)設(shè)備的廣播
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // 從intent中獲取設(shè)備
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // 判斷是否配對過
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                    // 添加到列表
                    bluetoothdeviceslist.add(device.getName() + ":"+ device.getAddress() + "\n");
                    mylistAdapter.notifyDataSetChanged();
                }
                // 搜索完成
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                setTitle("搜索完成恬试!");
            }
        }
    };

    /*
           校驗藍牙權(quán)限
          */
    private void checkBluetoothPermission() {
        if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.M) {
            // Android M Permission check
            if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},PERMISSION_REQUEST_COARSE_LOCATION);
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_COARSE_LOCATION:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                }
                break;
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    }
}


以上就是藍牙基礎(chǔ)的使用,也比較簡單,要開發(fā)藍牙,這些是必須了解的,要想了解更多,請仔細看官方的api開發(fā)文檔,如果對你有幫助,請點個贊吧!!

EDN

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔗喂,隨后出現(xiàn)的幾起案子忘渔,更是在濱河造成了極大的恐慌,老刑警劉巖缰儿,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畦粮,死亡現(xiàn)場離奇詭異,居然都是意外死亡乖阵,警方通過查閱死者的電腦和手機宣赔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞪浸,“玉大人儒将,你說我怎么就攤上這事《云眩” “怎么了钩蚊?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹈矮。 經(jīng)常有香客問我砰逻,道長,這世上最難降的妖魔是什么泛鸟? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任蝠咆,我火速辦了婚禮,結(jié)果婚禮上北滥,老公的妹妹穿的比我還像新娘刚操。我一直安慰自己,他們只是感情好再芋,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布菊霜。 她就那樣靜靜地躺著,像睡著了一般济赎。 火紅的嫁衣襯著肌膚如雪占卧。 梳的紋絲不亂的頭發(fā)上遗菠,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音华蜒,去河邊找鬼辙纬。 笑死,一個胖子當(dāng)著我的面吹牛叭喜,可吹牛的內(nèi)容都是我干的贺拣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼捂蕴,長吁一口氣:“原來是場噩夢啊……” “哼譬涡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啥辨,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤涡匀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溉知,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陨瘩,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年级乍,在試婚紗的時候發(fā)現(xiàn)自己被綠了舌劳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡玫荣,死狀恐怖甚淡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捅厂,我是刑警寧澤贯卦,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站焙贷,受9級特大地震影響导帝,放射性物質(zhì)發(fā)生泄漏既穆。R本人自食惡果不足惜岩灭,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一枢纠、第九天 我趴在偏房一處隱蔽的房頂上張望客燕。 院中可真熱鬧凤巨,春花似錦内边、人聲如沸票灰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诡渴,卻和暖如春捐晶,著一層夾襖步出監(jiān)牢的瞬間菲语,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工惑灵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留山上,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓英支,卻偏偏與公主長得像佩憾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子干花,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 藍牙 注:本文翻譯自https://developer.android.com/guide/topics/conn...
    RxCode閱讀 8,694評論 11 99
  • 公司的項目最近需要用到藍牙開發(fā)的相關(guān)內(nèi)容妄帘,因此特地查閱了Google官方文檔的內(nèi)容并進行二次整理,希望能對需要學(xué)習(xí)...
    Chuckiefan閱讀 32,475評論 44 123
  • 前言 在眾多的消費電子類產(chǎn)品中池凄,藍牙作為一種簡易的通訊方式抡驼,因此功耗小、體積小肿仑、成本低等優(yōu)勢致盟,被廣泛的應(yīng)用于耳機、...
    心若冰清_閱讀 2,469評論 0 10
  • 1.簡介 通過藍牙API柏副,可以實現(xiàn)以下內(nèi)容: 掃描其他藍牙設(shè)備 查詢配對藍牙設(shè)備的本地藍牙適配器 創(chuàng)建RFCOMM...
    justCode_閱讀 4,936評論 0 3
  • 躲過街道的車水馬龍勾邦,走進空無一人的老房子,我不用再想像見面寒暄該用什么樣的對白割择。我本懶慢疏狂愛自由眷篇,何需委屈求全裝...
    馨雪清菡閱讀 566評論 6 6