藍牙鏈接打印

藍牙鏈接:

Android做藍牙開發(fā)最大的也是唯一的一個坑就是你要分清楚傳統(tǒng)藍牙低功耗藍牙(Bluetooth Low Energy),他們的API不一樣,也不通用。

區(qū)別他們也很容易:低功耗藍牙顧名思義,用于功耗低的設(shè)備,比如各種智能手環(huán)、心率儀。你可以直接查閱官方文檔,我認為官方文檔是最好的資料,里面有很詳細的例子,傳統(tǒng)藍牙有中文翻譯,低功耗藍牙則沒有


android中藍牙的打開、搜索主要分為以下幾步。

1.在AndroidManifest.xml中添加藍牙權(quán)限。

<!-- 管理藍牙設(shè)備的權(quán)限 -->

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

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

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

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

<!-- 在sd卡中創(chuàng)建與刪除文件權(quán)限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"

? ? tools:ignore="ProtectedPermissions"/>

<!-- 向SD卡寫入數(shù)據(jù)權(quán)限 -->

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

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

<uses-permission android:name="android.permission.CLEAR_APP_CACHE"

? ? tools:ignore="ProtectedPermissions" />

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

2.啟動藍牙

private?boolean?openBtDevice()?{?

//?獲得藍牙匹配器?

mBluetoothAdapter?=?BluetoothAdapter.getDefaultAdapter();?

//?藍牙設(shè)備不被支持?

if?(mBluetoothAdapter?==?null)?{?

Log.e(TAG,?"Your?device?is?not?support?Bluetooth!");?

Toast.makeText(this,?"該設(shè)備沒有藍牙設(shè)備",?Toast.LENGTH_LONG).show();?

return?false;?

}?

//?使能藍牙設(shè)備?

if?(!mBluetoothAdapter.isEnabled())?{?

//?隱式Intent?

Intent?enableBtIntent?=?new?Intent(?

BluetoothAdapter.ACTION_REQUEST_ENABLE);?

startActivityForResult(enableBtIntent,?REQUES_BT_ENABLE_CODE);?

}?else?{?

Toast.makeText(this,?"藍牙打開成功!",?Toast.LENGTH_SHORT).show();?

}?

return?true;?

}?

//?當startActivityForResult啟動的?畫面結(jié)束的時候,該方法被回調(diào)?

@Override?

protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{?

if?(requestCode?==?REQUES_BT_ENABLE_CODE?&&?resultCode?==?RESULT_OK)?{?

Toast.makeText(this,?"藍牙打開成功!",?Toast.LENGTH_SHORT).show();?

}?

}

3.搜索藍牙

已經(jīng)配對過的藍牙設(shè)備

private?void?findBtDevice()?{?

Set?pairedDevices?=?mBluetoothAdapter.getBondedDevices();?

if?(pairedDevices.size()?>?0)?{?

for?(BluetoothDevice?device?:?pairedDevices)?{?

if?(mDeviceList.contains(device))?{?

return;?

}?

mArrayAdapter.add(device.getName()?+?"\n"?+?device.getAddress());?

mDeviceList.add(device);?

}?

}?

adapter.notifyDataSetChanged();?

}

動態(tài)注冊廣播搜索藍牙

IntentFilter?filter?=?new?IntentFilter(BluetoothDevice.ACTION_FOUND);?

filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);?

registerReceiver(mReceiver,?filter);?

//廣播用于動態(tài)的添加搜索到的藍牙到ListView中顯示?

private?final?BroadcastReceiver?mReceiver?=?new?BroadcastReceiver()?{?

@Override?

public?void?onReceive(Context?context,?Intent?intent)?{?

//?TODO?Auto-generated?method?stub?

String?action?=?intent.getAction();?

if?(BluetoothDevice.ACTION_FOUND.equals(action))?{?

//發(fā)現(xiàn)的藍牙設(shè)備?

BluetoothDevice?device?=?intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

//發(fā)現(xiàn)的藍牙設(shè)備已存在則跳過?

if?(mDeviceList.contains(device))?{?

return;?

}?

//添加發(fā)現(xiàn)的藍牙設(shè)備?

mArrayAdapter.add(device.getName()?+?"\n"?+?device.getAddress());?

mDeviceList.add(device);?

//更新到ListView?

adapter.notifyDataSetChanged();?

}?else?if?(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))?{?

//搜索結(jié)束,關(guān)閉滾動條?

setProgressBarIndeterminateVisibility(false);?

}?

}?

};

