android蓝牙技术

配置权限

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

Xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#0f0"
>
<Button
android:id="@+id/check_bluetooth"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="检查蓝牙"
/>
<Button
android:id="@+id/open_bluetooth"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="打开蓝牙"
/>
<Button
android:id="@+id/scan_bluetooth"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="扫描蓝牙"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00f"
>
<EditText
android:id="@+id/msg"
android:layout_width="120dp"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/send"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="发送"
/>

<TextView
android:id="@+id/showmsg1"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:background="#f00" />

</LinearLayout>

<ListView
android:id="@+id/pdbluetooth"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:background="#f00"
/>
<ListView
android:id="@+id/unpdbluetooth"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>

</LinearLayout>

MainActivity

package com.ch.day15_bluetooth;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener{
    public static UUID uuid = UUID.fromString("00001001-0000-1000-8000-00805F9B34FB");
    private Button check,open,scan;
    private EditText msg;
    private Button send;
    private TextView showmsg;
    //蓝牙显示的列表
    private ListView pdbluetooth,unpdbluetooth;
    //蓝牙显示的列表的适配器
    private ArrayAdapter<String> pdAdapter,unpdAdapter;
    
    private BluetoothAdapter bluetoothAdapter;
    private Context mcontext;
    //声明集合,保存配对过的蓝牙,和没有配对过
    private ArrayList<BluetoothDevice> pdbluetoothDevices,unpdbluetoothDevices;
    //定义一个蓝牙的输出流
    OutputStream output;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mcontext = this;
        init();
    }
    //接收其他的蓝牙给本手机发送的信息的线程,传递信息到这个handler,显示在主线程的ui上
    Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            showmsg.setText((String)msg.obj);
        };
    };
    
    public void init(){
        check = (Button) findViewById(R.id.check_bluetooth);
        open = (Button) findViewById(R.id.open_bluetooth);
        scan = (Button) findViewById(R.id.scan_bluetooth);
        //添加单击监听
        check.setOnClickListener(clickLis);
        open.setOnClickListener(clickLis);
        scan.setOnClickListener(clickLis);
        //获得发送信息区域
        msg = (EditText) findViewById(R.id.msg);
        send = (Button) findViewById(R.id.send);
        showmsg = (TextView) findViewById(R.id.showmsg1);
        send.setOnClickListener(clickLis);
        
        //获得listview
        pdbluetooth = (ListView) findViewById(R.id.pdbluetooth);
        unpdbluetooth = (ListView) findViewById(R.id.unpdbluetooth);
        //创建listview的适配器
        pdAdapter = new ArrayAdapter<String>(mcontext, android.R.layout.simple_list_item_1);
        unpdAdapter = new ArrayAdapter<String>(mcontext, android.R.layout.simple_list_item_1);
        //把适配器,添加给Listview
        pdbluetooth.setAdapter(pdAdapter);
        unpdbluetooth.setAdapter(unpdAdapter);
        //给listview添加点击事件
        pdbluetooth.setOnItemClickListener(this);
        unpdbluetooth.setOnItemClickListener(this);
        
        //创建保存蓝牙的集合
        pdbluetoothDevices = new ArrayList<BluetoothDevice>();
        unpdbluetoothDevices = new ArrayList<BluetoothDevice>();
        
        //开启接收蓝牙信息的线程
        new BlueAcceptThread(mcontext, handler).start();
    }
    
    
    OnClickListener clickLis = new OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            //检查蓝牙设置是否有
            case R.id.check_bluetooth:
                //获得蓝牙适配器,没有表示没有蓝牙设备
                bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
                if(bluetoothAdapter != null){
                    Toast.makeText(mcontext, "支持蓝牙!", 0).show();
                }else{
                    Toast.makeText(mcontext, "没有蓝牙设备!", 0).show();
                }
                break;
                
            case R.id.open_bluetooth:
                if(bluetoothAdapter != null){
                    if(!bluetoothAdapter.enable()){//蓝牙设备可不用,未打开
                        bluetoothAdapter.enable();//打开蓝牙
                        
//                        通过启动相关Activity打开
//                        Intent it = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
//                        startActivity(it);
                    }
                    //设置蓝牙可见的时间长度为300秒
                    Intent it = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                    it.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 600);
                    startActivity(it);
                }else{
                    Toast.makeText(mcontext, "检查是否支持蓝牙!", 0).show();
                }
                break;
                
            case R.id.scan_bluetooth:
                pdbluetoothDevices.clear();//清空就得配对蓝牙
                unpdbluetoothDevices.clear();//再一次扫描蓝牙,清空旧的未配对蓝牙列表信息
                pdAdapter.clear();
                unpdAdapter.clear();
                
                if(bluetoothAdapter != null){
                    //如果正在扫描,关闭扫描,重新扫描
                    if(bluetoothAdapter.isDiscovering()){
                        bluetoothAdapter.cancelDiscovery();
                    }
                    
                    //获得已经配对过得蓝牙设备
                    Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
                    if(devices.size() > 0){//有配对的蓝牙
                        
                        //遍历配对过得蓝牙
                        for(BluetoothDevice device:devices){
                            pdbluetoothDevices.add(device);//收集配对的蓝牙
                            pdAdapter.add(device.getName()+"---"+device.getAddress());//把蓝牙的信息给listview的适配器
                        }
                    }
                    //注册接收扫描到蓝牙的广播,从中获得扫描到的蓝牙
                    IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                    registerReceiver(receiver, filter1);
                    //注册扫描完成的广播
                    IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
                    registerReceiver(receiver, filter2);
                    //重新扫描所以蓝牙
                    bluetoothAdapter.startDiscovery();
                    
                }else{
                    Toast.makeText(mcontext, "检查是否支持蓝牙!", 0).show();
                }
                break;
            
            case R.id.send:
                if(output != null){
                    String msgdata = msg.getText().toString();
                    FileInputStream fis = null;
                    try {
                        //发送信息到刚刚连接的蓝牙
                        output.write(msgdata.getBytes());
                        fis = new FileInputStream("/nmt/sdcard/360sicheck.txt");
                        int length = fis.available();
                        byte[] buffer = new byte[length];
                        fis.read(buffer);
                        output.write(buffer);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }finally{
                        try {
                            fis.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }else{
                    Toast.makeText(mcontext, "请先选择一个蓝牙!", 0).show();
                }
                break;
            default:
                break;
            }
            
        }
    };
    
    /**
     * 此广播用来接收扫描到蓝牙的广播
     */
    BroadcastReceiver receiver = new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            //接受扫描到的蓝牙
            String action = intent.getAction();//得到广播的动作(类型)
            if(action.equals(BluetoothDevice.ACTION_FOUND)){//扫描到蓝牙的广播
                //获得扫描到的蓝牙
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                //此蓝牙没有绑定过(配对过)
                if(device.getBondState() != BluetoothDevice.BOND_BONDED){
                    unpdbluetoothDevices.add(device);//收集未绑定的蓝牙
                    unpdAdapter.add(device.getName()+"---"+device.getAddress());//未绑定的蓝牙的listview的适配器
                }
                
            }else if(action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)){
                Toast.makeText(mcontext, "扫描完成!", 0).show();
            }
            
        }
        
    };

 /**
     * lisrview的点击事件监听器
     */
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        switch (parent.getId()) {
        case R.id.pdbluetooth://点击的是配对过的listview
            pairOrConnectionDevice(pdbluetoothDevices.get(position));//操作配对过的蓝牙
            break;
        case R.id.unpdbluetooth://点击的是没有配对过的listview
            pairOrConnectionDevice(unpdbluetoothDevices.get(position));//操作没有配对过的蓝牙
            break;

        default:
            break;
        }
        
    }
    
    /**
     * 此方法负责处理蓝牙,配对或直接连接
     * @param bluetoothDevice
     */
    private void pairOrConnectionDevice(BluetoothDevice bluetoothDevice) {
        int state = bluetoothDevice.getBondState();//获得
        if(state == BluetoothDevice.BOND_NONE){//还没有配对,进行配对
            try {
                //通过反射,设置此蓝牙为绑定状态
                Method method = BluetoothDevice.class.getMethod("createBond");
                method.invoke(bluetoothDevice);
                Toast.makeText(mcontext, bluetoothDevice.getName()+",配对成功!", 0).show();
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(mcontext, bluetoothDevice.getName()+",配对失败!", 0).show();
            }
        }else if(state == BluetoothDevice.BOND_BONDED){//配对过的,进行连接
            new BlueToothConnection(bluetoothDevice).start();
        }
    }
    /**
     * 此线程用于为蓝牙建立连接,发送信息
     * @author hchen
     *
     */
    class BlueToothConnection extends Thread{
        BluetoothDevice device;
        BluetoothSocket bluetoothSocket;
        public BlueToothConnection(BluetoothDevice device) {
            super();
            this.device = device;
        }

        @Override
        public void run() {
            Looper.prepare();//发送信息前的准备
            try {
                //创建此蓝牙的客户端,通过客户端可以向它传递数据
                bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);
                //连接
                System.out.println("000000000000000");
                bluetoothSocket.connect();
                System.out.println("1111111111111111111");
                //创建此蓝牙的具体的输出流
                output = bluetoothSocket.getOutputStream();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Looper.loop();
        }
    }

}

