android蓝牙打印机

时间:2023-03-08 16:54:08

reality_jie的专栏

编程的过程是一种微妙的享受

分类: android2013-09-22 14:22 958人阅读 评论(28) 收藏 举报

最近在做一个安卓应用,其中有一个需求是要求用蓝牙连接打印机实现打印功能。一开始没有一点头绪,网上找了很多资料也找不到有用的数据。所以自己就去研究,最终,功夫不负有心人,顺利的完成了这个功能。下边贴出我写的代码,共有需要的IT哥们参考学习。

完整源码下载

我们先看看运行效果图吧。。。

1.这是主界面的效果图

android蓝牙打印机

贴上布局文件的代码:bluetooth_layout.xml

  1. <span style="font-size:12px"><?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <Button
  6. android:id="@+id/openBluetooth_tb"
  7. android:layout_width="130dp"
  8. android:layout_height="wrap_content"
  9. android:layout_alignParentRight="true"
  10. android:layout_marginRight="18dp"
  11. android:layout_marginTop="5dp"
  12. android:text="打开蓝牙" />
  13. <Button
  14. android:id="@+id/searchDevices"
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:layout_alignParentLeft="true"
  18. android:layout_below="@+id/openBluetooth_tb"
  19. android:layout_marginTop="20dp"
  20. android:text="搜索设备" />
  21. <View
  22. android:layout_width="match_parent"
  23. android:layout_height="3dp"
  24. android:layout_alignParentLeft="true"
  25. android:layout_below="@+id/searchDevices"
  26. android:background="@android:color/darker_gray" />
  27. <LinearLayout
  28. android:id="@+id/linearLayout1"
  29. android:layout_width="match_parent"
  30. android:layout_height="150dp"
  31. android:layout_marginTop="125dp"
  32. android:orientation="vertical" >
  33. <TextView
  34. android:layout_width="match_parent"
  35. android:layout_height="wrap_content"
  36. android:text="未配对设备" />
  37. <ListView
  38. android:id="@+id/unbondDevices"
  39. android:layout_width="wrap_content"
  40. android:layout_height="wrap_content" />
  41. </LinearLayout>
  42. <View
  43. android:layout_width="match_parent"
  44. android:layout_height="3dp"
  45. android:layout_alignParentLeft="true"
  46. android:layout_below="@+id/searchDevices"
  47. android:layout_marginTop="160dp"
  48. android:background="@android:color/darker_gray" />
  49. <LinearLayout
  50. android:layout_width="match_parent"
  51. android:layout_height="190dp"
  52. android:layout_marginTop="288dp"
  53. android:orientation="vertical" >
  54. <TextView
  55. android:layout_width="match_parent"
  56. android:layout_height="wrap_content"
  57. android:text="已配对设备" />
  58. <ListView
  59. android:id="@+id/bondDevices"
  60. android:layout_width="wrap_content"
  61. android:layout_height="wrap_content"
  62. android:layout_alignParentLeft="true"
  63. android:layout_below="@+id/linearLayout1" >
  64. </ListView>
  65. </LinearLayout>
  66. <Button
  67. android:id="@+id/return_Bluetooth_btn"
  68. android:layout_width="100dp"
  69. android:layout_height="wrap_content"
  70. android:layout_above="@+id/searchDevices"
  71. android:layout_alignParentLeft="true"
  72. android:text="返回" />
  73. </RelativeLayout></span>

从上边的布局文件中不难看出,其中有两个ListView,OK,那下边贴出对应的两个item布局文件

--> 第一个item:unbonddevice_item.xml

  1. <span style="font-size:14px"><?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:id="@+id/device_name"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:layout_alignParentLeft="true"
  10. android:layout_alignParentTop="true"
  11. android:text="未绑定设备"
  12. android:textAppearance="?android:attr/textAppearanceLarge" />
  13. </RelativeLayout></span>

-->第二个item:bonddevice_item.xml

  1. <span style="font-size:14px"><?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <TextView
  6. android:id="@+id/device_name"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:layout_alignParentLeft="true"
  10. android:layout_alignParentTop="true"
  11. android:text="已绑定设备"
  12. android:textAppearance="?android:attr/textAppearanceLarge" />
  13. </RelativeLayout></span>

2.还有另外一个布局文件,就是当点击已绑定蓝牙设备下边的某个item时进入打印的界面,不多说,看图!

android蓝牙打印机

