zoukankan      html  css  js  c++  java
  • 安卓手机连接蓝牙打印机实现打印功能

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

     

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


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

  • 相关阅读:
    不可小视视图对效率的影响力
    Maximum Margin Planning
    PhysicsBased Boiling Simulation

    Learning Behavior Styles with Inverse Reinforcement Learning
    Simulating Biped Behaviors from Human Motion Data
    Nearoptimal Character Animation with Continuous Control
    Apprenticeship Learning via Inverse Reinforcement Learning
    回报函数学习的学徒学习综述
    Enabling Realtime Physics Simulation in Future Interactive Entertainment
  • 原文地址:https://www.cnblogs.com/westsoft/p/8437699.html
Copyright © 2011-2022 走看看