android 蓝牙打印

1. 首先 构造一个打印的业务类

public class PrintBean {

public static final int PRINT_TYPE =1664;

    //蓝牙-名称

    public Stringname;

    //蓝牙-地址

    public Stringaddress;

    //蓝牙-设备类型

    public int type;

    //蓝牙-是否已经匹配

    public boolean isConnect;

    BluetoothDevicedevice;

    /**

    * @param devicee 蓝牙设备对象

*/

    public PrintBean(BluetoothDevice devicee) {

this.name = TextUtils.isEmpty(devicee.getName()) ?"未知" : devicee.getName();

        this.address = devicee.getAddress();

        this.isConnect = devicee.getBondState() == BluetoothDevice.BOND_BONDED;

        this.type = devicee.getBluetoothClass().getDeviceClass();

    }

public StringgetName() {

return name;

    }

public StringgetAddress() {

return address;

    }

    public int getTypeIcon() {

if (type ==260) {

return R.drawable.ic_computer_black_24dp;

        }else if (type ==PRINT_TYPE) {

return R.drawable.ic_local_printshop_black_24dp;

        }else if (type ==524) {

return R.drawable.ic_phone_android_black_24dp;

        }else {

return R.drawable.ic_issue;

        }

}

public StringgetDeviceType(View view) {

if (type ==PRINT_TYPE) {

view.setSelected(true);

            return isConnect ?"选择打印" :"点击连接";

        }else {

view.setSelected(false);

            return "非打印设备";

        }

}

public int getType() {

return type;

    }

public boolean isConnect() {

return isConnect;

    }

public BluetoothDevicegetDevice() {

return device;

    }

public void setConnect(boolean connect) {

isConnect = connect;

    }

}

2.创建一个Activity类 

public class PrintActivityextends BaseActivity {

private ContextmContext = PrintActivity.this;

    //设备列表

    private ListViewlistView;

    private ArrayListmBluetoothDevicesDatas;

    private PrintAdapteradapter;

    //蓝牙适配器

    private BluetoothAdaptermBluetoothAdapter;

    //请求的code

    public static final int REQUEST_ENABLE_BT =1;

    private SwitchmSwitch;

    private FloatingActionButtonmFloatingActionButton;

    private ProgressBarmProgressBar;

    private TextViewsearchHint;

    private  IntentFilterfilter;

    /**

* 启动打印页面

*

    * @param printContent 要打印的内容

*/

    public static void starUi(Context context, String printContent) {

Intent intent =new Intent(context, PrintActivity.class);

        intent.putExtra("printContent", printContent);

        context.startActivity(intent);

    }

private  StringprintContent;

    private Stringaddress;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_print);

        //广播注册

        filter =new IntentFilter(BluetoothDevice.ACTION_FOUND);

        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

        registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy

//初始化

        android.support.v7.app.ActionBar actionBar = getSupportActionBar();

        if(actionBar !=null){

actionBar.setHomeButtonEnabled(true);

            actionBar.setDisplayHomeAsUpEnabled(true);

        }

setTitle(R.string.select_printing_device);

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        mSwitch = (Switch) findViewById(R.id.switch1);

        mFloatingActionButton = (FloatingActionButton) findViewById(R.id.floatingActionButton);

        mProgressBar = (ProgressBar) findViewById(R.id.progressBar3);

        searchHint = (TextView) findViewById(R.id.searchHint);

        listView = (ListView) findViewById(R.id.listView);

        mBluetoothDevicesDatas =new ArrayList<>();

        printContent=getIntent().getStringExtra("printContent");

        Log.e("content",printContent);

        adapter =new PrintAdapter(this, mBluetoothDevicesDatas, TextUtils.isEmpty(printContent)?"\n 内容为空 \n\n":printContent);

//        adapter = new PrintAdapter(this, mBluetoothDevicesDatas, TextUtils.isEmpty(printContent)?name:printContent);

        listView.setAdapter(adapter);

        chechBluetooth();

        addViewListener();

    }

@Override

    public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()){

case android.R.id.home:

finish();

break;

        }

return true;

    }