代码如下:printdata_layout.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <EditText
  6. android:id="@+id/print_data"
  7. android:layout_width="match_parent"
  8. android:layout_height="200dp"
  9. android:layout_alignParentLeft="true"
  10. android:layout_alignParentTop="true"
  11. android:layout_marginTop="46dp" >
  12. </EditText>
  13. <TextView
  14. android:id="@+id/device_name"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:layout_alignParentLeft="true"
  18. android:layout_alignParentTop="true"
  19. android:layout_marginTop="16dp"
  20. android:text="Large Text"
  21. android:textAppearance="?android:attr/textAppearanceLarge" />
  22. <TextView
  23. android:id="@+id/connect_state"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:layout_alignBaseline="@+id/device_name"
  27. android:layout_alignBottom="@+id/device_name"
  28. android:layout_marginLeft="42dp"
  29. android:layout_toRightOf="@+id/device_name"
  30. android:text="Large Text"
  31. android:textAppearance="?android:attr/textAppearanceLarge" />
  32. <Button
  33. android:id="@+id/send"
  34. android:layout_width="match_parent"
  35. android:layout_height="wrap_content"
  36. android:layout_alignParentLeft="true"
  37. android:layout_below="@+id/print_data"
  38. android:layout_marginTop="21dp"
  39. android:text="打印" />
  40. <Button
  41. android:id="@+id/command"
  42. android:layout_width="match_parent"
  43. android:layout_height="wrap_content"
  44. android:layout_alignParentLeft="true"
  45. android:layout_below="@+id/send"
  46. android:text="指令" />
  47. </RelativeLayout>

至此,布局文件就搞定了,接下来就要编写java代码了。主要有一下这么几个类,一个一个来哈

BluetoothActivity.java

这个类的主要作用是初始化主界面,看代码

  1. public class BluetoothActivity extends Activity {
  2. private Context context = null;
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. this.context = this;
  6. setTitle("蓝牙打印");
  7. setContentView(R.layout.bluetooth_layout);
  8. this.initListener();
  9. }
  10. private void initListener() {
  11. ListView unbondDevices = (ListView) this
  12. .findViewById(R.id.unbondDevices);
  13. ListView bondDevices = (ListView) this.findViewById(R.id.bondDevices);
  14. Button switchBT = (Button) this.findViewById(R.id.openBluetooth_tb);
  15. Button searchDevices = (Button) this.findViewById(R.id.searchDevices);
  16. BluetoothAction bluetoothAction = new BluetoothAction(this.context,
  17. unbondDevices, bondDevices, switchBT, searchDevices,
  18. BluetoothActivity.this);
  19. Button returnButton = (Button) this
  20. .findViewById(R.id.return_Bluetooth_btn);
  21. bluetoothAction.setSearchDevices(searchDevices);
  22. bluetoothAction.initView();
  23. switchBT.setOnClickListener(bluetoothAction);
  24. searchDevices.setOnClickListener(bluetoothAction);
  25. returnButton.setOnClickListener(bluetoothAction);
  26. }
  27. //屏蔽返回键的代码:
  28. public boolean onKeyDown(int keyCode,KeyEvent event)
  29. {
  30. switch(keyCode)
  31. {
  32. case KeyEvent.KEYCODE_BACK:return true;
  33. }
  34. return super.onKeyDown(keyCode, event);
  35. }
  36. }

BluetoothAction.java

