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();
                }
            }
        }
    }
  • 相关阅读:
    Python发邮件的小脚本
    收集服务器网卡和IP信息
    Parent Proxy 和 Origin Server配置学习
    ATS 自定义日志格式
    css之选择器篇
    css之入门篇
    javascript必须懂之冒泡事件
    HTML5之语义化标签
    HTML之总结
    随堂笔记之正则与HTML5新元素
  • 原文地址:https://www.cnblogs.com/wbp0818/p/5320320.html
Copyright © 2011-2022 走看看