/**

* 添加View的监听

*/

    private void addViewListener() {

//蓝牙的状态

        mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

if (isChecked) {

openBluetooth();

                    setViewStatus(true);

                }else {

closeBluetooth();

                }

}

});

        //重新搜索

        mFloatingActionButton.setOnClickListener(new View.OnClickListener() {

@Override

            public void onClick(View v) {

if (mSwitch.isChecked()) {

searchDevices();

                    setViewStatus(true);

                }else {

openBluetooth();

                    setViewStatus(true);

                }

}

});

    }

/**

* 打开蓝牙

*/

    public void openBluetooth() {

Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // 设置蓝牙可见性,最多300秒

        intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 20);

        startActivityForResult(intent, REQUEST_ENABLE_BT);

    }

/**

* 关闭蓝牙

*/

    public void closeBluetooth() {

mBluetoothAdapter.disable();

    }

/**

* 判断有没有开启蓝牙

*/

    private void chechBluetooth() {

//没有开启蓝牙

        if (mBluetoothAdapter !=null) {

if (!mBluetoothAdapter.isEnabled()) {

Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // 设置蓝牙可见性,最多300秒

                intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 20);

                startActivityForResult(intent, REQUEST_ENABLE_BT);

                setViewStatus(true);

                //开启蓝牙

            }else {

searchDevices();

                setViewStatus(true);

                mSwitch.setChecked(true);

            }

}

}

/**

* 搜索状态调整

*

    * @param isSearch 是否开始搜索

*/

    private void setViewStatus(boolean isSearch) {

if (isSearch) {

mFloatingActionButton.setVisibility(View.GONE);

            searchHint.setVisibility(View.VISIBLE);

            mProgressBar.setVisibility(View.VISIBLE);

        }else {

mFloatingActionButton.setVisibility(View.VISIBLE);

            mProgressBar.setVisibility(View.GONE);

            searchHint.setVisibility(View.GONE);

        }

}

@Override

    protected void onDestroy() {

super.onDestroy();

        unregisterReceiver(mReceiver);

    }

/**

* 搜索蓝牙设备

*/

    public void searchDevices() {

mBluetoothDevicesDatas.clear();

        adapter.notifyDataSetChanged();

        //开始搜索蓝牙设备

        mBluetoothAdapter.startDiscovery();

    }

/**

* 通过广播搜索蓝牙设备

*/

    private final BroadcastReceivermReceiver =new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

            // 把搜索的设置添加到集合中

            if (BluetoothDevice.ACTION_FOUND.equals(action)) {

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                //已经匹配的设备

                if (device.getBondState() == BluetoothDevice.BOND_BONDED) {

addBluetoothDevice(device);

                    //没有匹配的设备

                }else {

addBluetoothDevice(device);

                }

adapter.notifyDataSetChanged();

                //搜索完成

            }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {

setViewStatus(false);

            }

}

/**

* 添加数据

        * @param device 蓝牙设置对象

*/

        private void addBluetoothDevice(BluetoothDevice device) {

for (int i =0; i

if (device.getAddress().equals(mBluetoothDevicesDatas.get(i).getAddress())) {

mBluetoothDevicesDatas.remove(i);

                }

}

if (device.getBondState() == BluetoothDevice.BOND_BONDED && device.getBluetoothClass().getDeviceClass() ==PRINT_TYPE) {

mBluetoothDevicesDatas.add(0, new PrintBean(device));

            }else {

mBluetoothDevicesDatas.add(new PrintBean(device));

            }

}

};

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

        if (resultCode ==RESULT_OK && requestCode ==REQUEST_ENABLE_BT) {

Log.e("text", "开启蓝牙");

            searchDevices();

            mSwitch.setChecked(true);

            mBluetoothDevicesDatas.clear();

            adapter.notifyDataSetChanged();

        }else if (resultCode ==RESULT_CANCELED && requestCode ==REQUEST_ENABLE_BT) {

Log.e("text", "没有开启蓝牙");

            mSwitch.setChecked(false);

            setViewStatus(false);

        }

}

}

3. 适配器


public class PrintAdapterextends BaseAdapter {

private ArrayListmBluetoothDevicesDatas;

    private ContextmContext;

    //蓝牙适配器

    private BluetoothAdaptermBluetoothAdapter;

    //蓝牙socket对象

    private BluetoothSocketmmSocket;

    private UUIDuuid;

    //打印的输出流

