Android开发蓝牙操作

一、打开蓝牙权限
操作蓝牙之前必须先要注册蓝牙权限。在AndroidManifest.xml文件中注册权限:

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

二、动态申请蓝牙权限
某些android版本中蓝牙权限需要动态申请一次,调用下面的方法:

    private void permission_request(){
    
    
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{
    
    
                Manifest.permission.BLUETOOTH_ADMIN,
                Manifest.permission.BLUETOOTH}, 1);
    }

申请结果会调用下面的回调函数:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
        if (requestCode==1){
    
    
            for (int i=0;i<grantResults.length;i++){
    
    
                if (grantResults[i]!=0){
    
       //权限成功
                    System.exit(0);
                }
            }
        }
    }

三、蓝牙操作
蓝牙操作我直接封装了一个类,可以直接调用:

public class Bluetooth {
    
    
    private static final String TAG="Bluetooth";
    private static BluetoothSocket mmSocket;
    private static BluetoothDevice mmDevice;
    private static final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";

    private static InputStream mmInStream;
    private static OutputStream mmOutStream;

    public Bluetooth(BluetoothDevice device){
    
    
        mmDevice = device;
        BluetoothSocket tmp = null;

        try {
    
    
            tmp = device.createRfcommSocketToServiceRecord(UUID
                    .fromString(SPP_UUID));
        } catch (IOException e) {
    
    
            Log.d(TAG, "create() failed", e);
        }
        mmSocket = tmp;

        new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                // Make a connection to the BluetoothSocket
                try {
    
    
                    // This is a blocking call and will only return on a
                    // successful connection or an exception
                    mmSocket.connect();
                } catch (IOException e) {
    
    

                    Log.e(TAG, "unable to connect() socket", e);
                    // Close the socket
                    try {
    
    
                        mmSocket.close();
                    } catch (IOException e2) {
    
    
                    }
                    return;
                }
                InputStream tmpIn = null;
                OutputStream tmpOut = null;
                // Get the BluetoothSocket input and output streams
                try {
    
    
                    tmpIn = mmSocket.getInputStream();
                    tmpOut = mmSocket.getOutputStream();
                } catch (IOException e) {
    
    
                    Log.e(TAG, "temp sockets not created", e);
                }

                mmInStream = tmpIn;
                mmOutStream = tmpOut;

                new Thread(new Runnable() {
    
    
                    @Override
                    public void run() {
    
    
                        Log.i(TAG, "BEGIN mConnectedThread");
                        byte[] buffer = new byte[256*4];
                        int bytes;
                        StringBuilder stringBuilder = new StringBuilder();
                        // Keep listening to the InputStream while connected
                        while (true) {
    
    
                            try {
    
    
                                // Read from the InputStream
                                if(mmInStream==null)
                                    break;

                                bytes = mmInStream.read(buffer);
                                String str = new String(buffer,0,bytes,"ascii");
                                Log.d("XP",str);
 
                                }


                            } catch (IOException e) {
    
    
                                Log.e(TAG, "disconnected", e);
                                break;
                            }catch (RuntimeException e){
    
    
                                Log.e(TAG, "disconnected", e);
                                break;
                            }
                        }
                    }
                }).start();
            }
        }).start();

    }
    //蓝牙发送数据
    public static void bluetooth_write_data(byte[] buffer) {
    
    
        try {
    
    
            if(mmOutStream!=null)
                mmOutStream.write(buffer);
        } catch (IOException e) {
    
    
            Log.e(TAG, "Exception during write", e);
        }
    }
    //判断蓝牙是否已经连接
    public static Boolean bluetooth_is_connect(){
    
    
        if (mmSocket!=null)
            return true;
        else
            return false;
    }
    //关闭连接
    public static void bluetooth_close_connect() {
    
    
        try {
    
    
            if (mmSocket!=null){
    
    
                mmSocket.close();
                mmSocket=null;
            }
            if(mmInStream!=null){
    
    
                mmInStream.close();
                mmInStream=null;
            }
            if(mmOutStream!=null){
    
    
                mmOutStream.close();
                mmOutStream=null;
            }
            mmDevice=null;
        } catch (IOException e) {
    
    
            Log.e(TAG, "close() of connect socket failed", e);
        }
    }
}

四、蓝牙具体操作流程
1、首先判断蓝牙是否打开,如果没有打开就打开蓝牙

if (!mBluetoothAdapter.isEnabled()) {
    
    
    Intent enableIntent = new Intent(
            BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
    // Otherwise, setup the chat session
}

2.点击按钮开始扫描蓝牙设备

    @Override
    public void onClick(View view) {
    
    
        // If we're already discovering, stop it
        if (mBtAdapter.isDiscovering()) {
    
    
            mBtAdapter.cancelDiscovery();
        }
        // Request discover from BluetoothAdapter
        mBtAdapter.startDiscovery();
    }

3.注册一个监听器获取扫描设备结果

   IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
   myActivity.registerReceiver(mReceiver, filter);
   filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
   myActivity.registerReceiver(mReceiver, filter);
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
    
            String action = intent.getAction();

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

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

                ConnectShowInfo connectShowInfo = new ConnectShowInfo();
                connectShowInfo.blueToothName=device.getName();//获取蓝牙名称
                connectShowInfo.blueToothAddr=device.getAddress();//获取蓝牙地址
                int rssi = intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);//获取额外rssi值
                connectShowInfo.singleStrength = rssi+"dB";
                connectShowInfolist.add(connectShowInfo);
                connectListView.setAdapter(connectShowInfoAdapter);


                // When discovery is finished, change the Activity title
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
    
    
                
            }
        }
    };

4.点击扫描到的设备开始连接

        mBtAdapter.cancelDiscovery();//取消扫描

        address = connectShowInfolist.get(i).blueToothAddr;	//获取点击的地址
        test.get_connect_address(address);//开始连接
    public void get_connect_address(String addr) {
    
    

        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(addr);

        if(bluetooth.bluetooth_is_connect()) {
    
            //蓝牙已经连接
            bluetooth.bluetooth_close_connect();
            bluetooth=null;
        }
        if(bluetooth==null)
            bluetooth = new Bluetooth(device);//调用前面那个类开始连接
    }

猜你喜欢

转载自blog.csdn.net/qq_15181569/article/details/109203372
今日推荐