这个类顾名思义,是处理bluetoothActivity中各种操作事件的action类,看代码

  1. <span style="font-size:14px">public class BluetoothAction implements OnClickListener {
  2. private Button switchBT = null;
  3. private Button searchDevices = null;
  4. private Activity activity = null;
  5. private ListView unbondDevices = null;
  6. private ListView bondDevices = null;
  7. private Context context = null;
  8. private BluetoothService bluetoothService = null;
  9. public BluetoothAction(Context context, ListView unbondDevices,
  10. ListView bondDevices, Button switchBT, Button searchDevices,
  11. Activity activity) {
  12. super();
  13. this.context = context;
  14. this.unbondDevices = unbondDevices;
  15. this.bondDevices = bondDevices;
  16. this.switchBT = switchBT;
  17. this.searchDevices = searchDevices;
  18. this.activity = activity;
  19. this.bluetoothService = new BluetoothService(this.context,
  20. this.unbondDevices, this.bondDevices, this.switchBT,
  21. this.searchDevices);
  22. }
  23. public void setSwitchBT(Button switchBT) {
  24. this.switchBT = switchBT;
  25. }
  26. public void setSearchDevices(Button searchDevices) {
  27. this.searchDevices = searchDevices;
  28. }
  29. public void setUnbondDevices(ListView unbondDevices) {
  30. this.unbondDevices = unbondDevices;
  31. }
  32. /**
  33. * 初始化界面
  34. */
  35. public void initView() {
  36. if (this.bluetoothService.isOpen()) {
  37. System.out.println("蓝牙有开!");
  38. switchBT.setText("关闭蓝牙");
  39. }
  40. if (!this.bluetoothService.isOpen()) {
  41. System.out.println("蓝牙没开!");
  42. this.searchDevices.setEnabled(false);
  43. }
  44. }
  45. private void searchDevices() {
  46. bluetoothService.searchDevices();
  47. }
  48. /**
  49. * 各种按钮的监听
  50. */
  51. @Override
  52. public void onClick(View v) {
  53. if (v.getId() == R.id.searchDevices) {
  54. this.searchDevices();
  55. } else if (v.getId() == R.id.return_Bluetooth_btn) {
  56. activity.finish();
  57. } else if (v.getId() == R.id.openBluetooth_tb) {
  58. if (!this.bluetoothService.isOpen()) {
  59. // 蓝牙关闭的情况
  60. System.out.println("蓝牙关闭的情况");
  61. this.bluetoothService.openBluetooth(activity);
  62. } else {
  63. // 蓝牙打开的情况
  64. System.out.println("蓝牙打开的情况");
  65. this.bluetoothService.closeBluetooth();
  66. }
  67. }
  68. }
  69. }</span>

