Android Bluetooth連接收發數據(不包括BLE)


  相關Android藍牙知識直接略過,大家可以上百度搜搜。

此代碼經過項目驗證,完全OK

直接上代碼步驟:

   private BluetoothAdapter adapter;

1.// 獲取藍牙適配器

   adapter = BluetoothAdapter.getDefaultAdapter();

   // 打開藍牙
        if (!adapter.isEnabled()) {
            // 彈出對話框提示用戶選擇是否打開藍牙
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(intent, 0);
            // 或者不做提示,強行打開
            // bAdapter.enable();
        }

2. 獲取藍牙MacAddress

  // 搜索並獲取已經配對藍牙
  nameAddress = getPairedDevice(adapter);//變量自己添加定義

   // 獲取名字列表和地址列表
    if (nameAddress.size() > 0) {
         blueNames = nameAddress.get(0);
          blueAddress = nameAddress.get(1);
    }

  // 獲取方法  此處我把名字和地址分別存放到集合里面,為了方便在ListView里面顯示和其他用途,可以根據自己需要,或只返回地址即可

  private ArrayList<ArrayList<String>> getPairedDevice(BluetoothAdapter adapter) {
        ArrayList<ArrayList<String>> nameAndAddress = new ArrayList<ArrayList<String>>();
       //  pairedDeviceNames = new ArrayList<String>();
        pairedDeviceAddress = new ArrayList<String>();
        Set<BluetoothDevice> pairedDevices = adapter.getBondedDevices();
        if (pairedDevices.size() > 0) {
            // 逐個解析
            for (BluetoothDevice devices : pairedDevices) {
                // 放到集合中
                pairedDeviceNames.add(devices.getName() + "\n"
                        + devices.getAddress());
                pairedDeviceAddress.add(devices.getAddress());
            }
            // 保存信息
            nameAndAddress.add(pairedDeviceNames);
            nameAndAddress.add(pairedDeviceAddress);
        }
        return nameAndAddress;
    }

 3. 通過Address連接藍牙設備

// 連接設備
    device = adapter.getRemoteDevice(address);
    connect(device);

  public synchronized void connect(BluetoothDevice device) {
  
        connectThread = new ConnectThread(device, this, adapter, handler,handlerUpdate);
        connectThread.start();
    }

 4. 連接藍牙線程類

public class ConnectThread extends Thread {

// 此處變量略

public ConnectThread(BluetoothDevice device, BluetoothAdapter mAdapterr) {
        this.mAdapter = mAdapter;
        int sdk = Build.VERSION.SDK_INT;
        if (sdk >= 10) {
            try {
                mySocket = device
                        .createInsecureRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            try {
                mySocket = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    public void run() {
        //
        mAdapter.cancelDiscovery();
        try {
             mySocket.connect();
             // 啟動接收遠程設備發送過來的數據
            connectBluetooth = new ReceiveDatas(mySocket,receiveHandler);
            connectBluetooth.start();
        //輸出流        
            mmOutStream = mySocket.getOutputStream();
        } catch (IOException e) {
            // TODO Auto-generated catch block

            try {
                mySocket.close();
             } catch (IOException ee) {
                // TODO Auto-generated catch block
                ee.printStackTrace();
            }

        }

    }

    // 寫數據
    /* Call this from the main Activity to send data to the remote device */
    public void sendMessage(String msg) {
        byte[] buffer = new byte[16];
        try {
            if (mmOutStream == null) {
                Log.i("info", "輸出流為空");
                return;
            }
            // 寫數據
              buffer = msg.getBytes();
             mmOutStream.write(buffer);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                if (mmOutStream != null) {
                    mmOutStream.flush();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

  5. 讀取數據類

   public class ReceiveDatas extends Thread {
   // 變量 略過

    // 構造方法
      public ReceiveDatas(BluetoothSocket socket) {

        this.mmSocket = socket;
        InputStream tempIn = null;

        // 獲取輸入流
        try {
            tempIn = socket.getInputStream();
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
        mmInStream = tempIn;
    }

    @Override
    public void run() {
        byte[] buffer = new byte[1024];// 緩沖數據流
        int bytes;// 返回讀取到的數據
        // 監聽輸入流
        while (true) {
            try {
                bytes = mmInStream.read(buffer);
               // 此處處理數據……


                } else {
                    Log.i("info", "異常");
                }
            } catch (IOException e) {
                try {
                    if (mmInStream != null) {
                        mmInStream.close();
                    }
                    Log.i("info", "異常");
                    break;
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            try {
                Thread.sleep(50);// 延遲
                 } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM