[置顶] 安卓手机连接蓝牙打印机实现打印功能

 http://blog.csdn.net/reality_jie_blog/article/details/11895843

http://download.csdn.net/download/reality_jie/6418413

分类: android 3460人阅读 评论(43) 收藏 举报
android 蓝牙打印

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

完整源码下载

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

1.这是主界面的效果图

[置顶] 安卓手机连接蓝牙打印机实现打印功能_第1张图片

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

[html] view plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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时进入打印的界面,不多说,看图!

[置顶] 安卓手机连接蓝牙打印机实现打印功能_第2张图片


代码如下:printdata_layout.xml

[html] view plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 plain copy print ?
  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 = { { 0x1b0x40 },// 复位打印机    
  16.             { 0x1b0x4d0x00 },// 标准ASCII字体    
  17.             { 0x1b0x4d0x01 },// 压缩ASCII字体    
  18.             { 0x1d0x210x00 },// 字体不放大    
  19.             { 0x1d0x210x11 },// 宽高加倍    
  20.             { 0x1b0x450x00 },// 取消加粗模式    
  21.             { 0x1b0x450x01 },// 选择加粗模式    
  22.             { 0x1b0x7b0x00 },// 取消倒置打印    
  23.             { 0x1b0x7b0x01 },// 选择倒置打印    
  24.             { 0x1d0x420x00 },// 取消黑白反显    
  25.             { 0x1d0x420x01 },// 选择黑白反显    
  26.             { 0x1b0x560x00 },// 取消顺时针旋转90°    
  27.             { 0x1b0x560x01 },// 选择顺时针旋转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 plain copy print ?
  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 plain copy print ?
  1. <span style="font-size: 14px;"><activity android:name=".BluetoothActivity" />    
  2. <activity android:name=".PrintDataActivity" /> </span><span style="font-size: 14px;">   
  3.   
  4. </span>  

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

更多 9
21
0
主题推荐
安卓 手机 蓝牙 broadcastreceiver exception
猜你在找
android style(样式)和theme(主题)设置
android源码解析--ListView(上)
windows RPC 编程总结
[android]控件TimePicker/TimePickerDialog简介
android通过服务实现消息推送
轻松搞定linux端口转发
super.onCreate(savedInstanceState); setContentView(R.layout.main);的意思
Delphi编译开关=====转帖收藏
android加载大图片到内存
AlertDialog详解
查看评论
20楼 ShilalasEugene2014-04-18 13:38发表[回复] [引用][举报]
我想问下 你发的指令是什么 是不是打印机应该有个API的?
19楼 LangYueXuoKong2014-03-17 13:04发表[回复] [引用][举报]
楼主,辛苦了,感谢你的共享。
18楼 huaruoxue2014-02-20 11:45发表[回复] [引用][举报]
你好,我下了你的代码,但是打印不了,连接成功,点打印的话,打印机接收信息标志有闪一下,就是了打印不了。wo用的是东芝的打印机。请问知道为什么吗。如果方便可以告诉我你的联系方式吗,或加woQ:46456637。谢谢
Re: reality_jie2014-02-20 21:33发表[回复] [引用][举报]
回复huaruoxue:我当时测试的两台打印机不会有这样的问题,而且我忘记打印机的类型
一般我不公开自己的联系方式
Re: huaruoxue2014-02-20 21:42发表[回复] [引用][举报]
回复reality_jie:可以加下我Q吗。46456637。、不懂的想问你下可以吗。
要不要打开端口什么的?
17楼 huaruoxue2014-02-19 09:29发表[回复] [引用][举报]
ke yi jia Q ma :46456637
16楼 lzc8762014-01-25 16:32发表[回复] [引用][举报]
谢谢楼主分享,不知道楼主尝试过打印条形码和二维码?
Re: reality_jie2014-01-25 16:57发表[回复] [引用][举报]
回复lzc876:那时没有这样的需求,所有没有尝试过
Re: lzc8762014-01-25 21:57发表[回复] [引用][举报]
回复reality_jie:我现在想实现一个打印条形码的功能,
他的命令字为0x1b, 0x43,
假如我想打印345的话,他的命令字是
0x1b, 0x43, 0x03, 0x33,0x34,0x35
但是我写入进去后,发现打印再也不能打印了,不知道楼主知道这样是什么一个原因呢,求解?
Re: reality_jie2014-01-25 23:03发表[回复] [引用][举报]
回复lzc876:我现在手头已经没有打印机可以做测试了,所以抱歉,帮不了你,你只能在我那代码的基础上去扩展了,谢谢
Re: lzc8762014-01-26 14:35发表[回复] [引用][举报]
[reply]reality_jie谢谢!
15楼 nature197219722014-01-22 18:24发表[回复] [引用][举报]
谢谢楼主,灰常详细,系统!顶顶顶顶顶顶顶顶
14楼 c小旭2014-01-13 10:24发表[回复] [引用][举报]
我用的惠普打印机,也出现乱码,换了很多编码方式都不好使啊。
13楼 avoidImpetuous2014-01-07 22:56发表[回复] [引用][举报]
最近也在看蓝牙打印,谢谢楼主,不过我看的是并口和串口的。都是带线的。
12楼 泓豆奶茶2013-12-12 10:32发表[回复] [引用][举报]
按你说的还是成功不了,能加QQ聊吗?qq:1584166172
11楼 zywxsg06122013-12-09 15:42发表[回复] [引用][举报]
LZ 你好 问个问题createRfcommSocketToServiceRecord(uuid)
对于其中的UUID,我直接用生成器生成一个复制过去,在这里是可以用的吗?
还是说uuid有什么特殊的??百度了下 貌似这个识别码生成后就可以用了。。
还有就是后边的打印指令
0x1b, 0x40
1b应该是esc 40是@ ??
刚开始学着写android 很多不是很懂,有些问题 类似USB 啊 打印机 搜出来的都是各种广告,很少和开发有关。。。
Re: reality_jie2013-12-09 16:25发表[回复] [引用][举报]
回复zywxsg0612:uuid没有特殊的,直接用生成器生成一个复制过去可以
Re: zywxsg06122013-12-11 09:59发表[回复] [引用][举报]
回复reality_jie:谢谢。。。
10楼 xingzjx2013-12-06 15:07发表[回复] [引用][举报]
谢谢楼主分享!!!
9楼 qq6241967432013-11-29 17:52发表[回复] [引用][举报]
碉堡了,好文啊
Re: reality_jie2013-11-29 18:09发表[回复] [引用][举报]
回复qq624196743:谢谢^_^o~ 努力!
8楼 csaily5047685272013-11-29 11:07发表[回复] [引用][举报]
楼主你好。我想请问一下,你的那些打印指令还有么。使用你上面的代码打印中文时候会出现乱码。。
Re: reality_jie2013-11-29 11:10发表[回复] [引用][举报]
回复csaily504768527:指令就这些。。但是我在我这里的几台打印机测试都不会出现乱码哦,如果出现乱码,你尝试在里边修改一下
byte[] data = sendData.getBytes("gbk"): 把gbk修改成utf-8
Re: csaily5047685272013-11-29 11:33发表[回复] [引用][举报]
回复reality_jie:楼主。。还是不成功。。我测试的设备是HP 100 便携式蓝牙打印机。。还尝试了。。GB2312 .. BIG5... GBK 。等。都还是乱码。。这怎么搞起。。 好不科学啊。。-_-.......泪崩的节奏中。。
Re: JY_love_jie2014-01-10 10:44发表[回复] [引用][举报]
回复csaily504768527:大哥你的乱码问题解决了吗?我最近也做这个功能,打印机型号和你一样,也乱码,想请教下
Re: reality_jie2013-11-29 14:16发表[回复] [引用][举报]
回复csaily504768527:出现乱码的根本原因是打印机和手机发送的数据的编码不统一。你先去确认一下你的打印机是用什么编码来表示中文的
7楼 蜗蜗牛快跑2013-11-27 20:32发表[回复] [引用][举报]
楼主,您好,我最近也想实现一个蓝牙打印的功能。但是在蓝牙通信的时候遇到了点问题,我的socket在connet这步,一直报错:java.io.IOException: Service discovery failed。我用的UUID跟你是一样的,我目前是想连接其他手机(已开启蓝牙服务)。您知道怎么解决么?
Re: reality_jie2013-11-27 21:12发表[回复] [引用][举报]
回复superbinbin1:这个代码只能用于手机与打印机之间的连接哦
Re: 蜗蜗牛快跑2013-11-27 23:15发表[回复] [引用][举报]
回复reality_jie:这样呀,那手机之间连接。。。用什么UUID?UUID的类型不是根据服务来选的么?因为我很好奇,安卓自带的蓝牙分享功能,几乎是无论对方是什么蓝牙,都可以把文件分享过去,手机之间自然不用说,电脑端的蓝牙适配器也可以传,hp的打印机我也有试过,可以直接发图片过去打印。那么他是如何设计的???楼主大神帮忙解答疑惑呀,感激不尽。
Re: reality_jie2013-11-29 18:11发表[回复] [引用][举报]
回复superbinbin1:亲,这个问题我也有待研究哦
6楼 微扬的嘴角2013-11-07 14:31发表[回复] [引用][举报]
对任意型号蓝牙打印机通用吗?
Re: reality_jie2013-11-07 14:40发表[回复] [引用][举报]
回复feng52101:可以
5楼 bhald68219352013-10-18 11:20发表[回复] [引用][举报]
樓主 能發個源碼麼。謝謝[email protected]
Re: reality_jie2013-10-18 13:42发表[回复] [引用][举报]
回复bhald6821935:http://download.csdn.net/detail/reality_jie/6418413
完整源码
4楼 wang1582108672013-10-12 16:01发表[回复] [引用][举报]
有没有遇到 打不了中文 或者 中文乱码问题呀
Re: csaily5047685272013-11-29 11:37发表[回复] [引用][举报]
回复wang158210867:哥们,你那个乱码问题找到解决办法木有。。或者是思路。。
Re: reality_jie2013-10-12 17:25发表[回复] [引用][举报]
回复wang158210867:我自己做的测试都没有出现中文乱码哦
3楼 zhafei13112013-09-27 15:50发表[回复] [引用][举报]
有没有打印图片的代码
Re: reality_jie2013-09-27 17:38发表[回复] [引用][举报]
回复u012243481:暂时没有
2楼 红姬茄子2013-09-25 14:45发表[回复] [引用][举报]
楼主,我想问下这个android手机连接蓝牙打印能不能指定文件打印呢,譬如说我指定一张图片,或一个文档什么的让打印机打印,这种功能能否实现嘞,求指教,嘿嘿
Re: reality_jie2013-09-25 17:08发表[回复] [引用][举报]
public void send(String sendData) {
if (this.isConnection) {
System.out.println("开始打印!!");
try {
byte[] data = sendData.getBytes("gbk");
outputStream.write(data, 0, data.length);
outputStream.flush();
} catch (IOException e) {
Toast.makeText(this.context, "发送失败!", Toast.LENGTH_SHORT)
.show();
}
} else {
Toast.makeText(this.context, "设备未连接,请重新连接!", Toast.LENGTH_SHORT)
.show();

}
从这个打印方法可以看出,打印的数据是以二进制流发送出去的。也就是说,如果你想打印外部文档,只要用一个输入流,比如BufferedReader把数据读入再转成二进制流交给outputStream,应该是能实现的。至于图片。。。暂时我就不知道怎么弄了
1楼 红姬茄子2013-09-24 17:04发表[回复] [引用][举报]
不错不错,多谢楼主分享,学习了,赞一个
Re: reality_jie2013-09-24 17:31发表[回复] [引用][举报]
Y(^_^)Y


你可能感兴趣的:(android)