Day1106_蓝牙开关搜索服务客户连接

本文详细介绍了如何使用Android系统进行蓝牙开发,包括蓝牙设备的发现、配对、连接及数据传输过程。通过MainActivity和BlueToothReceiver类,实现了蓝牙设备的搜索、配对列表展示及与已配对设备的数据通信。

笔记

开启蓝牙之后要用广播来获取和填充数据,管理蓝牙的主要2个工具类
BlueToothManager,BlueToothAdapter

代码

MainActivity
package com.example.work;

import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import com.example.work.adapter.BlueAdapter;
import com.example.work.broadcast.BlueToothReceiver;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btOpen;
    private Button btClose;
    private Button btDiscovery;
    private Button btBond;

    private String[] permissions = {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.BLUETOOTH_ADMIN,
            Manifest.permission.BLUETOOTH
    };
    //广播
    private BlueToothReceiver blueToothReceiver;
    //数据源
    private List<BluetoothDevice> discovery_list = new ArrayList<>();
    private List<BluetoothDevice> bond_list = new ArrayList<>();
    //适配器
    private BlueAdapter discoery_adapter;
    private BlueAdapter bond_adapter;

    private int REQUEST_CODE = 100;
    private BluetoothAdapter adapter;
    private BluetoothManager manager;
    private ListView lvFind;
    private ListView lvBond;
    private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");//蓝牙通讯规范
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permissions, REQUEST_CODE);
        }
        initView();
        manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
        adapter = manager.getAdapter();
        blueToothReceiver = new BlueToothReceiver(discovery_list, discoery_adapter,lvFind);
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
        registerReceiver(blueToothReceiver, intentFilter);


        lvFindConnect();
        lvBondConnect();
    }

    private void lvBondConnect() {
        lvBond.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                BluetoothDevice device = bond_list.get(position);
                try {
                    BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
                    socket.connect(); //连接蓝牙
                    if(socket.isConnected()) {
                        OutputStream os = socket.getOutputStream();
                        os.write(("你好呀" + device.getName()).getBytes());
                        os.close();
                    }else{
                        Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                    }
                } catch (IOException e) {
                    Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }

    private void lvFindConnect() {
        lvFind.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "正在配对...", Toast.LENGTH_SHORT).show();
                BluetoothDevice device = discovery_list.get(position);
                device.createBond();
            }
        });
    }

    private void initView() {
        btOpen = findViewById(R.id.bt_open);
        btClose = findViewById(R.id.bt_close);
        btDiscovery = findViewById(R.id.bt_discovery);
        btBond = findViewById(R.id.bt_bond);
        lvFind = findViewById(R.id.lv_find);
        lvBond = findViewById(R.id.lv_bond);

        btOpen.setOnClickListener(this);
        btClose.setOnClickListener(this);
        btDiscovery.setOnClickListener(this);
        btBond.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_open:
                openIt();
                break;

            case R.id.bt_close:
                closeIt();
                break;

            case R.id.bt_discovery:
                discoveryIt();
                break;

            case R.id.bt_bond:
                bondIt();
                break;
        }
    }

    private void bondIt() {
        bond_list.clear();
        Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices();
        bond_list.addAll(bondedDevices);

        bond_adapter = new BlueAdapter(bond_list,this);
        lvBond.setAdapter(bond_adapter);
        bond_adapter.notifyDataSetChanged();
    }

    private void discoveryIt() {
        discovery_list.clear();//清空数据
        adapter.startDiscovery();
    }

    private void closeIt() {
        adapter.disable();//关闭蓝牙
    }

    private void openIt() {
        Toast.makeText(this, "我执行了", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent();
        intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//对外开放 说明可以识别到
        intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE); //可用
        intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 250);//持续时间
        startActivityForResult(intent, 100);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(blueToothReceiver);
    }
}

广播
package com.example.work.broadcast;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Parcelable;
import android.util.Log;
import android.widget.ListView;

import com.example.work.adapter.BlueAdapter;

import java.util.List;

public class BlueToothReceiver extends BroadcastReceiver {

    public BlueToothReceiver(){
    }

    private List<BluetoothDevice> devices;
    private BlueAdapter adapter;
    private ListView lv_find;

    public BlueToothReceiver(List<BluetoothDevice> devices, BlueAdapter adapter, ListView lv_find) {
        this.devices = devices;
        this.adapter = adapter;
        this.lv_find = lv_find;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(BluetoothDevice.ACTION_FOUND)){
            Log.i("---", "onReceive: 我执行了");
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            devices.add(device);
            adapter = new BlueAdapter(devices,context);
            lv_find.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }
    }
}

服务器
package com.example.work;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

public class ServiceActivity extends AppCompatActivity {

    private BluetoothAdapter adapter;
    private BluetoothManager manager;

    private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");//蓝牙通讯规范
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_service);
        initView();
        manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
        adapter = manager.getAdapter();
//
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    BluetoothServerSocket socket = adapter.listenUsingInsecureRfcommWithServiceRecord(adapter.getName(), uuid);
            BluetoothSocket accept = socket.accept();
            accept.connect();
            if (accept.isConnected()) {
                InputStream inputStream = accept.getInputStream();
                byte[] b = new byte[1024];
                int read = inputStream.read(b);
                String str = new String(b, 0, read);
                Toast.makeText(ServiceActivity.this, ""+str, Toast.LENGTH_SHORT).show();
            }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();


    }

    private void initView() {
        imageView = findViewById(R.id.image_view);
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值