zoukankan      html  css  js  c++  java
  • 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();
                }
            }
        }
    }
  • 相关阅读:
    linux之awk命令
    HDU 2097 Sky数 进制转换
    HDU 2077 汉诺塔IV
    HDU 2094 产生冠军 dfs加map容器
    HDU 2073 叠框
    HDU 2083 简易版之最短距离
    HDU 2063 过山车 二分匹配
    天梯 1014 装箱问题
    天梯 1214 线段覆盖
    天梯 1098 均分纸牌
  • 原文地址:https://www.cnblogs.com/wbp0818/p/5320320.html
Copyright © 2011-2022 走看看