.蓝牙介绍:
是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换,我们主要掌握这几项技能:
- 添加权限:
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH"/> - 打开蓝牙并设置允许被搜索
- 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); - 关闭蓝牙
- bluetoothAdapter.disable();
- 搜索附近的蓝牙
-
bluetoothAdapter.startDiscovery();//搜索
- 配对蓝牙:
- bluetoothDevice.createBond();//发起配对
- 配对蓝牙:
- bluetoothDevice.createBond();
- 获得已经配对的蓝牙设备:
- adapter.getBondedDevices();
-
private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB"); Button bt_open,bt_close,bt_scan,bt_show; ListView listView,listView2; ArrayList<BluetoothDevice> list=new ArrayList<>(); ArrayList<BluetoothDevice> list2=new ArrayList<>(); MyAdapter myAdapter,myAdapter2; BluetoothAdapter adapter; BluetoothDevice device; BluetoothAdapter adapter1; String[] strings=new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}; MyRecevier myRecevier; @RequiresApi(api = Build.VERSION_CODES.M) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(Build.VERSION.SDK_INT>=23){ if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){ requestPermissions(strings,101); } } initView(); BluetoothManager manager= (BluetoothManager) getSystemService(BLUETOOTH_SERVICE); adapter = manager.getAdapter(); 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 initView() { bt_close=findViewById(R.id.bt_close); bt_open=findViewById(R.id.bt_open); bt_scan=findViewById(R.id.bt_scan); bt_show=findViewById(R.id.bt_show); listView=findViewById(R.id.lv); listView2=findViewById(R.id.lv2); bt_scan.setOnClickListener(this); bt_open.setOnClickListener(this); bt_close.setOnClickListener(this); bt_show.setOnClickListener(this); myAdapter=new MyAdapter(list,MainActivity.this); myAdapter2=new MyAdapter(list2,MainActivity.this); listView.setAdapter(myAdapter); listView2.setAdapter(myAdapter2); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { list.get(position).createBond(); } }); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.bt_open: open(); break; case R.id.bt_close: close(); break; case R.id.bt_scan: search(); break; case R.id.bt_show: show(); break; } } private void show() { list2.clear(); Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices(); list2.addAll(bondedDevices); myAdapter2.notifyDataSetChanged(); } private void search() { list.clear(); adapter.startDiscovery(); } private void close() { adapter.disable(); } 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); startActivity(intent); new Thread(new Runnable() { @Override public void run() { try { BluetoothServerSocket bluetoothServerSocket = adapter.listenUsingInsecureRfcommWithServiceRecord(adapter.getName(), uuid); while(true){ // BluetoothSocket socket = bluetoothServerSocket.accept(); // new ServerThread(socket,MainActivity.this).start(); BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid); socket.connect(); BluetoothServerSocket serverSocket = adapter1.listenUsingRfcommWithServiceRecord(adapter1.getName(),uuid); serverSocket.accept(); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } 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); list.add(device); myAdapter.notifyDataSetChanged(); } } } }
-
package com.example.administrator.myapplication; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; public class MyAdapter extends BaseAdapter { ArrayList<BluetoothDevice> list; Context context; public MyAdapter(ArrayList<BluetoothDevice> list, Context context) { this.list = list; this.context = context; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder=null; if(convertView==null){ convertView= LayoutInflater.from(context).inflate(R.layout.item1,null); viewHolder=new ViewHolder(); viewHolder.tv_name=convertView.findViewById(R.id.tv_name); viewHolder.tv_address=convertView.findViewById(R.id.tv_address); convertView.setTag(viewHolder); }else{ viewHolder= (ViewHolder) convertView.getTag(); } viewHolder.tv_name.setText(list.get(position).getName()); viewHolder.tv_address.setText(list.get(position).getAddress()); return convertView; } class ViewHolder{ TextView tv_name; TextView tv_address; } }
-
package com.example.administrator.myapplication; import android.app.Activity; import android.bluetooth.BluetoothSocket; import android.util.Log; import android.widget.Toast; import java.io.IOException; import java.io.InputStream; public class ServerThread extends Thread { private BluetoothSocket socket; private Activity context; public ServerThread(BluetoothSocket socket, Activity context) { this.socket = socket; this.context = context; } @Override public void run() { super.run(); context.runOnUiThread(new Runnable() { @Override public void run() { Log.d("ytx", "有人要给我发数据: "); Toast.makeText(context, "有人要给我发数据", Toast.LENGTH_SHORT).show(); } }); InputStream inputStream = null; try { inputStream = socket.getInputStream(); byte[] bytes=new byte[1024]; int len=0; while((len=inputStream.read(bytes))!=-1){ final String s = new String(bytes, 0, len); context.runOnUiThread(new Runnable() { @Override public void run() { Log.d("ytx", "发送的数据: "+s); Toast.makeText(context, "发送的数据"+s, Toast.LENGTH_SHORT).show(); } }); } } catch (IOException e) { e.printStackTrace(); } finally { if(inputStream!=null){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }