蓝牙链接打印

蓝牙链接:

Android做蓝牙开发最大的也是唯一的一个坑就是你要分清楚传统蓝牙低功耗蓝牙(Bluetooth Low Energy),他们的API不一样,也不通用。

区别他们也很容易:低功耗蓝牙顾名思义,用于功耗低的设备,比如各种智能手环、心率仪。你可以直接查阅官方文档,我认为官方文档是最好的资料,里面有很详细的例子,传统蓝牙有中文翻译,低功耗蓝牙则没有


android中蓝牙的打开、搜索主要分为以下几步。

1.在AndroidManifest.xml中添加蓝牙权限。

<!-- 管理蓝牙设备的权限 -->

<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卡中创建与删除文件权限 -->

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

? ? tools:ignore="ProtectedPermissions"/>

<!-- 向SD卡写入数据权限 -->

<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();?

//?蓝牙设备不被支持?

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

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

Toast.makeText(this,?"该设备没有蓝牙设备",?Toast.LENGTH_LONG).show();?

return?false;?

}?

//?使能蓝牙设备?

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启动的?画面结束的时候,该方法被回调?

@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.搜索蓝牙

已经配对过的蓝牙设备

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();?

}

动态注册广播搜索蓝牙

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

filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);?

registerReceiver(mReceiver,?filter);?

//广播用于动态的添加搜索到的蓝牙到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))?{?

//发现的蓝牙设备?

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

//发现的蓝牙设备已存在则跳过?

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

return;?

}?

//添加发现的蓝牙设备?

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

mDeviceList.add(device);?

//更新到ListView?

adapter.notifyDataSetChanged();?

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

//搜索结束,关闭滚动条?

setProgressBarIndeterminateVisibility(false);?

}?

}?

};

//下面是一个简单的蓝牙搜索显示蓝牙示例//

首先新建工程、接着在在AndroidManifest.xml中添加蓝牙权限。

编写布局文件

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="无内容"?/>?

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="发送"?/>?


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;???//发送内容,本示例未用到?

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

private?TextView?MyMessage;??//显示内容,本示例未用到?

private?ListView?MyBtList;???//显示蓝牙列表的ListView?

private?BluetoothAdapter?mBluetoothAdapter;??//蓝牙适配器?


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

private?ArrayList?mArrayAdapter?=?new?ArrayList();??//保存ListView显示蓝牙设备的内容?

private?ArrayList?mDeviceList?=?new?ArrayList();??//保存查找的蓝牙设备,避免在ListView重复显示?

private?static?final?String?TAG?=?"MyBluetooth";???//调试用?

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);?

//?动态注册广播接收器?

//?用来接收扫描到的设备信息?

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);??//显示滚动条?

}?

}?

}?

//广播用于动态的添加搜索到的蓝牙到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))?{?

//发现的蓝牙设备?

BluetoothDevice?device?=?intent?

.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);?

//发现的蓝牙设备已存在则跳过?

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

return;?

}?

//添加发现的蓝牙设备?

mArrayAdapter?

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

mDeviceList.add(device);?

//更新到ListView?

adapter.notifyDataSetChanged();?

}?else?if?(BluetoothAdapter.ACTION_DISCOVERY_FINISHED?

.equals(action))?{?

//搜索结束,关闭滚动条?

setProgressBarIndeterminateVisibility(false);?

}?

}?

};?

//之前已经配对的蓝牙,添加到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();?

//?蓝牙设备不被支持?

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

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

Toast.makeText(this,?"该设备没有蓝牙设备",?Toast.LENGTH_LONG).show();?

return?false;?

}?

//?使能蓝牙设备?

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启动的?画面结束的时候,该方法被回调?

@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();?

}?

}?

}?

蓝牙打印

链接打印机后,执行以下代码:打印文字,格式类似于外卖单:

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"+"数量"+"\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;

}

}

}

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352