    private static OutputStreamoutputStream =null;

    //搜索弹窗提示

    ProgressDialogprogressDialog =null;

    private final int exceptionCod =100;

    //打印的内容

    private StringmPrintContent;

    private  ConnectThreadconnectThread;

    //在打印异常时更新ui

    Handlerhandler =new Handler() {

@Override

        public void handleMessage(Message msg) {

super.handleMessage(msg);

            if (msg.what ==exceptionCod) {

Toast.makeText(mContext, "打印发送失败,请稍后再试", Toast.LENGTH_SHORT).show();

                if (progressDialog !=null) {

progressDialog.dismiss();

                }

}

}

};

    /**

    * @param context                上下文

    * @param mBluetoothDevicesDatas 设备列表

    * @param printContent          打印的内容

*/

    public PrintAdapter(Context context, ArrayList mBluetoothDevicesDatas, String printContent) {

this.mBluetoothDevicesDatas = mBluetoothDevicesDatas;

        mContext = context;

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        mPrintContent = printContent;

        uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

    }

public int getCount() {

return mBluetoothDevicesDatas.size();

    }

@Override

    public ObjectgetItem(int position) {

return position;

    }

@Override

    public long getItemId(int position) {

return position;

    }

@Override

    public ViewgetView(final int position, View convertView, ViewGroup parent) {

convertView = LayoutInflater.from(mContext).inflate(R.layout.bluetooth_itme, null);

        View icon = convertView.findViewById(R.id.icon);

        TextView name = (TextView) convertView.findViewById(R.id.name);

        TextView address = (TextView) convertView.findViewById(R.id.address);

        TextView start = (TextView) convertView.findViewById(R.id.start);

        final PrintBean dataBean =mBluetoothDevicesDatas.get(position);

        icon.setBackgroundResource(dataBean.getTypeIcon());

        name.setText(dataBean.name);

        address.setText(dataBean.isConnect ?"已连接" :"未连接");

        start.setText(dataBean.getDeviceType(start));

        //点击连接与打印

        convertView.setOnClickListener(new View.OnClickListener() {

@Override

            public void onClick(View v) {

try {

//如果已经连接并且是打印机

                    if (dataBean.isConnect &&dataBean.getType() ==PRINT_TYPE) {

if (mBluetoothAdapter.isEnabled()) {

if (connectThread !=null){

try {

mmSocket.close();

                                }catch (IOException e) {

e.printStackTrace();

                                }

connectThread=null;

                            }

connectThread =new ConnectThread(mBluetoothAdapter.getRemoteDevice(dataBean.address));

                            connectThread.start();

                            Log.e("address",dataBean.address);

                            progressDialog = ProgressDialog.show(mContext, "提示", "正在打印...", true);

                        }else {

Toast.makeText(mContext, "蓝牙没有打开", Toast.LENGTH_SHORT).show();

                        }

//没有连接

                    }else {

//是打印机

                        if (dataBean.getType() ==PRINT_TYPE) {

setConnect(mBluetoothAdapter.getRemoteDevice(dataBean.address), position);

                            //不是打印机

                        }else {

Toast.makeText(mContext, "该设备不是打印机", Toast.LENGTH_SHORT).show();

                        }

}

}catch (Exception e) {

e.printStackTrace();

                }

}

});

        return convertView;

    }

/**

* 匹配设备

*

    * @param device 设备

*/

    private void setConnect(BluetoothDevice device, int position) {

try {

Method createBondMethod = BluetoothDevice.class.getMethod("createBond");

            createBondMethod.invoke(device);

            mBluetoothDevicesDatas.get(position).setConnect(true);

            notifyDataSetChanged();

        }catch (Exception e) {

e.printStackTrace();

        }

}

/**

* 发送数据

*/

    public void send(String sendData) {

try {

byte[] data = sendData.getBytes("gbk");

            outputStream.write(data, 0, data.length);

            outputStream.flush();

            outputStream.close();

            progressDialog.dismiss();

            Log.e("打印内容", Arrays.toString(data));

//            ConnectThread.sleep(5000);

          ConnectThread.sleep(1000);

        }catch (IOException e) {

e.printStackTrace();

            Log.e("打印内容", e.getMessage());

            handler.sendEmptyMessage(exceptionCod); // 向Handler发送消息,更新UI

        }catch (InterruptedException e) {

e.printStackTrace();

        }

}

/**

* 连接为客户端

*/