这个类会把各种请求动作分门别类,交给BluetoothService.java来处理,看代码

  1. public class BluetoothService {
  2. private Context context = null;
  3. private BluetoothAdapter bluetoothAdapter = BluetoothAdapter
  4. .getDefaultAdapter();
  5. private ArrayList<BluetoothDevice> unbondDevices = null; // 用于存放未配对蓝牙设备
  6. private ArrayList<BluetoothDevice> bondDevices = null;// 用于存放已配对蓝牙设备
  7. private Button switchBT = null;
  8. private Button searchDevices = null;
  9. private ListView unbondDevicesListView = null;
  10. private ListView bondDevicesListView = null;
  11. /**
  12. * 添加已绑定蓝牙设备到ListView
  13. */
  14. private void addBondDevicesToListView() {
  15. ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
  16. int count = this.bondDevices.size();
  17. System.out.println("已绑定设备数量:" + count);
  18. for (int i = 0; i < count; i++) {
  19. HashMap<String, Object> map = new HashMap<String, Object>();
  20. map.put("deviceName", this.bondDevices.get(i).getName());
  21. data.add(map);// 把item项的数据加到data中
  22. }
  23. String[] from = { "deviceName" };
  24. int[] to = { R.id.device_name };
  25. SimpleAdapter simpleAdapter = new SimpleAdapter(this.context, data,
  26. R.layout.bonddevice_item, from, to);
  27. // 把适配器装载到listView中
  28. this.bondDevicesListView.setAdapter(simpleAdapter);
  29. this.bondDevicesListView
  30. .setOnItemClickListener(new OnItemClickListener() {
  31. @Override
  32. public void onItemClick(AdapterView<?> arg0, View arg1,
  33. int arg2, long arg3) {
  34. BluetoothDevice device = bondDevices.get(arg2);
  35. Intent intent = new Intent();
  36. intent.setClassName(context,
  37. "com.lifeng.jdxt.view.PrintDataActivity");
  38. intent.putExtra("deviceAddress", device.getAddress());
  39. context.startActivity(intent);
  40. }
  41. });
  42. }
  43. /**
  44. * 添加未绑定蓝牙设备到ListView
  45. */
  46. private void addUnbondDevicesToListView() {
  47. ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
  48. int count = this.unbondDevices.size();
  49. System.out.println("未绑定设备数量:" + count);
  50. for (int i = 0; i < count; i++) {
  51. HashMap<String, Object> map = new HashMap<String, Object>();
  52. map.put("deviceName", this.unbondDevices.get(i).getName());
  53. data.add(map);// 把item项的数据加到data中
  54. }
  55. String[] from = { "deviceName" };
  56. int[] to = { R.id.device_name };
  57. SimpleAdapter simpleAdapter = new SimpleAdapter(this.context, data,
  58. R.layout.unbonddevice_item, from, to);
  59. // 把适配器装载到listView中
  60. this.unbondDevicesListView.setAdapter(simpleAdapter);
  61. // 为每个item绑定监听,用于设备间的配对
  62. this.unbondDevicesListView
  63. .setOnItemClickListener(new OnItemClickListener() {
  64. @Override
  65. public void onItemClick(AdapterView<?> arg0, View arg1,
  66. int arg2, long arg3) {
  67. try {
  68. Method createBondMethod = BluetoothDevice.class
  69. .getMethod("createBond");
  70. createBondMethod
  71. .invoke(unbondDevices.get(arg2));
  72. // 将绑定好的设备添加的已绑定list集合
  73. bondDevices.add(unbondDevices.get(arg2));
  74. // 将绑定好的设备从未绑定list集合中移除
  75. unbondDevices.remove(arg2);
  76. addBondDevicesToListView();
  77. addUnbondDevicesToListView();
  78. } catch (Exception e) {
  79. Toast.makeText(context, "配对失败!", Toast.LENGTH_SHORT)
  80. .show();
  81. }
  82. }
  83. });
  84. }
  85. public BluetoothService(Context context, ListView unbondDevicesListView,
  86. ListView bondDevicesListView, Button switchBT, Button searchDevices) {
  87. this.context = context;
  88. this.unbondDevicesListView = unbondDevicesListView;
  89. this.bondDevicesListView = bondDevicesListView;
  90. // this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  91. this.unbondDevices = new ArrayList<BluetoothDevice>();
  92. this.bondDevices = new ArrayList<BluetoothDevice>();
  93. this.switchBT = switchBT;
  94. this.searchDevices = searchDevices;
  95. this.initIntentFilter();
  96. }
  97. private void initIntentFilter() {
  98. // 设置广播信息过滤
  99. IntentFilter intentFilter = new IntentFilter();
  100. intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
  101. intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
  102. intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
  103. intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
  104. // 注册广播接收器,接收并处理搜索结果
  105. context.registerReceiver(receiver, intentFilter);
  106. }
  107. /**
  108. * 打开蓝牙
  109. */
  110. public void openBluetooth(Activity activity) {
  111. Intent enableBtIntent = new Intent(
  112. BluetoothAdapter.ACTION_REQUEST_ENABLE);
  113. activity.startActivityForResult(enableBtIntent, 1);
  114. }
  115. /**
  116. * 关闭蓝牙
  117. */
  118. public void closeBluetooth() {
  119. this.bluetoothAdapter.disable();
  120. }
  121. /**
  122. * 判断蓝牙是否打开
  123. *
  124. * @return boolean
  125. */
  126. public boolean isOpen() {
  127. return this.bluetoothAdapter.isEnabled();
  128. }
  129. /**
  130. * 搜索蓝牙设备
  131. */
  132. public void searchDevices() {
  133. this.bondDevices.clear();
  134. this.unbondDevices.clear();
  135. // 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
  136. this.bluetoothAdapter.startDiscovery();
  137. }
  138. /**
  139. * 添加未绑定蓝牙设备到list集合
  140. *
  141. * @param device
  142. */
  143. public void addUnbondDevices(BluetoothDevice device) {
  144. System.out.println("未绑定设备名称:" + device.getName());
  145. if (!this.unbondDevices.contains(device)) {
  146. this.unbondDevices.add(device);
  147. }
  148. }
  149. /**
  150. * 添加已绑定蓝牙设备到list集合
  151. *
  152. * @param device
  153. */
  154. public void addBandDevices(BluetoothDevice device) {
  155. System.out.println("已绑定设备名称:" + device.getName());
  156. if (!this.bondDevices.contains(device)) {
  157. this.bondDevices.add(device);
  158. }
  159. }
  160. /**
  161. * 蓝牙广播接收器
  162. */
  163. private BroadcastReceiver receiver = new BroadcastReceiver() {
  164. ProgressDialog progressDialog = null;
  165. @Override
  166. public void onReceive(Context context, Intent intent) {
  167. String action = intent.getAction();
  168. if (BluetoothDevice.ACTION_FOUND.equals(action)) {
  169. BluetoothDevice device = intent
  170. .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  171. if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
  172. addBandDevices(device);
  173. } else {
  174. addUnbondDevices(device);
  175. }
  176. } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
  177. progressDialog = ProgressDialog.show(context, "请稍等...",
  178. "搜索蓝牙设备中...", true);
  179. } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
  180. .equals(action)) {
  181. System.out.println("设备搜索完毕");
  182. progressDialog.dismiss();
  183. addUnbondDevicesToListView();
  184. addBondDevicesToListView();
  185. // bluetoothAdapter.cancelDiscovery();
  186. }
  187. if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
  188. if (bluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
  189. System.out.println("--------打开蓝牙-----------");
  190. switchBT.setText("关闭蓝牙");
  191. searchDevices.setEnabled(true);
  192. bondDevicesListView.setEnabled(true);
  193. unbondDevicesListView.setEnabled(true);
  194. } else if (bluetoothAdapter.getState() == BluetoothAdapter.STATE_OFF) {
  195. System.out.println("--------关闭蓝牙-----------");
  196. switchBT.setText("打开蓝牙");
  197. searchDevices.setEnabled(false);
  198. bondDevicesListView.setEnabled(false);
  199. unbondDevicesListView.setEnabled(false);
  200. }
  201. }
  202. }
  203. };
  204. }

