安卓手机连接蓝牙打印机实现打印功能

Posted westsoft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓手机连接蓝牙打印机实现打印功能相关的知识,希望对你有一定的参考价值。

 

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

完整源码下载

 

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

1.这是主界面的效果图

技术分享图片

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

 

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

 

 

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

 

  --> 第一个item:unbonddevice_item.xml

 

[html] view plaincopy
 
  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.     
  6.     <TextView    
  7.         android:id="@+id/device_name"    
  8.         android:layout_width="match_parent"    
  9.         android:layout_height="wrap_content"    
  10.         android:layout_alignParentLeft="true"    
  11.         android:layout_alignParentTop="true"    
  12.         android:text="未绑定设备"    
  13.         android:textAppearance="?android:attr/textAppearanceLarge" />    
  14.     
  15. </RelativeLayout></span>  


-->第二个item:bonddevice_item.xml

 

 

[html] view plaincopy
 
  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.     
  6.     <TextView    
  7.         android:id="@+id/device_name"    
  8.         android:layout_width="match_parent"    
  9.         android:layout_height="wrap_content"    
  10.         android:layout_alignParentLeft="true"    
  11.         android:layout_alignParentTop="true"    
  12.         android:text="已绑定设备"    
  13.         android:textAppearance="?android:attr/textAppearanceLarge" />    
  14.     
  15. </RelativeLayout></span>  


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

 

技术分享图片

 

代码如下:printdata_layout.xml

 

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


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

 

BluetoothActivity.java

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

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


BluetoothAction.java

 

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

 

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

 

 

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

 

 

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


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

 

 

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

 

PrintDataActivity.java

 

 

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

 

 

PrintDataAction.java

 

 

[java] view plaincopy
 
  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.     
  9.     public PrintDataAction(Context context, String deviceAddress,    
  10.             TextView deviceName, TextView connectState) {    
  11.         super();    
  12.         this.context = context;    
  13.         this.deviceAddress = deviceAddress;    
  14.         this.deviceName = deviceName;    
  15.         this.connectState = connectState;    
  16.         this.printDataService = new PrintDataService(this.context,    
  17.                 this.deviceAddress);    
  18.         this.initView();    
  19.     
  20.     }    
  21.     
  22.     private void initView() {    
  23.         // 设置当前设备名称    
  24.         this.deviceName.setText(this.printDataService.getDeviceName());    
  25.         // 一上来就先连接蓝牙设备    
  26.         boolean flag = this.printDataService.connect();    
  27.         if (flag == false) {    
  28.             // 连接失败    
  29.             this.connectState.setText("连接失败!");    
  30.         } else {    
  31.             // 连接成功    
  32.             this.connectState.setText("连接成功!");    
  33.     
  34.         }    
  35.     }    
  36.     
  37.     public void setPrintData(EditText printData) {    
  38.         this.printData = printData;    
  39.     }    
  40.     
  41.     @Override    
  42.     public void onClick(View v) {    
  43.         if (v.getId() == R.id.send) {    
  44.             String sendData = this.printData.getText().toString();    
  45.             this.printDataService.send(sendData + "\n");    
  46.         } else if (v.getId() == R.id.command) {    
  47.             this.printDataService.selectCommand();    
  48.     
  49.         }    
  50.     }    
  51. }</span>  


PrintDataService.java

 

 

 