    private class ConnectThreadextends Thread {

public ConnectThread(BluetoothDevice device) {

try {

mmSocket = device.createRfcommSocketToServiceRecord(uuid);

            }catch (IOException e) {

e.printStackTrace();

            }

}

public void run() {

//取消的发现,因为它将减缓连接

            mBluetoothAdapter.cancelDiscovery();

            try {

//连接socket

                mmSocket.connect();

                //连接成功获取输出流

                outputStream =mmSocket.getOutputStream();

                send(mPrintContent);

                Log.e("发送内容",mPrintContent);

            }catch (Exception connectException) {

Log.e("test", "连接失败");

                connectException.printStackTrace();

                //异常时发消息更新UI

                Message msg =new Message();

                msg.what =exceptionCod;

                // 向Handler发送消息,更新UI

                handler.sendMessage(msg);

                try {

mmSocket.close();

                }catch (Exception closeException) {

closeException.printStackTrace();

                }

return;

            }

}

}

}

bluetooth_itme.xml 布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal"

    android:padding="15dp">

        android:id="@+id/icon"

        android:layout_width="15dp"

        android:layout_height="15dp"

        android:layout_gravity="center_vertical"

        android:layout_marginRight="10dp"

        android:background="@mipmap/ic_launcher"

        android:text="名称" />

        android:id="@+id/name"

        android:layout_width="0dp"

        android:layout_height="wrap_content"

        android:layout_weight="2"

        android:text="名称" />

        android:id="@+id/address"

        android:layout_width="0dp"

        android:layout_height="wrap_content"

        android:layout_weight="1"

        android:text="地址" />

        android:id="@+id/start"

        android:layout_width="85dp"

        android:layout_height="wrap_content"

        android:background="@drawable/bg_print"

        android:gravity="center"

        android:padding="5dp"

        android:textSize="14sp"

        android:text="非打印设备"

        android:textColor="@color/select_print_color" />

</LinearLayout>

activity_print.xml布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="@color/colorWhite"

    android:orientation="vertical">

        android:layout_width="match_parent"

        android:layout_height="50dp"

        android:gravity="center"

        android:paddingLeft="15dp"

        android:paddingRight="15dp">

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="蓝牙开关"

            android:textColor="#ff000000"

            android:textSize="14sp" />

        <Switch xmlns:app="http://schemas.android.com/apk/res-auto"

            android:id="@+id/switch1"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_marginLeft="16dp"

            android:layout_marginStart="16dp"

            android:textColor="@color/colorAccent"

            android:textSize="16sp" />

        android:layout_width="match_parent"

        android:layout_height="1dp"

        android:background="#ffcccccc" />

        android:layout_width="match_parent"

        android:layout_height="50dp"

        android:paddingLeft="15dp"

        android:paddingRight="15dp">

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerVertical="true"

            android:text="搜索"

            android:textColor="#ff000000"

            android:textSize="14sp" />

            android:id="@+id/searchHint"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerHorizontal="true"

            android:layout_centerVertical="true"

            android:text="搜索中..."

            android:textColor="#FF4081"

            android:textSize="14sp" />

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_alignParentRight="true"

            android:layout_centerVertical="true">

                android:id="@+id/floatingActionButton"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_gravity="center"

                android:clickable="true"

                app:fabSize="mini"

                app:srcCompat="@drawable/ic_search_black_24dp" />

                android:id="@+id/progressBar3"

                style="?android:attr/progressBarStyle"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_gravity="center" />

        android:layout_width="match_parent"

        android:layout_height="8dp"

        android:background="#ffcccccc" />

        android:id="@+id/listView"

        android:layout_width="match_parent"

        android:layout_height="wrap_content" />


ic_computer_black_24dp.xml drawable文件

<vector xmlns:android="http://schemas.android.com/apk/res/android"

    android:width="24dp"

    android:height="24dp"

    android:viewportHeight="24.0"

    android:viewportWidth="24.0">

        android:fillColor="#FFcccccc"

        android:pathData="M20,18c1.1,0 1.99,-0.9 1.99,-2L22,6c0,-1.1 -0.9,-2 -2,-2H4c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2H0v2h24v-2h-4zM4,6h16v10H4V6z" />