//下面是一個簡單的藍牙搜索顯示藍牙示例//

首先新建工程、接著在在AndroidManifest.xml中添加藍牙權(quán)限。

編寫布局文件

android:layout_width="match_parent"?

android:layout_height="match_parent"?

android:orientation="vertical"?>?


android:id="@+id/XianShi"?

android:layout_width="match_parent"?

android:layout_height="wrap_content"?

android:gravity="center"?

android:text="無內(nèi)容"?/>?

android:layout_width="match_parent"?

android:layout_height="wrap_content"?

android:orientation="horizontal"?>?

android:id="@+id/SendText"?

android:layout_width="wrap_content"?

android:layout_height="wrap_content"?

android:layout_weight="1.0"?

android:hint="請輸入"?/>?

android:layout_width="wrap_content"?

android:layout_height="wrap_content"?

android:onClick="MySend"?

android:text="發(fā)送"?/>?


android:id="@+id/FindBt"?

android:layout_width="match_parent"?

android:layout_height="wrap_content"?

android:text="搜索"?/>?

android:layout_width="match_parent"?

android:layout_height="wrap_content"?

android:gravity="center"?

android:text="藍牙列表"?/>?

android:id="@+id/DeviceList"?

android:layout_width="match_parent"?

android:layout_height="wrap_content"?>?


/編寫源代碼//

public?class?MainActivity?extends?Activity?{?

private?EditText?mET;???//發(fā)送內(nèi)容,本示例未用到?

private?Button?MyScan;??//搜索按鈕?

private?TextView?MyMessage;??//顯示內(nèi)容,本示例未用到?

private?ListView?MyBtList;???//顯示藍牙列表的ListView?

private?BluetoothAdapter?mBluetoothAdapter;??//藍牙適配器?


private?ArrayAdapter?adapter;????????//Listview使用的適配器?

private?ArrayList?mArrayAdapter?=?new?ArrayList();??//保存ListView顯示藍牙設(shè)備的內(nèi)容?

private?ArrayList?mDeviceList?=?new?ArrayList();??//保存查找的藍牙設(shè)備,避免在ListView重復(fù)顯示?

private?static?final?String?TAG?=?"MyBluetooth";???//調(diào)試用?

private?static?final?int?REQUES_BT_ENABLE_CODE?=?0x1002;???//?藍牙使能請求碼?

@Override?

protected?void?onCreate(Bundle?savedInstanceState)?{?

super.onCreate(savedInstanceState);?

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);???//請求顯示滾動條?

setContentView(R.layout.activity_main);?

//UI注冊?

mET?=?(EditText)?findViewById(R.id.SendText);?

MyScan?=?(Button)?findViewById(R.id.FindBt);?

MyMessage?=?(TextView)?findViewById(R.id.XianShi);?

MyBtList?=?(ListView)?findViewById(R.id.DeviceList);?

//ListView添加適配器?

adapter?=?new?ArrayAdapter(this,?

android.R.layout.simple_list_item_1,?mArrayAdapter);?

MyBtList.setAdapter(adapter);?

openBtDevice();???//打開藍牙?

//搜索藍牙按鈕點擊事件?

MyScan.setOnClickListener(new?MyScanClick());?


IntentFilter?filter?=?new?IntentFilter(BluetoothDevice.ACTION_FOUND);?

filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);?

//?動態(tài)注冊廣播接收器?

//?用來接收掃描到的設(shè)備信息?

registerReceiver(mReceiver,?filter);?

}?

//搜索藍牙按鈕點擊事件?

private?class?MyScanClick?implements?OnClickListener?{?

@Override?

public?void?onClick(View?v)?{?

//?TODO?Auto-generated?method?stub?

if?(!mBluetoothAdapter.isDiscovering())?{?

findBtDevice();??//打開藍牙?

mBluetoothAdapter.startDiscovery();??//開始搜索?

setProgressBarIndeterminateVisibility(true);??//顯示滾動條?

}?

}?

}?

//廣播用于動態(tài)的添加搜索到的藍牙到ListView中顯示?

