蓝牙

蓝牙,是一种支持设备短距离通信(一般10m内,且无阻隔媒介)的无线电技术。能在包括移动电话、PDA、无线耳机、笔记本电脑等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效的简化移动通信终端设备之间的通信,也能够成功的简化设备与Internet之间的通信,这样数据传输变得更加迅速高效,为无线通信拓宽道路。

注意:Android 2.0 引入蓝牙接口,在开发时,需要真机测试,如果需要数据传输,还需要两台机器,另外蓝牙下哟硬件支持。
权限设置

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
package com.example.bluetooth;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.util.Set;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    //打开蓝牙设备
    public void openBlueToothClick(View v){

        //第一种方法,打开蓝牙设备(提示对话框)
        Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
        startActivity(discoverableIntent);

        //第二种方法,打开蓝牙,静默打开
//        BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
//        bluetoothAdapter.enable();

    }
    public void closeBlueToothClick(View v){
        //关闭蓝牙设备
        BluetoothAdapter bluetoothAdapter1=BluetoothAdapter.getDefaultAdapter();
        bluetoothAdapter1.disable();

    }
    public void scanClick(View v){
        //开始扫描蓝牙设备
        BluetoothAdapter bluetoothAdapter2=BluetoothAdapter.getDefaultAdapter();
        bluetoothAdapter2.startDiscovery();
        Set<BluetoothDevice> set=bluetoothAdapter2.getBondedDevices();
        for (BluetoothDevice bd : set)
        {
            System.out.println("name"+bd.getName());
            System.out.println("address"+bd.getAddress());

        }
    }
}

android BluetoothDevice是否被连接 安卓bluedroid是什么设备_android


android BluetoothDevice是否被连接 安卓bluedroid是什么设备_Text_02


android BluetoothDevice是否被连接 安卓bluedroid是什么设备_Text_03


android BluetoothDevice是否被连接 安卓bluedroid是什么设备_Text_04


android BluetoothDevice是否被连接 安卓bluedroid是什么设备_Text_05


ServerBluetoothActivity

package com.example.bluetooth;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.lang.ref.WeakReference;
import java.util.UUID;

public class ServerBluetoothActivity extends Activity {
    private static final int CONN_SUCCESS=0x1;
    private static final int CONN_FAIL=0x2;
    private static final int RECEIVER_INFO=0x3;
    private static final int SET_EDITTEXT_NULL=0x4;
    private static Button button_send;
    private static TextView textView_content;
    private static EditText editText_info;

    BluetoothAdapter bluetooth=null;//本地蓝牙设备
    BluetoothServerSocket serverSocket=null;//蓝牙设备Socket服务端
    BluetoothSocket socket=null;//蓝牙设备Socket客户端

