藍牙連接打印機

https://blog.csdn.net/qinjuning/article/details/7726093
一灰羽、 BluetoothAdapter類介紹
1、BluetoothAdapter STATE 狀態(tài)值 炭臭, 即開關(guān)狀態(tài)
int STATE_OFF 藍牙已經(jīng)關(guān)閉
int STATE_ON 藍牙已經(jīng)打開
int STATE_TURNING_OFF 藍牙處于關(guān)閉過程中 ,關(guān)閉ing
int STATE_TURNING_ON 藍牙處于打開過程中 褐耳,打開ing

2骑脱、BluetoothAdapter SCAN_MOD狀態(tài)值 ,即掃描狀態(tài)
可以掃描其他設(shè)備的称鳞,當然它同時能被其他藍牙設(shè)備掃碼涮较。
int SCAN_MODE_CONNECTABLE 表明該藍牙可以掃描其他藍牙設(shè)備
int SCAN_MODE_CONNECTABLE_DISCOVERABLE
表明該藍牙設(shè)備同時可以掃碼其他藍牙設(shè)備,并且可以被其他藍牙設(shè)備掃描到冈止。
int SCAN_MODE_NONE : 該藍牙不能掃描以及被掃描狂票。

3、獲得藍牙適配器實例
public static synchronized BluetoothAdapter getDefaultAdapter ()
功能:獲得本設(shè)備的藍牙適配器實例靶瘸。
返回值:如果設(shè)備具備藍牙功能苫亦,返回BluetoothAdapter 實例毛肋;否則怨咪,返回null對象。

4润匙、打開/關(guān)閉藍牙的兩種方法:
4.1诗眨、打開藍牙:
①、直接調(diào)用函數(shù)enable()去打開藍牙設(shè)備 孕讳;
②匠楚、系統(tǒng)API去打開藍牙設(shè)備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設(shè)備厂财。
注意:如果藍牙已經(jīng)開啟芋簿,不會彈出該Activity界面。
PS:在目前Android手機中璃饱,是不支持在飛行模式下開啟藍牙的与斤。如果藍牙已經(jīng)開啟,那么藍牙的開關(guān)狀態(tài)會隨著飛行模式的狀態(tài)而發(fā)生改變。
4.2撩穿、關(guān)閉藍牙
直接調(diào)用API 函數(shù)即disable()即可磷支。
public boolean disable ()
功能:關(guān)閉藍牙設(shè)備。
返回值:該函數(shù)會立即返回食寡。
true 表示關(guān)閉操作成功
false 表示藍牙操作失敗 雾狈, ①、當前藍牙已經(jīng)關(guān)閉 抵皱; ②善榛、其他一些異常情況

5、掃描藍牙設(shè)備
public boolean startDiscovery ()
功能: 掃描藍牙設(shè)備
注意: 如果藍牙沒有開啟呻畸,該方法會返回false 锭弊,即不會開始掃描過程。
public boolean cancelDiscovery ()
功能: 取消掃描過程擂错。
注意: 如果藍牙沒有開啟味滞,該方法會返回false。
public boolean isDiscovering ()
功能: 是否正在處于掃描過程中钮呀。
注意: 如果藍牙沒有開啟剑鞍,該方法會返回false。

6爽醋、 獲取藍牙相關(guān)信息
public String getName ()
功能:獲取藍牙設(shè)備Name
public String getAddress ()
功能:獲取藍牙設(shè)備的硬件地址(MAC地址)蚁署,例如:00:11:22:AA:BB:CC
public boolean setName (String name)
功能:設(shè)置藍牙設(shè)備的Name
public Set<BluetoothDevice> getBondedDevices ()
功能:獲取與本機藍牙所有綁定的遠程藍牙信息,以BluetoothDevice類實例返回蚂四。
注意:如果藍牙未開啟光戈,該函數(shù)會返回一個空集合。
public static boolean checkBluetoothAddress (String address)
功能: 驗證藍牙設(shè)備MAC地址是否有效遂赠。所有設(shè)備地址的英文字母必須大寫久妆,48位,形如:00:43:A8:23:10:F1 跷睦。
返回值: true 設(shè)備地址有效
false 設(shè)備地址無效
public BluetoothDevice getRemoteDevice (String address)
功能:以給定的MAC地址去創(chuàng)建一個 BluetoothDevice 類實例(代表遠程藍牙實例)筷弦。即使該藍牙地址不可見,也會產(chǎn)生
一個BluetoothDevice 類實例抑诸。
返回:BluetoothDevice 類實例 烂琴。注意,如果該藍牙設(shè)備MAC地址不能被識別蜕乡,其藍牙Name為null奸绷。
異常:如果MAC address無效,拋出IllegalArgumentException层玲。