</vector>

ic_local_printshop_black_24dp.xml 文件

<vector xmlns:android="http://schemas.android.com/apk/res/android"

        android:width="24dp"

        android:height="24dp"

        android:viewportWidth="24.0"

        android:viewportHeight="24.0">

        android:fillColor="#FFcccccc"

        android:pathData="M19,8L5,8c-1.66,0 -3,1.34 -3,3v6h4v4h12v-4h4v-6c0,-1.66 -1.34,-3 -3,-3zM16,19L8,19v-5h8v5zM19,12c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM18,3L6,3v4h12L18,3z"/>

</vector>

ic_phone_android_black_24dp.xml 文件

<vector xmlns:android="http://schemas.android.com/apk/res/android"

        android:width="24dp"

        android:height="24dp"

        android:viewportWidth="24.0"

        android:viewportHeight="24.0">

        android:fillColor="#FFcccccc"

        android:pathData="M16,1L8,1C6.34,1 5,2.34 5,4v16c0,1.66 1.34,3 3,3h8c1.66,0 3,-1.34 3,-3L19,4c0,-1.66 -1.34,-3 -3,-3zM14,21h-4v-1h4v1zM17.25,18L6.75,18L6.75,4h10.5v14z"/>

</vector>

ic_issue.xml文件

<vector xmlns:android="http://schemas.android.com/apk/res/android"

    android:width="24dp"

    android:height="24dp"

    android:viewportHeight="1024.0"

    android:viewportWidth="1024.0">

        android:fillColor="#FFcccccc"

        android:pathData="M506.7,135.7c-202.2,0 -366.1,163.9 -366.1,366.1 0,202.2 163.9,366.1 366.1,366.1 202.2,0 366.1,-163.9 366.1,-366.1C872.8,299.6 708.9,135.7 506.7,135.7L506.7,135.7zM504.4,716.2c-21.2,0 -38.5,-16.9 -38.5,-37.7 0,-20.8 17.2,-37.7 38.5,-37.7 21.2,0 38.5,16.9 38.5,37.7C542.9,699.3 525.6,716.2 504.4,716.2L504.4,716.2zM649.5,458.5c-10.6,16.6 -33.1,39.3 -67.6,68 -17.9,14.8 -28.9,26.8 -33.2,35.8 -4.3,9 -6.3,25.2 -5.9,48.5l-76.9,0c-0.2,-11 -0.3,-17.8 -0.3,-20.2 0,-24.9 4.1,-45.4 12.4,-61.4 8.2,-16.1 24.7,-34.2 49.4,-54.2 24.7,-20.1 39.5,-33.2 44.3,-39.5 7.4,-9.8 11.2,-20.7 11.2,-32.5 0,-16.4 -6.6,-30.5 -19.8,-42.2 -13.2,-11.7 -30.9,-17.6 -53.3,-17.6 -21.5,0 -39.5,6.1 -54,18.3 -14.5,12.2 -26.9,39.1 -29.9,55.8 -2.8,15.7 -78.6,22.3 -77.7,-9.5 0.9,-31.9 17.5,-66.5 46,-91.6 28.4,-25.1 65.8,-37.6 112,-37.6 48.6,0 87.3,12.7 116,38.1 28.7,25.4 43.1,55 43.1,88.7C665.3,424.2 660,441.8 649.5,458.5L649.5,458.5zM649.5,458.5" />

</vector>

清单文件中需要的权限

<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

注意:如果你需要连接一次蓝牙后无需在连接 进行打印,需要注意以下代码

private Stringaddress ="";

private BluetoothAdaptermBluetoothAdapter;

private IntentFilterfilter;

private  Stringaction;

private UUIDuuid;

在onCreate 方法中添加

filter =new IntentFilter(BluetoothDevice.ACTION_FOUND);

filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

registerReceiver(mReceiver, filter);

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

mBluetoothAdapter.startDiscovery();

uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");