    //输入输出流
    PrintStream out;
    BufferedReader in;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_server_bluetooth);
        setTitle("蓝牙服务端");
        textView_content= (TextView) findViewById(R.id.textView_content);
        editText_info= (EditText) findViewById(R.id.editText_info);
        button_send= (Button) findViewById(R.id.button_send);
        init();
    }
    //创建蓝牙服务器端的Socket
    private void init() {
        textView_content.setText("服务器已启动,正在等待连接...\n");
        new Thread(new Runnable() {
            @Override
            public void run() {
                //1.得到本地设备
                bluetooth=BluetoothAdapter.getDefaultAdapter();
                //2.创建蓝牙Socket服务器
                try
                {
                    serverSocket=bluetooth.listenUsingRfcommWithServiceRecord("text", UUID.fromString("00000000-2527-eef3-ffff-ffffe3160865"));
                    //3.阻塞等待Socket客户端请求
                    socket=serverSocket.accept();
                    if (socket!=null)
                    {
                        out=new PrintStream(socket.getOutputStream());
                        in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    }
                    handler.sendEmptyMessage(CONN_SUCCESS);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                    Message msg=handler.obtainMessage(CONN_FAIL,e.getLocalizedMessage());
                    handler.sendMessage(msg);
                }

            }
        }).start();

    }

    //防止内存泄漏 正确的使用方法
    private final MyHandler handler = new MyHandler(this);

    public  class MyHandler extends Handler {
        //软引用
        WeakReference<ServerBluetoothActivity> weakReference;

        public MyHandler(ServerBluetoothActivity activity) {
            weakReference = new WeakReference<ServerBluetoothActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ServerBluetoothActivity activity = weakReference.get();
            if (activity != null) {
                switch (msg.what) {
                    case RECEIVER_INFO:
                        setInfo(msg.obj.toString() + "\n");
                        break;
                    case SET_EDITTEXT_NULL:
                        editText_info.setText("");
                        break;
                    case CONN_SUCCESS:
                        setInfo("连接成功!\n");
                        button_send.setEnabled(true);
                        new Thread(new ReceiverInfoThread()).start();
                        break;
                    case CONN_FAIL:
                        setInfo("连接失败!\n");
                        setInfo(msg.obj.toString() + "\n");
                        break;
                    default:
                        break;
                }
            }
        }
    }
    private boolean isReceiver=true;
    class ReceiverInfoThread implements Runnable {
        @Override
        public void run() {
            String info=null;
            while (isReceiver)
            {
                try {
                    info=in.readLine();
                    Message msg=handler.obtainMessage(RECEIVER_INFO,info);
                    handler.sendMessage(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void sendClick(View v)
    {
        final String content=editText_info.getText().toString();
        if (TextUtils.isEmpty(content))
        {
            Toast.makeText(ServerBluetoothActivity.this,"不能发送空消息",Toast.LENGTH_LONG).show();
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                out.println(content);
                out.flush();
                handler.sendEmptyMessage(SET_EDITTEXT_NULL);
            }
        }).start();
    }
    private void setInfo(String info)
    {
        StringBuffer sb=new StringBuffer();
        sb.append(textView_content.getText());
        sb.append(info);
        textView_content.setText(sb);
    }

}

ClientBluetoothActivity

package com.example.bluetooth;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.lang.ref.WeakReference;
import java.util.UUID;

public class ClientBluetoothActivity extends Activity {
    private static final int CONN_SUCCESS=0x1;
    private static final int CONN_FAIL=0x2;
    private static final int RECEIVER_INFO=0x3;
    private static final int SET_EDITTEXT_NULL=0x4;
    private static Button button_send;
    private static TextView textView_content;
    private static EditText editText_info;

    BluetoothAdapter bluetooth=null;//本地蓝牙设备
    BluetoothDevice device=null;//远程蓝牙设备
    BluetoothSocket socket=null;//蓝牙设备Socket客户端

    //输入输出流
    PrintStream out;
    BufferedReader in;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client_bluetooth);
        setTitle("蓝牙客户端");
        textView_content= (TextView) findViewById(R.id.textView_content);
        editText_info= (EditText) findViewById(R.id.editText_info);
        button_send= (Button) findViewById(R.id.button_send);
        init();
    }
    //创建蓝牙客户端端的Socket
    private void init() {
        textView_content.setText("客户端已启动,正在等待连接...\n");
        new Thread(new Runnable() {
            @Override
            public void run() {
                //1.得到本地蓝牙设备的默认适配器
                bluetooth=BluetoothAdapter.getDefaultAdapter();
                //2.通过本地蓝牙设备得到远程蓝牙设备
                device=bluetooth.getRemoteDevice("22:22:4E:6E:59:86");
                //3.根据UUID创建并返回一个BoluetoothSocket
                try {
                    socket=device.createRfcommSocketToServiceRecord(UUID.fromString("00000000-2527-eef3-ffff-ffffe3160865"));
                    if (socket!=null)
                    {
                        // 连接
                        socket.connect();
                        //处理客户端输出流
                        out=new PrintStream(socket.getOutputStream());
                        in=new BufferedReader(new InputStreamReader(socket.getInputStream()));

                    }
                    handler.sendEmptyMessage(CONN_SUCCESS);
                } catch (IOException e) {
                    e.printStackTrace();
                    Message msg=handler.obtainMessage(CONN_FAIL,e.getLocalizedMessage());
                    handler.sendMessage(msg);

                }

            }
        }).start();
    }

    //防止内存泄漏 正确的使用方法
    private final MyHandler handler = new MyHandler(this);

    public  class MyHandler extends Handler {
        //软引用
        WeakReference<ClientBluetoothActivity> weakReference;

        public MyHandler(ClientBluetoothActivity activity) {
            weakReference = new WeakReference<ClientBluetoothActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ClientBluetoothActivity activity = weakReference.get();
            if (activity != null) {
                switch (msg.what) {
                    case RECEIVER_INFO:
                        setInfo(msg.obj.toString() + "\n");
                        break;
                    case SET_EDITTEXT_NULL:
                        editText_info.setText("");
                        break;
                    case CONN_SUCCESS:
                        setInfo("连接成功!\n");
                        button_send.setEnabled(true);
                        System.out.println("name"+device.getName());
                        System.out.println("Uuids"+device.getUuids());
                        System.out.println("Address"+device.getAddress());
                        new Thread(new ReceiverInfoThread()).start();
                        break;
                    case CONN_FAIL:
                        setInfo("连接失败!\n");
                        setInfo(msg.obj.toString() + "\n");
                        break;
                    default:
                        break;
                }
            }
        }
    }


    private boolean isReceiver=true;
    //接收信息的线程
    class ReceiverInfoThread implements Runnable {
        @Override
        public void run() {
            String info=null;
            while (isReceiver)
            {
                try {
                    System.out.println("--ReceiverInfoThread start --");
                    info=in.readLine();
                    System.out.println("--ReceiverInfoThread read --");
                    Message msg=handler.obtainMessage(RECEIVER_INFO,info);
                    handler.sendMessage(msg);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    public void sendClick(View v)
    {
        final String content=editText_info.getText().toString();
        if (TextUtils.isEmpty(content))
        {
            Toast.makeText(ClientBluetoothActivity.this,"不能发送空消息",Toast.LENGTH_LONG).show();
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                out.println(content);
                out.flush();
                handler.sendEmptyMessage(SET_EDITTEXT_NULL);
            }
        }).start();
    }
    private void setInfo(String info)
    {
        StringBuffer sb=new StringBuffer();
        sb.append(textView_content.getText());
        sb.append(info);
        textView_content.setText(sb);
    }
}

activity_client_bluetooth.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ClientBluetoothActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text=""
        android:id="@+id/textView_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/editText_info"
        android:layout_below="@+id/textView" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText_info"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_toLeftOf="@+id/button_send"
        android:layout_toStartOf="@+id/button_send" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="send"
        android:id="@+id/button_send"
        android:onClick="sendClick"
        android:layout_alignBottom="@+id/editText_info"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="客户端"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

activity_server_bluetooth.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ServerBluetoothActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text=""
        android:id="@+id/textView_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/editText_info"
        android:layout_below="@+id/textView" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText_info"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_toLeftOf="@+id/button_send"
        android:layout_toStartOf="@+id/button_send" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="send"
        android:id="@+id/button_send"
        android:onClick="sendClick"
        android:layout_alignBottom="@+id/editText_info"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="服务器端"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

MainActivity

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.Set;

public class MainActivity extends Activity implements View.OnClickListener {
    private Button open, close, button_scan, button_server, button_client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        open = (Button) findViewById(R.id.open);
        close = (Button) findViewById(R.id.close);
        button_scan = (Button) findViewById(R.id.button_scan);
        button_server = (Button) findViewById(R.id.button_server);
        button_client = (Button) findViewById(R.id.button_client);

        open.setOnClickListener(this);
        close.setOnClickListener(this);
        button_scan.setOnClickListener(this);
        button_server.setOnClickListener(this);
        button_client.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.open:
                //第一种方法,打开蓝牙设备(提示对话框)
               /* Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
                startActivity(discoverableIntent);*/

                //第二种方法,打开蓝牙,静默打开
                BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
                bluetoothAdapter.enable();
                break;
            case R.id.close:
                BluetoothAdapter bluetoothAdapter1 = BluetoothAdapter.getDefaultAdapter();
                bluetoothAdapter1.disable();
                break;
            case R.id.button_scan:
                //开始扫描蓝牙设备
                BluetoothAdapter bluetoothAdapter2 = BluetoothAdapter.getDefaultAdapter();
                bluetoothAdapter2.startDiscovery();
                System.out.println("开始扫描蓝牙设备");
                Set<BluetoothDevice> set = bluetoothAdapter2.getBondedDevices();
                for (BluetoothDevice bd : set) {
                    System.out.println("name" + bd.getName());
                    System.out.println("address" + bd.getAddress());

                }
                break;
            case R.id.button_server:
                Intent intent = new Intent(this, ServerBluetoothActivity.class);
                startActivity(intent);
                break;
            case R.id.button_client:
                Intent intent1 = new Intent(this, ClientBluetoothActivity.class);
                startActivity(intent1);
                break;
            default:
                break;

        }
    }
}

android BluetoothDevice是否被连接 安卓bluedroid是什么设备_java_06


android BluetoothDevice是否被连接 安卓bluedroid是什么设备_Text_07


android BluetoothDevice是否被连接 安卓bluedroid是什么设备_蓝牙_08