7号醉、藍牙相關(guān)廣播
Action值 說明
ACTION_STATE_CHANGED 藍牙狀態(tài)值發(fā)生改變
ACTION_SCAN_MODE_CHANGED 藍牙掃描狀態(tài)(SCAN_MODE)發(fā)生改變
ACTION_DISCOVERY_STARTED 藍牙掃描過程開始
ACTION_DISCOVERY_FINISHED 藍牙掃描過程結(jié)束
ACTION_LOCAL_NAME_CHANGED 藍牙設(shè)備Name發(fā)生改變
ACTION_REQUEST_DISCOVERABLE 請求用戶選擇是否使該藍牙能被掃描
PS:如果藍牙沒有開啟绒瘦,用戶點擊確定后,會首先開啟藍牙扣癣,繼而設(shè)置藍牙能被掃描惰帽。
ACTION_REQUEST_ENABLE 請求用戶選擇是否打開藍牙
ACTION_FOUND (該常量字段位于BluetoothDevice類中,稍后講到)
說明:藍牙掃描時父虑,掃描到任一遠程藍牙設(shè)備時该酗,會發(fā)送此廣播。

最后士嚎,在使用這兩個類時呜魄,需要以下兩個權(quán)限:
BLUETOOTH 值為 "android.permission.BLUETOOTH"
BLUETOOTH_ADMIN 值為 "android.permission.BLUETOOTH_ADMIN"
藍牙連接打印機

    myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 獲取本地藍牙適配器
    if (myBluetoothAdapter != null && myBluetoothAdapter.isEnabled()) {//判斷藍牙可用且已開啟
        address = preferences.getString("printAddress", ""); // 查看配置文件中是否保存有藍牙地址
        if (!isEmpty(address)) {
            Set<BluetoothDevice> devices = myBluetoothAdapter.getBondedDevices(); // 獲取所有已經(jīng)配置的設(shè)置列表
            if (devices.size() == 0) { 
                return;
            }
            for(BluetoothDevice device : devices) {
                String address1 = device.getAddress();
                //遍歷已配對列表,上次連接的設(shè)備已配對時自動配對
                if (address.equals(address1)) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            connectionBluetooth(address); // 通過連接藍牙地址連接藍牙打印機
                        }
                    }).start();
                }
            }
        }
    }       
/**
 * 通過連接藍牙地址連接藍牙打印機
 */
private void connectionBluetooth(String addr) {
    BluetoothDevice device = myBluetoothAdapter.getRemoteDevice(addr);
    connectionBluetooth(device);
}
/**
 * 通過藍牙設(shè)置數(shù)據(jù)連接藍牙打印機
 */
private void connectionBluetooth(BluetoothDevice device) {
        connectionDevice = device;
        connectedDeviceName = device.getName();
        initKeZhi(address);
}

/**
 * 柯芝打印機連接方式
 */
private boolean initKeZhi(String adress){
        int arg = OperateInterface.STATE_NONE;
        if (adress == "" || adress == null) {
            showBlueStat(getResources().getString(R.string.notSelectPrinter));
            return false;
        }
        BluetoothDevice myDevice;
        if (myBluetoothAdapter == null) {
            showBlueStat(getResources().getString(R.string.readingBluetoothError));
            return false;
        }
        myDevice = myBluetoothAdapter.getRemoteDevice(adress);
        if (myDevice == null) {
            showBlueStat(getResources().getString(R.string.readingBluetoothError));
            return false;
        }
        arg = OperateInterface.STATE_CONNECTING;
        myHandler.obtainMessage(OperateInterface.MESSAGE_STATE_CHANGE, arg, 0).sendToTarget();
        if(zpSDK.connect(adress))
        {
            blueConnectResult = true;
            arg = OperateInterface.STATE_CONNECTED;
        }else {
            blueConnectResult = false;
            showBlueStat(getResources().getString(R.string.connectError));
            arg = OperateInterface.STATE_NONE;
            myHandler.obtainMessage(OperateInterface.MESSAGE_STATE_CHANGE, arg, 0).sendToTarget();
            return false;
        }
        myHandler.obtainMessage(OperateInterface.MESSAGE_STATE_CHANGE, arg, 0).sendToTarget();
        return true;
}莱衩、