到这里,第一个界面的代码就写完了,当我们点击要打印的蓝牙设备时就会跳转到打印页面,跳转代码在BluetoothService.java的addBondDevicesToListView()中

接下来让我们来看看第二个界面的代码,结构和第一个界面的代码一样,分类三个类,请看代码。。。。。

PrintDataActivity.java

  1. public class PrintDataActivity extends Activity {
  2. private Context context = null;
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. this.setTitle("蓝牙打印");
  6. this.setContentView(R.layout.printdata_layout);
  7. this.context = this;
  8. this.initListener();
  9. }
  10. /**
  11. * 获得从上一个Activity传来的蓝牙地址
  12. * @return String
  13. */
  14. private String getDeviceAddress() {
  15. // 直接通过Context类的getIntent()即可获取Intent
  16. Intent intent = this.getIntent();
  17. // 判断
  18. if (intent != null) {
  19. return intent.getStringExtra("deviceAddress");
  20. } else {
  21. return null;
  22. }
  23. }
  24. private void initListener() {
  25. TextView deviceName = (TextView) this.findViewById(R.id.device_name);
  26. TextView connectState = (TextView) this
  27. .findViewById(R.id.connect_state);
  28. PrintDataAction printDataAction = new PrintDataAction(this.context,
  29. this.getDeviceAddress(), deviceName, connectState);
  30. EditText printData = (EditText) this.findViewById(R.id.print_data);
  31. Button send = (Button) this.findViewById(R.id.send);
  32. Button command = (Button) this.findViewById(R.id.command);
  33. printDataAction.setPrintData(printData);
  34. send.setOnClickListener(printDataAction);
  35. command.setOnClickListener(printDataAction);
  36. }
  37. @Override
  38. protected void onDestroy() {
  39. PrintDataService.disconnect();
  40. super.onDestroy();
  41. }
  42. }

PrintDataAction.java

  1. <span style="font-size:14px">public class PrintDataAction implements OnClickListener {
  2. private Context context = null;
  3. private TextView deviceName = null;
  4. private TextView connectState = null;
  5. private EditText printData = null;
  6. private String deviceAddress = null;
  7. private PrintDataService printDataService = null;
  8. public PrintDataAction(Context context, String deviceAddress,
  9. TextView deviceName, TextView connectState) {
  10. super();
  11. this.context = context;
  12. this.deviceAddress = deviceAddress;
  13. this.deviceName = deviceName;
  14. this.connectState = connectState;
  15. this.printDataService = new PrintDataService(this.context,
  16. this.deviceAddress);
  17. this.initView();
  18. }
  19. private void initView() {
  20. // 设置当前设备名称
  21. this.deviceName.setText(this.printDataService.getDeviceName());
  22. // 一上来就先连接蓝牙设备
  23. boolean flag = this.printDataService.connect();
  24. if (flag == false) {
  25. // 连接失败
  26. this.connectState.setText("连接失败!");
  27. } else {
  28. // 连接成功
  29. this.connectState.setText("连接成功!");
  30. }
  31. }
  32. public void setPrintData(EditText printData) {
  33. this.printData = printData;
  34. }
  35. @Override
  36. public void onClick(View v) {
  37. if (v.getId() == R.id.send) {
  38. String sendData = this.printData.getText().toString();
  39. this.printDataService.send(sendData + "\n");
  40. } else if (v.getId() == R.id.command) {
  41. this.printDataService.selectCommand();
  42. }
  43. }
  44. }</span>