/**

* 通过广播搜索蓝牙设备

*/

    private ArrayListmBluetoothDevicesDatas =new ArrayList<>();

    private BluetoothSocketmmSocket;

    private static OutputStreamoutputStream =null;

    private final BroadcastReceivermReceiver =new BroadcastReceiver() {

public void onReceive(Context context, Intent intent) {

action = intent.getAction();

            // 把搜索的设置添加到集合中

            if (BluetoothDevice.ACTION_FOUND.equals(action)) {

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                //已经匹配的设备

                if (device.getBondState() == BluetoothDevice.BOND_BONDED) {

addBluetoothDevice(device);

                    address = device.getAddress();

//                    progressDialog = ProgressDialog.show(HistoryAddActivity.this, "提示", "正在打印...", true);

                    Log.e("his address",address);

                    //没有匹配的设备

                }else {

addBluetoothDevice(device);

                }

//搜索完成

            }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {

//                setViewStatus(false);

            }

}

/**

* 添加数据

    * @param device 蓝牙设置对象

*/

    private void addBluetoothDevice(BluetoothDevice device) {

for (int i =0; i

if (device.getAddress().equals(mBluetoothDevicesDatas.get(i).getAddress())) {

mBluetoothDevicesDatas.remove(i);

            }

}

if (device.getBondState() == BluetoothDevice.BOND_BONDED && device.getBluetoothClass().getDeviceClass() ==PRINT_TYPE) {

mBluetoothDevicesDatas.add(0, new PrintBean(device));

        }else {

mBluetoothDevicesDatas.add(new PrintBean(device));

        }

}

};

/**

* 发送数据

*/

    public void send(String datamessage) {

try {

if (mmSocket !=null) {

mmSocket.connect();

                //连接成功获取输出流

            }

outputStream =mmSocket.getOutputStream();

            byte[] data = datamessage.getBytes("GBK");

            outputStream.write(data, 0, data.length);

            outputStream.flush();

//            outputStream.close();

            progressDialog.dismiss();

//            Log.e("打印内容",Arrays.toString(data));

//            ConnectThread.sleep(1000);

        }catch (IOException e) {

e.printStackTrace();

            Log.e("打印内容",e.getMessage());

            handler.sendEmptyMessage(exceptionCod); // 向Handler发送消息,更新UI

        }

}

private class ConnectThreadextends Thread {

Stringdatamessage;

        public ConnectThread(BluetoothDevice device,String datamessages) {

datamessage = datamessages;

            BluetoothSocket tmp =null;

            try {

tmp = device.createRfcommSocketToServiceRecord(uuid);

            }catch (IOException e) {

e.printStackTrace();

            }

mmSocket = tmp;

        }

public void run() {

//取消的发现,因为它将减缓连接

            mBluetoothAdapter.cancelDiscovery();

            try {

send(datamessage);

                Log.e("发送内容",datamessage);

            }catch (Exception connectException) {

Log.e("test", "连接失败");

                connectException.printStackTrace();

                //异常时发消息更新UI

                try {

mmSocket.close();

                }catch (Exception closeException) {

closeException.printStackTrace();

                }

return;

            }

}

}

@Override

    protected void onResume() {

super.onResume();

            if (connectThread !=null){

try {

mmSocket.close();

                }catch (IOException e) {

e.printStackTrace();

                }

connectThread =null;

        }else {

filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

            registerReceiver(mReceiver, filter);

        }

}

@Override

    protected void onDestroy() {

super.onDestroy();

        if (connectThread !=null){

try {

mmSocket.close();

            }catch (IOException e) {

e.printStackTrace();

            }

connectThread=null;

        }

unregisterReceiver(mReceiver);

    }

注意:一定要在activity销毁的时候清空sockt,不然会出现打印信息不完整。

打印功能触发的时候 跟据address 是否为空 判定是否有连接设备,


if (mBluetoothAdapter.isEnabled()){

if (address.equals("")){

PrintActivity.starUi(HistoryItemDetailsActivity.this, print);

    }else {

connectThread =new ConnectThread(mBluetoothAdapter.getRemoteDevice(address),print);

      connectThread.start();

        progressDialog = ProgressDialog.show(HistoryItemDetailsActivity.this, "提示", "正在打印...", true);

    }

}else {

Log.e("text", "没有开启蓝牙");

    PrintActivity.starUi(HistoryItemDetailsActivity.this, print);

}

希望对你有帮助!

推荐阅读更多精彩内容