點擊未配對時彈出選擇框
選擇配對時跳轉(zhuǎn)到系統(tǒng)藍牙配對界面
startActivity(new Intent(Settings.ACTION_BLUETOOTH_SETTINGS));
選擇連接時

/**
 * 彈出已配對連接列表,選擇藍牙進行連接
 */
private void selectBluetooth() {
    Set<BluetoothDevice> devices = myBluetoothAdapter.getBondedDevices(); // 獲取所有已經(jīng)配置的設(shè)置列表
    if (devices.size() == 0) { // 判斷已經(jīng)配對列表,如果為0則提示
        Toast.makeText(this, R.string.noPairedDevices, Toast.LENGTH_LONG).show(); // 沒有已經(jīng)配對的設(shè)備
        openOptionsMenu();
        return;
    }
    final Dialog dialog = new Dialog(this); // 實例一個對話框
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // 設(shè)置對話框無標題
    View view = LayoutInflater.from(this).inflate(R.layout.bluetooth_device_list, null); // 創(chuàng)建藍牙列表布局界面
    ListView listView = (ListView) view.findViewById(R.id.bluetoothDeviceList); // 獲取ListView
    List<BluetoothDevice> data = new ArrayList<BluetoothDevice>(); // 將已經(jīng)配對的set集合轉(zhuǎn)換成List集合
    data.addAll(devices);
    BluetoothDeviceAdapter adapter = new BluetoothDeviceAdapter(this, data, R.layout.bluetooth_device_item);
    listView.setAdapter(adapter); // 將適配器應(yīng)用到ListView
    listView.setOnItemClickListener(new OnItemClickListener() { // 注冊列表條目點擊事件
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            BluetoothDevice device = (BluetoothDevice) parent.getItemAtPosition(position);
            address = device.getAddress();
            connectedDeviceName = device.getName();
            connectionBluetooth(device);
            dialog.dismiss();
        }
    });
    dialog.setContentView(view); // 將列表應(yīng)用到彈出框中
    Window dialogWindow = dialog.getWindow(); // 獲取當前屏幕(以下為設(shè)置彈出框的屬性)
    WindowManager.LayoutParams lp = dialogWindow.getAttributes(); // 獲取對話框的屬性
    WindowManager windowManager = getWindowManager(); // 獲取窗口管理器
    Display display = windowManager.getDefaultDisplay(); // 獲取窗口默認顯示的對象
    lp.width = (int) (display.getWidth() * 0.95); // 設(shè)置對話框的屬性,寬度為當前默認屏幕的寬度的0.9
    dialogWindow.setGravity(Gravity.CENTER); // 設(shè)置對話框在屏幕的水平居中
    dialog.show(); // 顯示彈出框
}

最后在onDestroy()中斷開連接zpSDK.disconnect();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爵嗅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笨蚁,更是在濱河造成了極大的恐慌睹晒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括细,死亡現(xiàn)場離奇詭異伪很,居然都是意外死亡,警方通過查閱死者的電腦和手機奋单,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門锉试,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人览濒,你說我怎么就攤上這事呆盖。” “怎么了贷笛?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵应又,是天一觀的道長。 經(jīng)常有香客問我昨忆,道長丁频,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任邑贴,我火速辦了婚禮,結(jié)果婚禮上叔磷,老公的妹妹穿的比我還像新娘拢驾。我一直安慰自己,他們只是感情好改基,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布繁疤。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稠腊。 梳的紋絲不亂的頭發(fā)上躁染,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音架忌,去河邊找鬼吞彤。 笑死,一個胖子當著我的面吹牛叹放,可吹牛的內(nèi)容都是我干的饰恕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼井仰,長吁一口氣:“原來是場噩夢啊……” “哼埋嵌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起俱恶,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤雹嗦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后合是,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俐银,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年端仰,在試婚紗的時候發(fā)現(xiàn)自己被綠了捶惜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡荔烧,死狀恐怖吱七,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹤竭,我是刑警寧澤踊餐,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站臀稚,受9級特大地震影響吝岭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吧寺,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一窜管、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稚机,春花似錦幕帆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呻逆。三九已至峭判,卻和暖如春谓苟,著一層夾襖步出監(jiān)牢的瞬間彬祖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工纽竣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留墓贿,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓退个,卻偏偏與公主長得像募壕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子语盈,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345