private?final?BroadcastReceiver?mReceiver?=?new?BroadcastReceiver()?{?

@Override?

public?void?onReceive(Context?context,?Intent?intent)?{?

//?TODO?Auto-generated?method?stub?

String?action?=?intent.getAction();?

if?(BluetoothDevice.ACTION_FOUND.equals(action))?{?

//發(fā)現(xiàn)的藍牙設(shè)備?

BluetoothDevice?device?=?intent?

.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);?

//發(fā)現(xiàn)的藍牙設(shè)備已存在則跳過?

if?(mDeviceList.contains(device))?{?

return;?

}?

//添加發(fā)現(xiàn)的藍牙設(shè)備?

mArrayAdapter?

.add(device.getName()?+?"\n"?+?device.getAddress());?

mDeviceList.add(device);?

//更新到ListView?

adapter.notifyDataSetChanged();?

}?else?if?(BluetoothAdapter.ACTION_DISCOVERY_FINISHED?

.equals(action))?{?

//搜索結(jié)束,關(guān)閉滾動條?

setProgressBarIndeterminateVisibility(false);?

}?

}?

};?

//之前已經(jīng)配對的藍牙,添加到ListView?

private?void?findBtDevice()?{?

Set?pairedDevices?=?mBluetoothAdapter?

.getBondedDevices();?

if?(pairedDevices.size()?>?0)?{?

for?(BluetoothDevice?device?:?pairedDevices)?{?

if?(mDeviceList.contains(device))?{?

return;?

}?

mArrayAdapter?

.add(device.getName()?+?"\n"?+?device.getAddress());?

mDeviceList.add(device);?

}?

}?

adapter.notifyDataSetChanged();?

}?

//打開藍牙?

private?boolean?openBtDevice()?{?

//?獲得藍牙匹配器?

mBluetoothAdapter?=?BluetoothAdapter.getDefaultAdapter();?

//?藍牙設(shè)備不被支持?

if?(mBluetoothAdapter?==?null)?{?

Log.e(TAG,?"Your?device?is?not?support?Bluetooth!");?

Toast.makeText(this,?"該設(shè)備沒有藍牙設(shè)備",?Toast.LENGTH_LONG).show();?

return?false;?

}?

//?使能藍牙設(shè)備?

if?(!mBluetoothAdapter.isEnabled())?{?

//?隱式Intent?

Intent?enableBtIntent?=?new?Intent(?

BluetoothAdapter.ACTION_REQUEST_ENABLE);?

startActivityForResult(enableBtIntent,?REQUES_BT_ENABLE_CODE);?

}?else?{?

Toast.makeText(this,?"藍牙打開成功!",?Toast.LENGTH_SHORT).show();?

}?

return?true;?

}?

//?當startActivityForResult啟動的?畫面結(jié)束的時候,該方法被回調(diào)?

@Override?

protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{?

if?(requestCode?==?REQUES_BT_ENABLE_CODE?&&?resultCode?==?RESULT_OK)?{?

Toast.makeText(this,?"藍牙打開成功!",?Toast.LENGTH_SHORT).show();?

}?

}?

}?

藍牙打印

鏈接打印機后,執(zhí)行以下代碼:打印文字,格式類似于外賣單:

public class PrintTextActivityextends Activity {

List>listData =new ArrayList>();

private EditTextet_input;

private CheckBoxcheckBoxAuto;

private Buttonbt_print;

private Threadautoprint_Thread;

int times =500;// Automatic print time interval

? boolean isPrint =true;

Stringmessage="";

@Override

? protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

? ? ? super.onCreate(savedInstanceState);

setContentView(R.layout.activity_print_text);

isPrint =true;

et_input = (EditText) findViewById(R.id.et_input_1);

//et_input.setText("Printing test\n");

? ? ? bt_print = (Button) findViewById(R.id.bt_print);

bt_print.setOnClickListener(new OnClickListener() {

@Override

? ? ? ? public void onClick(View v) {

message=et_input.getText().toString().trim();

try {

byte[] send=message.getBytes("GBK");

PrintService.pl.write(send);

}catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

PrintService.pl.printText("\n");

PrintService.pl.write(new byte[]{0x1b,0x61,0x01});

//PrintService.pl.write(new byte[] { 0x1d, 0x0c });

? ? ? ? ? ? PrintService.pl.write(new byte[] {0x1b,0x21,0x11 });

PrintService.pl.printText("xxx");

//修改文字模式為加粗模式

? ? ? ? ? ? PrintService.pl.write(new byte[]{0X1b,0x45,0x01});

PrintService.pl.write(new byte[]{0x1d,0x21,0x03});

PrintService.pl.printText("\n");

//修改文字加粗模式為0

? ? ? ? ? ? PrintService.pl.write(new byte[]{0x1b,0x21,0x00});

//文字居中

? ? ? ? ? ? PrintService.pl.write(new byte[]{0x1b,0x61,0x01});

PrintService.pl.printText("已支付");

PrintService.pl.printText("\n");

PrintService.pl.printText("下單時間:10—24"+"\t"+"11:15");

PrintService.pl.printText("\n");

PrintService.pl.printText("貨號"+"\t"+"\t"+"\t"+"\t"+"\t"+"數(shù)量"+"\t"+"價格");

PrintService.pl.printText("-----------------------------");

PrintService.pl.printText("\n");

PrintService.pl.printText("GP-3120TU"+"\t"+"\t"+"\t"+"\t"+"X1"+"\t"+"\t"+"286");

PrintService.pl.printText("\n");

PrintService.pl.printText("GP-1124D"+"\t"+"\t"+"\t"+"\t"+"X2"+"\t"+"\t"+"560");

PrintService.pl.printText("\n");

PrintService.pl.printText("GP-1124T"+"\t"+"\t"+"\t"+"\t"+"X1"+"\t"+"\t"+"698");

PrintService.pl.printText("\n");

PrintService.pl.printText("-----------------------------");

PrintService.pl.printText("\n");

PrintService.pl.printText("實收" +"\t" +"\t" +"\t" +"\t" +"¥" +"\t" +"1603");

PrintService.pl.printText("\n");

PrintService.pl.printText("找零" +"\t" +"\t" +"\t" +"\t" +"¥" +"\t" +"2");

PrintService.pl.printText("\n");

PrintService.pl.printText("-----------------------------");

PrintService.pl.printText("\n");

PrintService.pl.write(new byte[]{0x1b,0x61,0x01});

PrintService.pl.printText("請保管好購物憑證");

PrintService.pl.printText("\n");

PrintService.pl.write(new byte[]{0x1b,0x61,0x01});

PrintService.pl.printText("多謝惠顧");

}

});

checkBoxAuto = (CheckBox) findViewById(R.id.checkBoxAuto);

// Auto Print

? ? ? autoprint_Thread =new Thread() {

public void run() {

while (isPrint) {

if (checkBoxAuto.isChecked()) {

String message =et_input.getText().toString();

PrintService.pl.printText(message);

PrintService.pl.write(new byte[] {0x1d,0x0c });

try {

Thread.sleep(times);

}catch (InterruptedException e) {

// TODO Auto-generated catch block

? ? ? ? ? ? ? ? ? ? e.printStackTrace();

}

}

}

}

};

autoprint_Thread.start();

//? ? et_input.addTextChangedListener(textWatcher);

? }

@Override

? public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

Resources res = getResources();

String[] cmdStr = res.getStringArray(R.array.cmd);

for (int i =0; i < cmdStr.length; i++) {

String[] cmdArray = cmdStr[i].split(",");

if (cmdArray.length ==2) {

Map map =new HashMap();

map.put("title", cmdArray[0]);

map.put("description", cmdArray[1]);

menu.add(0, i, i, cmdArray[0]);

listData.add(map);

}

}

return true;

}

@Override

? public boolean onOptionsItemSelected(android.view.MenuItem item) {

Map map =listData.get(item.getItemId());

String cmd = map.get("description").toString();

byte[] bt = PrintCmdActivity.hexStringToBytes(cmd);

PrintService.pl.write(bt);

Toast toast = Toast.makeText(this,"Send Success", Toast.LENGTH_SHORT);

toast.show();

return false;

}

@Override

? protected void onStop() {

// TODO Auto-generated method stub

? ? ? isPrint =false;

super.onStop();

}

private static Bitmap resizeImage(Bitmap bitmap,int w,int h) {

Bitmap BitmapOrg = bitmap;

int width = BitmapOrg.getWidth();

int height = BitmapOrg.getHeight();

if (width > w) {

float scaleWidth = ((float) w) / width;

float scaleHeight = ((float) h) / height +24;

Matrix matrix =new Matrix();

matrix.postScale(scaleWidth, scaleWidth);

Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg,0,0, width,

height, matrix,true);

return resizedBitmap;

}else {

Bitmap resizedBitmap = Bitmap.createBitmap(w, height +24,

Config.RGB_565);

Canvas canvas =new Canvas(resizedBitmap);

Paint paint =new Paint();

canvas.drawColor(Color.WHITE);

canvas.drawBitmap(bitmap, (w - width) /2,0, paint);

return resizedBitmap;

}

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容