Day6:蓝牙
一.蓝牙介绍:
二.蓝牙的作用:
三 .蓝牙工作原理以及涉及到的类:
四.代码
服务端线程
一.蓝牙介绍:
是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换
添加权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android .permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
打开蓝牙并设置允许被搜索
/**
* 开启蓝牙
*/
public void open(){
Intent intent=new Intent();
intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);//开始蓝牙
intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//允许蓝牙被搜索
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,200);//设置允许被搜索时间200s内可以被搜索到
startActivityForResult(intent,100);
}
关闭蓝牙
/**
* 关闭蓝牙
*/
public void close(){
adapter.disable();//强制关闭蓝牙
}
获得已经配对的蓝牙设备:
/**
* 获取配对的消息
*/
private void taken() {
adapter.getBondedDevices();
}
搜索附近的蓝牙
/**
* 搜索蓝牙
*/
public void search(){
adapter.startDiscovery();//开始扫描
}
显示已经搜索到的蓝牙设备 注册广播 定义广播接收者
/**
* 动态获取权限
* 判断是不是6.0 requestPermissions(String[])
*/
public void init(){
String[] string = new String[]{Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION};
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
requestPermissions(string,100);
}
initMyBlueTooth();
//注册广播接收者
myReceiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);//注册搜索的广播
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//结束搜索
registerReceiver(myReceiver,filter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
BluetoothDevice device=devices.get(position);
device.createBond();//绑定蓝牙
}
});
}
/**
* 蓝牙管理者
*/
public void initMyBlueTooth(){
BluetoothManager manager= (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
adapter=manager.getAdapter();//获得自己的牙
}
class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//收其搜索到的牙
if(intent.getAction().equals(BluetoothDevice.ACTION_FOUND)){
BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// String name = device.getName();
// Log.i("TAG", "onReceive: "+name);
devices.add(device);
// myAdapter.notifyDataSetChanged();
}else if(intent.getAction().equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)){
//更新适配器,将所有的蓝牙设备显示到界面上
myAdapter=new MyAdapter(MainActivity.this,devices);
listView.setAdapter(myAdapter);
// myAdapter.notifyDataSetChanged();
}else if(intent.getAction().equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)){
BluetoothDevice device2 = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
int state=device2.getBondState();
switch (state){
case BluetoothDevice.BOND_BONDED:
//发送文件
new ClienThrad().start();
break;
}
}
}
}
MainActivity的完整代码
package com.example.lanya;
import android.Manifest;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Environment;
import android.os.Parcelable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button open;
private Button close;
private Button take;
private Button search;
private ListView listView;
private MyAdapter myAdapter;
BluetoothAdapter adapter;
MyReceiver myReceiver;
BluetoothDevice device2;
private ArrayList<BluetoothDevice> devices=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
open = findViewById(R.id.open);
close = findViewById(R.id.close);
take = findViewById(R.id.take);
search = findViewById(R.id.search);
listView=findViewById(R.id.list);
init();
// //开启蓝牙
// open.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
//
//
// }
// });
// //关闭蓝牙
// close.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
// bluetoothAdapter.disable();//强制关闭蓝牙
// }
// });
// take.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// }
// });
// search.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
//
// }
// });
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.open){
open();
}
if(v.getId()==R.id.close){
close();
}
if(v.getId()==R.id.search){
search();
}
if(v.getId()==R.id.take){
taken();
}
}
/**
* 获取配对的消息
*/
private void taken() {
adapter.getBondedDevices();
}
/**
* 开启蓝牙
*/
public void open(){
Intent intent=new Intent();
intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);//开始蓝牙
intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//允许蓝牙被搜索
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,200);//设置允许被搜索时间200s内可以被搜索到
startActivityForResult(intent,100);
}
/**
* 关闭蓝牙
*/
public void close(){
adapter.disable();//强制关闭蓝牙
}
/**
* 搜索蓝牙
*/
public void search(){
adapter.startDiscovery();//开始扫描
}
/**
* 动态获取权限
* 判断是不是6.0 requestPermissions(String[])
*/
public void init(){
String[] string = new String[]{Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION};
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
requestPermissions(string,100);
}
initMyBlueTooth();
//注册广播接收者
myReceiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);//注册搜索的广播
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//结束搜索
registerReceiver(myReceiver,filter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
BluetoothDevice device=devices.get(position);
device.createBond();//绑定蓝牙
}
});
}
/**
* 蓝牙管理者
*/
public void initMyBlueTooth(){
BluetoothManager manager= (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
adapter=manager.getAdapter();//获得自己的牙
}
class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//收其搜索到的牙
if(intent.getAction().equals(BluetoothDevice.ACTION_FOUND)){
BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// String name = device.getName();
// Log.i("TAG", "onReceive: "+name);
devices.add(device);
// myAdapter.notifyDataSetChanged();
}else if(intent.getAction().equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)){
//更新适配器,将所有的蓝牙设备显示到界面上
myAdapter=new MyAdapter(MainActivity.this,devices);
listView.setAdapter(myAdapter);
// myAdapter.notifyDataSetChanged();
}else if(intent.getAction().equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)){
BluetoothDevice device2 = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
int state=device2.getBondState();
switch (state){
case BluetoothDevice.BOND_BONDED:
//发送文件
new ClienThrad().start();
break;
}
}
}
}
class ClienThrad extends Thread{
@Override
public void run() {
super.run();
UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");
try {
BluetoothSocket socket=device2.createRfcommSocketToServiceRecord(uuid);
socket.connect();
OutputStream outputStream = socket.getOutputStream();
FileInputStream inputStream = new FileInputStream(Environment.getExternalStorageDirectory() + "http.txt");
byte[] bytes = new byte[1024];
int len=0;
while ((len = inputStream.read(bytes)) != -1) {
outputStream.write(bytes,0,len);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void receveFromServer(BluetoothSocket socket) {
try {
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = 0;
FileOutputStream outputStream = new FileOutputStream(Environment.getExternalStorageDirectory().getPath());
while ((len = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//服务器
public void createServerSocket(){
UUID uuid = UUID.fromString("");
try {
BluetoothServerSocket serverSocket = adapter.listenUsingInsecureRfcommWithServiceRecord(adapter.getName(), uuid);
while (true){
BluetoothSocket socket = serverSocket.accept();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
技能效果: