蓝牙

蓝牙

无论客户端还是服务端,权限以及通讯规范都是必须的

必要权限

       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);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值