客户端
package com.example.app_bluetoothclient;
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.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.example.app_bluetoothclient.adapter.MyAdapter;
import com.example.app_bluetoothclient.listener.MyClickListener;
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 {
private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");
private Button btDiscovery;
private RecyclerView rvDoscovery;
private Button btBond;
private RecyclerView rvBond;
private List<BluetoothDevice> devices_find=new ArrayList<>();
private List<BluetoothDevice> devices_show=new ArrayList<>();
private BluetoothManager manager;
private BluetoothAdapter bluetoothAdapter;
private MyAdapter myAdapter_find;
private MyAdapter myAdapter_show;
private MyReciver myReciver;
public static BluetoothSocket socket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.BLUETOOTH,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
}
openBlueTooth();
initRegister();
initView();
}
private void initRegister() {
myReciver=new MyReciver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
registerReceiver(myReciver,intentFilter);
}
private void initData() {
myAdapter_find=new MyAdapter(this,devices_find);
myAdapter_show=new MyAdapter(this,devices_show);
rvDoscovery.setAdapter(myAdapter_find);
rvBond.setAdapter(myAdapter_show);
}
private void initBlueTooth() {
manager= (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
bluetoothAdapter=manager.getAdapter();
}
private void openBlueTooth() {
Intent intent=new Intent();
intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
startActivity(intent);
}
private void initView() {
btDiscovery = (Button) findViewById(R.id.bt_discovery);
rvDoscovery = (RecyclerView) findViewById(R.id.rv_doscovery);
btBond = (Button) findViewById(R.id.bt_bond);
rvBond = (RecyclerView) findViewById(R.id.rv_bond);
rvBond.setLayoutManager(new LinearLayoutManager(this));
rvDoscovery.setLayoutManager(new LinearLayoutManager(MainActivity.this));
initData();
initBlueTooth();
btDiscovery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
find();
}
});
btBond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
already();
}
});
myAdapter_find.setMyClickListener(new MyClickListener() {
@Override
public void onItemClick(int position) {
BluetoothDevice device = devices_find.get(position);
device.createBond();
}
});
myAdapter_show.setMyClickListener(new MyClickListener() {
@Override
public void onItemClick(final int position) {
new Thread(new Runnable() {
@Override
public void run() {
BluetoothDevice device = devices_show.get(position);
try {
socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
socket.connect();
if (socket.isConnected()){
Log.i("TAG", "run: 连接成功");
Intent intent=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
}else {
Log.i("TAG", "run: 连接失败");
}
} catch (IOException e) {
Log.i("TAG", "run: 连接失败");
}
}
}).start();
}
});
}
private void find() {
devices_find.clear();
bluetoothAdapter.startDiscovery();
}
private void already() {
devices_show.clear();
Set<BluetoothDevice> devices = bluetoothAdapter.getBondedDevices();
devices_show.addAll(devices);
Toast.makeText(this, ""+devices.size(), Toast.LENGTH_SHORT).show();
myAdapter_show.notifyDataSetChanged();
}
public class MyReciver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(BluetoothDevice.ACTION_FOUND)){
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
devices_find.add(device);
myAdapter_find.notifyDataSetChanged();
Toast.makeText(MainActivity.this, ""+device.toString(), Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReciver);
}
}
线程
package com.example.app_bluetoothclient;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
public class Main2Activity extends AppCompatActivity {
private EditText et;
private Button btSend;
private Button btFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initView();
}
private void initView() {
et = (EditText) findViewById(R.id.et);
btSend = (Button) findViewById(R.id.bt_send);
btFile = (Button) findViewById(R.id.bt_file);
btSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = et.getText().toString();
if (TextUtils.isEmpty(message)){
Toast.makeText(Main2Activity.this, "消息框不能为空", Toast.LENGTH_SHORT).show();
return;
}
try {
MainActivity.socket.getOutputStream().write(message.getBytes());
Toast.makeText(Main2Activity.this, "发送成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
});
btFile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
FileInputStream fileInputStream = new FileInputStream("/storage/sdcard0/DCIM/like20.png");
OutputStream outputStream = MainActivity.socket.getOutputStream();
byte[]bytes=new byte[1024];
int len=0;
while ((len=fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
});
}
}
listener
public interface MyClickListener {
void onItemClick(int position);
}
public interface MyLongClickListener {
void itemLongClick(int position);
}
适配器
package com.example.app_bluetoothclient.adapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.app_bluetoothclient.R;
import com.example.app_bluetoothclient.listener.MyClickListener;
import com.example.app_bluetoothclient.listener.MyLongClickListener;
import java.util.ArrayList;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context context;
private List<BluetoothDevice> list;
private LayoutInflater layoutInflater;
private MyClickListener myClickListener;
private MyLongClickListener myLongClickListener;
public MyAdapter(Context context, List<BluetoothDevice> list) {
this.context = context;
this.list = list;
layoutInflater=LayoutInflater.from(context);
}
public void setMyClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
public void setMyLongClickListener(MyLongClickListener myLongClickListener) {
this.myLongClickListener = myLongClickListener;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View inflate = layoutInflater.inflate(R.layout.item, viewGroup, false);
return new MyViewHolder(inflate);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i) {
myViewHolder.textView.setText(list.get(i).getName());
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myClickListener.onItemClick(i);
}
});
myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
myLongClickListener.itemLongClick(i);
return true;
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
private TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView=itemView.findViewById(R.id.tv);
}
}
}
服务端
package com.example.app_bluetoothservice;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
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.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");
private Button btServer;
private BluetoothManager manager;
private BluetoothAdapter bluetoothAdapter;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==1){
Toast.makeText(MainActivity.this, ""+msg.obj, Toast.LENGTH_SHORT).show();
}
if (msg.what==2){
Toast.makeText(MainActivity.this, ""+msg.obj, Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
}
manager= (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
bluetoothAdapter=manager.getAdapter();
initView();
}
private void initView() {
btServer = (Button) findViewById(R.id.bt_server);
new Thread(new Runnable() {
@Override
public void run() {
try {
BluetoothServerSocket socket = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(bluetoothAdapter.getName(), uuid);
while (true) {
BluetoothSocket accept = socket.accept();
new ServerThread(accept, handler).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
线程
package com.example.app_bluetoothservice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class ServerThread extends Thread {
private static final String TAG = "ServerThread";
private BluetoothSocket socket;
private Handler handler;
public ServerThread(BluetoothSocket socket, Handler handler) {
this.socket = socket;
this.handler = handler;
}
@Override
public void run() {
super.run();
Log.i(TAG, "run:我进门来了 ");
try {
InputStream inputStream = socket.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream("/storage/mogu.jpg");
byte[]bytes=new byte[1024];
int len=0;
while ((len=inputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,len);
Log.i("TAG", "run: "+len);
}
;
} catch (IOException e) {
e.printStackTrace();
}
}
}