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


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


    得意这下子就真的搞定了!

  • 相关阅读:
    vue3.0基本使用
    node 版本升级
    Steam游戏《Northgard(北境之地)》修改器制作
    万能WEB弹出框,js随意适配
    数据湖了解
    操作系统(一)
    无题
    基于林业害虫识别系统的缺陷分析
    美化Android下拉刷新
    软件测试
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4577256.html
Copyright © 2020-2023  润新知