BlueAcceptThread

package com.ch.day15_bluetooth;

import java.io.IOException;
import java.io.InputStream;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Handler;
import android.util.Log;

public class BlueAcceptThread extends Thread{
    private Context mcontext;
    private Handler handler;
    
    private BluetoothAdapter bluetoothAdapter;
    BluetoothServerSocket bluetoothServerSocket;
    BluetoothSocket bluetoothSocket;
    InputStream input;
    public BlueAcceptThread(Context mcontext,Handler handler) {
        super();
        this.mcontext = mcontext;
        this.handler = handler;
        
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    }
    @Override
    public void run() {
        if(bluetoothAdapter != null){
            try {
                //创建本手机的蓝牙的服务器
                bluetoothServerSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("mybluetooth", MainActivity.uuid);
                //接收一个蓝牙客户端
                Log.i("TAG","准备.....接收一个......................");
                bluetoothSocket = bluetoothServerSocket.accept();
                Log.i("TAG","接收了一个......................");
                //得到连接我的那个一方的输入流
                input = bluetoothSocket.getInputStream();
                byte[] buffer = new byte[1024];
                //读取数据,循环多次,因为有多条
                while(true){
                    //读取当前这一条
                    int length = input.read(buffer);
                    String getData = new String(buffer,0,length);
                    Log.i("TAG","接收信息.........."+getData);
                    handler.sendMessage(handler.obtainMessage(0x123, getData));
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
原文地址:https://www.cnblogs.com/1426837364qqcom/p/5199300.html