蓝牙
无论客户端还是服务端,权限以及通讯规范都是必须的
必要权限
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
通讯规范
private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");//蓝牙通讯规范
客户端
开启蓝牙
///判断蓝牙是否激活
if (!blueToothadapter.isEnabled()) {
// 开启蓝牙
Intent intent = new Intent();
intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 60);
startActivityForResult(intent, 100);
}
发现蓝牙
blueToothadapter.startDiscovery();
获取已连接的蓝牙
list.clear();
//获取链接的蓝牙集合
Set<BluetoothDevice> bondedDevices = blueToothadapter.getBondedDevices();
//将集合添加集合中
list.addAll(bondedDevices);
//更新适配器
adapter.notifyDataSetChanged();
for (BluetoothDevice bondedDevice : bondedDevices) {
Log.i("hq", "onClick: " + bondedDevice.getName());
}
关闭蓝牙
if (blueToothadapter != null) {
//关闭蓝牙
blueToothadapter.disable();
}
蓝牙配对
adapter2.setMyOnclick(new MyOnclick() {
@Override
public void OnClick(int position) {
//接口回调获取点击到的item
BluetoothDevice device = list2.get(position);
//配对蓝牙
device.createBond();
}
});
广播
注册广播
//注册广播
myRecevier = new MyRecevier();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
registerReceiver(myRecevier, intentFilter);
此定义广播
class MyRecevier extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取查找到的蓝牙
if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
list2.add(device);
adapter2.notifyDataSetChanged();
}
}
}
Activity 关闭时注销广播
@Override
protected void onDestroy() {
super.onDestroy();
//注销广播
unregisterReceiver(myRecevier);
}
向服务器发送信息
adapter.setMyOnclick(new MyOnclick() {
@Override
public void OnClick(int position) {
BluetoothDevice device = list.get(position);
//建立链接,链接成功之后发送数据
try {
//创建BlueToothSocket
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
//调用connect建立链接
socket.connect();
//判断链接是否成功
if (socket.isConnected()) {
Toast.makeText(MainActivity.this, "链接成功", Toast.LENGTH_SHORT).show();
socket.getOutputStream().write("http://www.yangdog.com/uploads/allimg/180525/09530W018-0.jpg".getBytes());//发送
//接受结果,如果服务器没有返回结果,客户端会停止运行
// InputStream inputStream = socket.getInputStream();
// byte[] bytes = new byte[1024];
// int len = inputStream.read(bytes);
// String s = new String(bytes, 0, len);
// Toast.makeText(MainActivity.this, "" + s, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "链接失败", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
客户端完整代码
package com.example.bluetooth;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
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.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private Button mOpen;
private Button mClose;
private Button mFind;
private Button mContent;
private RecyclerView mShow;
private RecyclerView mShow1;
BluetoothManager bluetoothManager;
BluetoothAdapter blueToothadapter;
ArrayList<BluetoothDevice> list = new ArrayList<>();
ArrayList<BluetoothDevice> list2 = new ArrayList<>();
Adapter adapter;
Adapter adapter2;
MyRecevier myRecevier;
private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");//蓝牙通讯规范
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mOpen = findViewById(R.id.open);
mClose = findViewById(R.id.close);
mFind = findViewById(R.id.find);
mContent = findViewById(R.id.content);
mShow = findViewById(R.id.show);
mShow1 = findViewById(R.id.show1);
//设置权限
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions(new String[]{
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
}, 100);
}
initBlue();
initRecevier();
initAdapter();
mFind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发现蓝牙
blueToothadapter.startDiscovery();
}
});
mContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.clear();
//获取链接的蓝牙集合
Set<BluetoothDevice> bondedDevices = blueToothadapter.getBondedDevices();
list.addAll(bondedDevices);
adapter.notifyDataSetChanged();
for (BluetoothDevice bondedDevice : bondedDevices) {
Log.i("hq", "onClick: " + bondedDevice.getName());
}
}
});
mOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!blueToothadapter.isEnabled()) {
// 开启蓝牙
Intent intent = new Intent();
intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 60);
startActivityForResult(intent, 100);
}
}
});
mClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (blueToothadapter != null) {
//关闭蓝牙
blueToothadapter.disable();
}
}
});
adapter2.setMyOnclick(new MyOnclick() {
@Override
public void OnClick(int position) {
//接口回调获取点击到的item
BluetoothDevice device = list2.get(position);
//配对蓝牙
device.createBond();
}
});
adapter.setMyOnclick(new MyOnclick() {
@Override
public void OnClick(int position) {
BluetoothDevice device = list.get(position);
//建立链接,链接成功之后发送数据
try {
//创建BlueToothSocket
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
//调用connect建立链接
socket.connect();
//判断链接是否成功
if (socket.isConnected()) {
Toast.makeText(MainActivity.this, "链接成功", Toast.LENGTH_SHORT).show();
socket.getOutputStream().write("http://www.yangdog.com/uploads/allimg/180525/09530W018-0.jpg".getBytes());//发送
//接受结果,如果服务器没有返回结果,客户端会停止运行
// InputStream inputStream = socket.getInputStream();
// byte[] bytes = new byte[1024];
// int len = inputStream.read(bytes);
// String s = new String(bytes, 0, len);
// Toast.makeText(MainActivity.this, "" + s, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "链接失败", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void initAdapter() {
adapter = new Adapter(list, this);
mShow.setLayoutManager(new LinearLayoutManager(this));
mShow.setAdapter(adapter);
adapter2 = new Adapter(list2, this);
mShow1.setLayoutManager(new LinearLayoutManager(this));
mShow1.setAdapter(adapter2);
}
private void initRecevier() {
//注册广播
myRecevier = new MyRecevier();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
registerReceiver(myRecevier, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销广播
unregisterReceiver(myRecevier);
}
private void initBlue() {
//获取蓝牙管理者
bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
//获取蓝牙适配器
blueToothadapter = bluetoothManager.getAdapter();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
class MyRecevier extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取查找到的蓝牙
if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
list2.add(device);
adapter2.notifyDataSetChanged();
}
}
}
}
服务端
完整代码
package com.example.bluetooth_server;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private ImageView mImagePic;
Handler handler = new Handler();
private BluetoothManager bluetoothManager;
private BluetoothAdapter bluetoothAdapter;
private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");//蓝牙通讯规范
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
}, 101);
}
setContentView(R.layout.activity_main);
initView();
bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
server();
}
private void initView() {
mImagePic = findViewById(R.id.image_pic);
}
//启动服务端
private void server() {
new Thread(new Runnable() {
@Override
public void run() {
try {
//BlueToothServerSocket---->blueToothAdapter
BluetoothServerSocket serverSocket = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(bluetoothAdapter.getName(), uuid);
//调用accpet方法接受客户端的链接-->BluetoothSocket
BluetoothSocket socket = serverSocket.accept();//阻塞方法
//接受数据
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
final String s = new String(bytes, 0, len);
handler.post(new Runnable() {
@Override
public void run() {
Log.d("hq", "server:接受数据 " + s);
Glide.with(MainActivity.this).load(s).into(mImagePic);
}
});
//
//返回数据
// String[] s1 = s.split(" ");
// int num1 = Integer.parseInt(s1[0]);
// int num2 = Integer.parseInt(s1[1]);
// socket.getOutputStream().write(((num1 + num2) + "").getBytes());
// Log.d("hq", "server:返回数据 " + num1 + num2);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
适配器
package com.example.bluetooth;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class Adapter extends RecyclerView.Adapter<Adapter.MyHV> {
private ArrayList<BluetoothDevice> list;
private Context context;
private MyOnclick myOnclick;
public MyOnclick getMyOnclick() {
return myOnclick;
}
public void setMyOnclick(MyOnclick myOnclick) {
this.myOnclick = myOnclick;
}
public Adapter(ArrayList<BluetoothDevice> list, Context context) {
this.list = list;
this.context = context;
}
@NonNull
@Override
public MyHV onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(context).inflate(R.layout.item_layout, null);
return new MyHV(inflate);
}
@Override
public void onBindViewHolder(@NonNull MyHV holder, final int position) {
TextView viewById = holder.itemView.findViewById(R.id.title_Str);
viewById.setText(list.get(position).getName());
viewById.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myOnclick.OnClick(position);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
class MyHV extends RecyclerView.ViewHolder {
public MyHV(@NonNull View itemView) {
super(itemView);
itemView.findViewById(R.id.title_Str);
}
}
}