PrintDataService.java

  1. <span style="font-size:14px">public class PrintDataService {
  2. private Context context = null;
  3. private String deviceAddress = null;
  4. private BluetoothAdapter bluetoothAdapter = BluetoothAdapter
  5. .getDefaultAdapter();
  6. private BluetoothDevice device = null;
  7. private static BluetoothSocket bluetoothSocket = null;
  8. private static OutputStream outputStream = null;
  9. private static final UUID uuid = UUID
  10. .fromString("00001101-0000-1000-8000-00805F9B34FB");
  11. private boolean isConnection = false;
  12. final String[] items = { "复位打印机", "标准ASCII字体", "压缩ASCII字体", "字体不放大",
  13. "宽高加倍", "取消加粗模式", "选择加粗模式", "取消倒置打印", "选择倒置打印", "取消黑白反显", "选择黑白反显",
  14. "取消顺时针旋转90°", "选择顺时针旋转90°" };
  15. final byte[][] byteCommands = { { 0x1b, 0x40 },// 复位打印机
  16. { 0x1b, 0x4d, 0x00 },// 标准ASCII字体
  17. { 0x1b, 0x4d, 0x01 },// 压缩ASCII字体
  18. { 0x1d, 0x21, 0x00 },// 字体不放大
  19. { 0x1d, 0x21, 0x11 },// 宽高加倍
  20. { 0x1b, 0x45, 0x00 },// 取消加粗模式
  21. { 0x1b, 0x45, 0x01 },// 选择加粗模式
  22. { 0x1b, 0x7b, 0x00 },// 取消倒置打印
  23. { 0x1b, 0x7b, 0x01 },// 选择倒置打印
  24. { 0x1d, 0x42, 0x00 },// 取消黑白反显
  25. { 0x1d, 0x42, 0x01 },// 选择黑白反显
  26. { 0x1b, 0x56, 0x00 },// 取消顺时针旋转90°
  27. { 0x1b, 0x56, 0x01 },// 选择顺时针旋转90°
  28. };
  29. public PrintDataService(Context context, String deviceAddress) {
  30. super();
  31. this.context = context;
  32. this.deviceAddress = deviceAddress;
  33. this.device = this.bluetoothAdapter.getRemoteDevice(this.deviceAddress);
  34. }
  35. /**
  36. * 获取设备名称
  37. *
  38. * @return String
  39. */
  40. public String getDeviceName() {
  41. return this.device.getName();
  42. }
  43. /**
  44. * 连接蓝牙设备
  45. */
  46. public boolean connect() {
  47. if (!this.isConnection) {
  48. try {
  49. bluetoothSocket = this.device
  50. .createRfcommSocketToServiceRecord(uuid);
  51. bluetoothSocket.connect();
  52. outputStream = bluetoothSocket.getOutputStream();
  53. this.isConnection = true;
  54. if (this.bluetoothAdapter.isDiscovering()) {
  55. System.out.println("关闭适配器!");
  56. this.bluetoothAdapter.isDiscovering();
  57. }
  58. } catch (Exception e) {
  59. Toast.makeText(this.context, "连接失败!", 1).show();
  60. return false;
  61. }
  62. Toast.makeText(this.context, this.device.getName() + "连接成功!",
  63. Toast.LENGTH_SHORT).show();
  64. return true;
  65. } else {
  66. return true;
  67. }
  68. }
  69. /**
  70. * 断开蓝牙设备连接
  71. */
  72. public static void disconnect() {
  73. System.out.println("断开蓝牙设备连接");
  74. try {
  75. bluetoothSocket.close();
  76. outputStream.close();
  77. } catch (IOException e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. }
  81. }
  82. /**
  83. * 选择指令
  84. */
  85. public void selectCommand() {
  86. new AlertDialog.Builder(context).setTitle("请选择指令")
  87. .setItems(items, new DialogInterface.OnClickListener() {
  88. @Override
  89. public void onClick(DialogInterface dialog, int which) {
  90. try {
  91. outputStream.write(byteCommands[which]);
  92. } catch (IOException e) {
  93. Toast.makeText(context, "设置指令失败!",
  94. Toast.LENGTH_SHORT).show();
  95. }
  96. }
  97. }).create().show();
  98. }
  99. /**
  100. * 发送数据
  101. */
  102. public void send(String sendData) {
  103. if (this.isConnection) {
  104. System.out.println("开始打印!!");
  105. try {
  106. byte[] data = sendData.getBytes("gbk");
  107. outputStream.write(data, 0, data.length);
  108. outputStream.flush();
  109. } catch (IOException e) {
  110. Toast.makeText(this.context, "发送失败!", Toast.LENGTH_SHORT)
  111. .show();
  112. }
  113. } else {
  114. Toast.makeText(this.context, "设备未连接,请重新连接!", Toast.LENGTH_SHORT)
  115. .show();
  116. }
  117. }
  118. }</span>

android蓝牙打印机android蓝牙打印机android蓝牙打印机android蓝牙打印机到此,全部代码贴完,也就大功告成了android蓝牙打印机android蓝牙打印机android蓝牙打印机android蓝牙打印机

对了对了,差点忘记一件很重要的事情!!清单文件忘记给权限啦!!

权限

  1. <span style="font-size:14px"><uses-permission android:name="android.permission.BLUETOOTH" />
  2. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> </span>

注册Activity

  1. <span style="font-size:14px"><activity android:name=".BluetoothActivity" />
  2. <activity android:name=".PrintDataActivity" /> </span><span style="font-size:14px">
  3. </span>

android蓝牙打印机这下子就真的搞定了!

更多3
5
0
查看评论
12楼 泓豆奶茶 昨天 10:32发表 [回复]
android蓝牙打印机
按你说的还是成功不了,能加QQ聊吗?qq:1584166172
11楼 zywxsg0612 4天前 15:42发表 [回复]
android蓝牙打印机
LZ 你好 问个问题createRfcommSocketToServiceRecord(uuid)
对于其中的UUID,我直接用生成器生成一个复制过去,在这里是可以用的吗?
还是说uuid有什么特殊的??百度了下 貌似这个识别码生成后就可以用了。。
还有就是后边的打印指令
0x1b, 0x40
1b应该是esc 40是@ ??
刚开始学着写android 很多不是很懂,有些问题 类似USB 啊 打印机 搜出来的都是各种广告,很少和开发有关。。。
Re: reality_jie 4天前 16:25发表 [回复]
android蓝牙打印机
回复zywxsg0612:uuid没有特殊的,直接用生成器生成一个复制过去可以
Re: zywxsg0612 前天 09:59发表 [回复]
android蓝牙打印机
回复reality_jie:谢谢。。。
10楼 xingzjx 2013-12-06 15:07发表 [回复]
android蓝牙打印机
谢谢楼主分享!!!
9楼 qq624196743 2013-11-29 17:52发表 [回复]
android蓝牙打印机
碉堡了,好文啊
Re: reality_jie 2013-11-29 18:09发表 [回复]
android蓝牙打印机
回复qq624196743:谢谢^_^o~ 努力!
8楼 csaily504768527 2013-11-29 11:07发表 [回复]
android蓝牙打印机
楼主你好。我想请问一下,你的那些打印指令还有么。使用你上面的代码打印中文时候会出现乱码。。
Re: reality_jie 2013-11-29 11:10发表 [回复]
android蓝牙打印机
回复csaily504768527:指令就这些。。但是我在我这里的几台打印机测试都不会出现乱码哦,如果出现乱码,你尝试在里边修改一下
byte[] data = sendData.getBytes("gbk"): 把gbk修改成utf-8
Re: csaily504768527 2013-11-29 11:33发表 [回复]
android蓝牙打印机
回复reality_jie:楼主。。还是不成功。。我测试的设备是HP 100 便携式蓝牙打印机。。还尝试了。。GB2312 .. BIG5... GBK 。等。都还是乱码。。这怎么搞起。。 好不科学啊。。-_-.......泪崩的节奏中。。
Re: reality_jie 2013-11-29 14:16发表 [回复]
android蓝牙打印机
回复csaily504768527:出现乱码的根本原因是打印机和手机发送的数据的编码不统一。你先去确认一下你的打印机是用什么编码来表示中文的
7楼 蜗蜗牛快跑 2013-11-27 20:32发表 [回复]
android蓝牙打印机
楼主,您好,我最近也想实现一个蓝牙打印的功能。但是在蓝牙通信的时候遇到了点问题,我的socket在connet这步,一直报错:java.io.IOException: Service discovery failed。我用的UUID跟你是一样的,我目前是想连接其他手机(已开启蓝牙服务)。您知道怎么解决么?
Re: reality_jie 2013-11-27 21:12发表 [回复]
android蓝牙打印机
回复superbinbin1:这个代码只能用于手机与打印机之间的连接哦
Re: 蜗蜗牛快跑 2013-11-27 23:15发表 [回复]
android蓝牙打印机
回复reality_jie:这样呀,那手机之间连接。。。用什么UUID?UUID的类型不是根据服务来选的么?因为我很好奇,安卓自带的蓝牙分享功能,几乎是无论对方是什么蓝牙,都可以把文件分享过去,手机之间自然不用说,电脑端的蓝牙适配器也可以传,hp的打印机我也有试过,可以直接发图片过去打印。那么他是如何设计的???楼主大神帮忙解答疑惑呀,感激不尽。
Re: reality_jie 2013-11-29 18:11发表 [回复]
android蓝牙打印机
回复superbinbin1:亲,这个问题我也有待研究哦
6楼 微扬的嘴角 2013-11-07 14:31发表 [回复]
android蓝牙打印机
对任意型号蓝牙打印机通用吗?
Re: reality_jie 2013-11-07 14:40发表 [回复]
android蓝牙打印机
回复feng52101:可以
5楼 bhald6821935 2013-10-18 11:20发表 [回复]
android蓝牙打印机
樓主 能發個源碼麼。謝謝646965572@qq.com
Re: reality_jie 2013-10-18 13:42发表 [回复]
android蓝牙打印机
回复bhald6821935:http://download.csdn.net/detail/reality_jie/6418413
完整源码
4楼 wang158210867 2013-10-12 16:01发表 [回复]
android蓝牙打印机
有没有遇到 打不了中文 或者 中文乱码问题呀
Re: csaily504768527 2013-11-29 11:37发表 [回复]
android蓝牙打印机
回复wang158210867:哥们,你那个乱码问题找到解决办法木有。。或者是思路。。
Re: reality_jie 2013-10-12 17:25发表 [回复]
android蓝牙打印机
回复wang158210867:我自己做的测试都没有出现中文乱码哦
3楼 zhafei1311 2013-09-27 15:50发表 [回复]
android蓝牙打印机
有没有打印图片的代码
Re: reality_jie 2013-09-27 17:38发表 [回复]
android蓝牙打印机
回复u012243481:暂时没有
2楼 红姬茄子 2013-09-25 14:45发表 [回复]
android蓝牙打印机
楼主,我想问下这个android手机连接蓝牙打印能不能指定文件打印呢,譬如说我指定一张图片,或一个文档什么的让打印机打印,这种功能能否实现嘞,求指教,嘿嘿
Re: reality_jie 2013-09-25 17:08发表 [回复]
android蓝牙打印机
public void send(String sendData) { 
if (this.isConnection) { 
System.out.println("开始打印!!"); 
try { 
byte[] data = sendData.getBytes("gbk"); 
outputStream.write(data, 0, data.length); 
outputStream.flush(); 
} catch (IOException e) { 
Toast.makeText(this.context, "发送失败!", Toast.LENGTH_SHORT) 
.show(); 

} else { 
Toast.makeText(this.context, "设备未连接,请重新连接!", Toast.LENGTH_SHORT) 
.show();

}
从这个打印方法可以看出,打印的数据是以二进制流发送出去的。也就是说,如果你想打印外部文档,只要用一个输入流,比如BufferedReader把数据读入再转成二进制流交给outputStream,应该是能实现的。至于图片。。。暂时我就不知道怎么弄了

1楼 红姬茄子 2013-09-24 17:04发表 [回复]
android蓝牙打印机
不错不错,多谢楼主分享,学习了,赞一个
Re: reality_jie 2013-09-24 17:31发表 [回复]
android蓝牙打印机
Y(^_^)Y
您还没有登录,请[登录][注册]
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
android蓝牙打印机
个人资料
android蓝牙打印机
    • 访问:4114次
    • 积分:269分
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:29条
    文章存档
    文章分类
    推荐文章
    最新评论
公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
QQ客服 微博客服 论坛反馈 联系邮箱:webmaster@csdn.net 服务热线:400-600-2320
京 ICP 证 070598 号
北京创新乐知信息技术有限公司 版权所有
世纪乐知(北京)网络技术有限公司 提供技术支持
江苏乐知网络技术有限公司 提供商务支持
Copyright © 1999-2012, CSDN.NET, All Rights Reserved android蓝牙打印机

android蓝牙打印机