[java] view plaincopy
 
  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.     
  30.     public PrintDataService(Context context, String deviceAddress) {    
  31.         super();    
  32.         this.context = context;    
  33.         this.deviceAddress = deviceAddress;    
  34.         this.device = this.bluetoothAdapter.getRemoteDevice(this.deviceAddress);    
  35.     }    
  36.     
  37.     /**  
  38.      * 获取设备名称  
  39.      *   
  40.      * @return String  
  41.      */    
  42.     public String getDeviceName() {    
  43.         return this.device.getName();    
  44.     }    
  45.     
  46.     /**  
  47.      * 连接蓝牙设备  
  48.      */    
  49.     public boolean connect() {    
  50.         if (!this.isConnection) {    
  51.             try {    
  52.                 bluetoothSocket = this.device    
  53.                         .createRfcommSocketToServiceRecord(uuid);    
  54.                 bluetoothSocket.connect();    
  55.                 outputStream = bluetoothSocket.getOutputStream();    
  56.                 this.isConnection = true;    
  57.                 if (this.bluetoothAdapter.isDiscovering()) {    
  58.                     System.out.println("关闭适配器!");    
  59.                     this.bluetoothAdapter.isDiscovering();    
  60.                 }    
  61.             } catch (Exception e) {    
  62.                 Toast.makeText(this.context, "连接失败!", 1).show();    
  63.                 return false;    
  64.             }    
  65.             Toast.makeText(this.context, this.device.getName() + "连接成功!",    
  66.                     Toast.LENGTH_SHORT).show();    
  67.             return true;    
  68.         } else {    
  69.             return true;    
  70.         }    
  71.     }    
  72.     
  73.     /**  
  74.      * 断开蓝牙设备连接  
  75.      */    
  76.     public static void disconnect() {    
  77.         System.out.println("断开蓝牙设备连接");    
  78.         try {    
  79.             bluetoothSocket.close();    
  80.             outputStream.close();    
  81.         } catch (IOException e) {    
  82.             // TODO Auto-generated catch block    
  83.             e.printStackTrace();    
  84.         }    
  85.     
  86.     }    
  87.     
  88.     /**  
  89.      * 选择指令  
  90.      */    
  91.     public void selectCommand() {    
  92.         new AlertDialog.Builder(context).setTitle("请选择指令")    
  93.                 .setItems(items, new DialogInterface.OnClickListener() {    
  94.                     @Override    
  95.                     public void onClick(DialogInterface dialog, int which) {    
  96.                         try {    
  97.                             outputStream.write(byteCommands[which]);    
  98.                         } catch (IOException e) {    
  99.                             Toast.makeText(context, "设置指令失败!",    
  100.                                     Toast.LENGTH_SHORT).show();    
  101.                         }    
  102.                     }    
  103.                 }).create().show();    
  104.     }    
  105.     
  106.     /**  
  107.      * 发送数据  
  108.      */    
  109.     public void send(String sendData) {    
  110.         if (this.isConnection) {    
  111.             System.out.println("开始打印!!");    
  112.             try {    
  113.                 byte[] data = sendData.getBytes("gbk");    
  114.                 outputStream.write(data, 0, data.length);    
  115.                 outputStream.flush();    
  116.             } catch (IOException e) {    
  117.                 Toast.makeText(this.context, "发送失败!", Toast.LENGTH_SHORT)    
  118.                         .show();    
  119.             }    
  120.         } else {    
  121.             Toast.makeText(this.context, "设备未连接,请重新连接!", Toast.LENGTH_SHORT)    
  122.                     .show();    
  123.     
  124.         }    
  125.     }    
  126.     
  127. }</span>  


技术分享图片技术分享图片技术分享图片技术分享图片到此,全部代码贴完,也就大功告成了技术分享图片技术分享图片技术分享图片技术分享图片

 

 

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

权限

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


注册Activity

 

[html] view plaincopy
 
  1. <span style="font-size:14px"><activity android:name=".BluetoothActivity" />    
  2. <activity android:name=".PrintDataActivity" /> </span><span style="font-size:14px">   
  3.   
  4. </span>  


技术分享图片这下子就真的搞定了!












以上是关于安卓手机连接蓝牙打印机实现打印功能的主要内容,如果未能解决你的问题,请参考以下文章

Android pad 连接蓝牙打印机Gprinter---实现蓝牙打印功能

手机使用打印机打印方法须知

uniapp微信小程序实现连接低功耗蓝牙打印功能

蓝牙单据打印

uniapp蓝牙连接+打印

ChinaCock打印控件介绍-TCCFujitsuPrinter实现蓝牙针式打印