Android学习笔记之蓝牙功能
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun)
本文实例为大家分享了Android学习笔记之蓝牙功能的具体代码,供大家参考,具体内容如下
蓝牙:短距离无线通讯技术标准。蓝牙协议分为4层,即核心协议层、电缆替代协议层、电话控制协议层和其他协议层。其中核心协议层包括基带、链路管理、逻辑链路控制和适应协议四部分。链路管理(LMP)负责蓝牙组件间的建立。逻辑链路控制与适应协议(L2CAP)位于基带协议层上,属于数据链路层,是一个高层传输和应用层协议屏蔽基带协议的适配协议。
1)、第一种打开蓝牙的方式:
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); ?startActivityForResult(enableIntent,1);
2)、第二种打开蓝牙方式(静默)
权限配置:
<uses-permission android:name=”android.permission.BLUETOOTH”/> ? <uses-permission android:name=”android.permission.BLUETOOTH_ADMIN”/> BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); adapter.enable();//打开 adapter.disable();//关闭
3)、通过代码搜索蓝牙
蓝牙数据传输:与Socket类似,网络中使用Socket和ServerSocket控制客户端和服务端,蓝牙通讯客户端为BluetoothSocket,服务端为BluetoothServerSocket。二者需要一个UUID(全局唯一标示符),格式如下:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,被分为5段,其中3段字符数相同,都为4,第1段是8字符,最后一段12字符,UUID相当于Socket的端口,而蓝牙地址相当于Socket的IP。
一、搜索蓝牙设备
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.Window; import android.widget.TextView; import java.util.Set; ? public class MainActivity extends AppCompatActivity { ? ? ? private BluetoothAdapter bluetoothAdapter; ? ? private TextView tvDevices; ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); ? ? ? ? setContentView(R.layout.activity_main); ? ? ? ? tvDevices = (TextView) findViewById(R.id.tvDevices); ? ? ? ? bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ? ? ? ? Set<BluetoothDevice> paireDevices = bluetoothAdapter.getBondedDevices(); ? ? ? ? if (paireDevices.size()>0){ ? ? ? ? ? ? for (BluetoothDevice devices:paireDevices){ ? ? ? ? ? ? ? ? tvDevices.append(devices.getName()+":"+devices.getAddress()); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);//找到一个设备,发送一个广播 ? ? ? ? this.registerReceiver(receiver,filter); ? ? ? ? ? filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//整个搜索完后发送广播 ? ? ? ? this.registerReceiver(receiver,filter); ? ? } ? ? public void onClick_Search(View view){ ? ? ? ? setProgressBarIndeterminateVisibility(true); ? ? ? ? setTitle("正在扫描..."); ? ? ? ? if(bluetoothAdapter.isDiscovering()){ ? ? ? ? ? ? bluetoothAdapter.cancelDiscovery(); ? ? ? ? } ? ? ? ? bluetoothAdapter.startDiscovery(); ? ? } ? ? private final BroadcastReceiver receiver = new BroadcastReceiver() { ? ? ? ? @Override ? ? ? ? public void onReceive(Context context, Intent intent) { ? ? ? ? ? ? String action = intent.getAction(); ? ? ? ? ? ? if (BluetoothDevice.ACTION_FOUND.equals(action)) { ? ? ? ? ? ? ? ? BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); ? ? ? ? ? ? ? ? if (device.getBondState() != BluetoothDevice.BOND_BONDED) { ? ? ? ? ? ? ? ? ? ? tvDevices.append(device.getName() + ":" + device.getAddress() + "\n"); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { ? ? ? ? ? ? ? ? setProgressBarVisibility(false); ? ? ? ? ? ? ? ? setTitle("搜索完成"); ? ? ? ? ? ? } ? ? ? ? } ? ? }; }
真机测试效果图:
二、通过搜索,将搜到的设备连接并实现传输数据
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import java.io.IOException; import java.io.InputStream; 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 implements AdapterView.OnItemClickListener { ? ? private BluetoothAdapter bluetoothAdapter;//蓝牙适配器 ? ? private ListView lvDevices;//显示蓝牙搜索控件 ? ? private List<String> bluetoothDevices = new ArrayList<String>();//存储搜索到的所有蓝牙设备 ? ? private ArrayAdapter<String> arrayAdapter; ? ? private final UUID MY_UUID = UUID.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");//手动输入UUID码 ? ? private final String NAME = "Bluetooth_Socket"; ? ? private BluetoothSocket clientSocket;//服务端 ? ? private BluetoothDevice device; ? ? private OutputStream os; ? ? private AcceptThread acceptThread; ? ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); ? ? ? ? setContentView(R.layout.activity_main); ? ? ? ? bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//初始化 ? ? ? ? lvDevices = (ListView) findViewById(R.id.lvDevices); ? ??? ?//显示配对的蓝牙信息 ? ? ? ? Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); ? ? ? ? if (pairedDevices.size() > 0) { ? ? ? ? ? ? for (BluetoothDevice device : pairedDevices) { ? ? ? ? ? ? ? ? bluetoothDevices.add(device.getName() + ":" + device.getAddress() + "\n"); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //显示设备在列表上 ? ? ? ? arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, ? ? ? ? ? ? ? ? android.R.id.text1, bluetoothDevices); ? ? ? ? lvDevices.setAdapter(arrayAdapter); ? ? ? ? lvDevices.setOnItemClickListener(this); ? ? ? ? acceptThread = new AcceptThread(); ? ? ? ? acceptThread.start(); ? ? } ? ? ? public void onClick_Search(View view) { ? ? ? ? setProgressBarIndeterminateVisibility(true); ? ? ? ? setTitle("正在扫描..."); ? ? ? ? if (bluetoothAdapter.isDiscovering()) { ? ? ? ? ? ? bluetoothAdapter.cancelDiscovery(); ? ? ? ? } ? ? ? ? bluetoothAdapter.startDiscovery(); ? ? } ? ? ? private final BroadcastReceiver receiver = new BroadcastReceiver() { ? ? ? ? @Override ? ? ? ? public void onReceive(Context context, Intent intent) { ? ? ? ? ? ? String action = intent.getAction(); ? ? ? ? ? ? if (BluetoothDevice.ACTION_FOUND.equals(action)) { ? ? ? ? ? ? ? ? BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); ? ? ? ? ? ? ? ? if (device.getBondState() != BluetoothDevice.BOND_BONDED) { ? ? ? ? ? ? ? ? ? ? bluetoothDevices.add(device.getName()+":"+device.getAddress()+"\n"); ? ? ? ? ? ? ? ? ? ? arrayAdapter.notifyDataSetChanged(); // ? ? ? ? ? ? ? ? ? ?tvDevices.append(device.getName() + ":" + device.getAddress() + "\n"); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { ? ? ? ? ? ? ? ? setProgressBarIndeterminateVisibility(false); ? ? ? ? ? ? ? ? setTitle("连接蓝牙设备"); ? ? ? ? ? ? } ? ? ? ? } ? ? }; ? ? /* ? ? * 客户端设置 ? ? * 单击事件 ? ? * */ ? ? @Override ? ? public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ? ? ? ? String s = arrayAdapter.getItem(position); ? ? ? ? String address = s.substring(s.indexOf(":") + 1).trim();//获取蓝牙IP ? ? ? ? ? try { ? ? ? ? ? ? if (bluetoothAdapter.isDiscovering()) { ? ? ? ? ? ? ? ? bluetoothAdapter.cancelDiscovery();//若当前蓝牙被使用,则关闭重新启用 ? ? ? ? ? ? } ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? if (device == null) {//若未连接,则获得远程设备 ? ? ? ? ? ? ? ? ? ? device = bluetoothAdapter.getRemoteDevice(address); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (clientSocket == null) { ? ? ? ? ? ? ? ? ? ? clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID); ? ? ? ? ? ? ? ? ? ? clientSocket.connect();//连接蓝牙 ? ? ? ? ? ? ? ? ? ? os = clientSocket.getOutputStream();//客户端向服务端输出文本 ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? } ? ? ? ? ? ? if (os != null) { ? ? ? ? ? ? ? ? os.write("发送信息到其他设备".getBytes("utf-8")); ? ? ? ? ? ? } ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } /* * 服务端设置 * 设置一个Handler,用来显示 * */ ? ? private android.os.Handler handler = new android.os.Handler() { ? ? ? ? public void handleMessage(Message msg) { ? ? ? ? ? ? Toast.makeText(MainActivity.this, String.valueOf(msg.obj), Toast.LENGTH_LONG).show(); ? ? ? ? ? ? super.handleMessage(msg); ? ? ? ? } ? ? }; ?? ?//线程类 ? ? private class AcceptThread extends Thread { ? ? ? ? private BluetoothServerSocket serverSocket; ? ? ? ? private BluetoothSocket socket; ? ? ? ? private InputStream is; ? ? ? ? private OutputStream os; ? ? ? ? ? public AcceptThread() { ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? ? public void run() { ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? socket = serverSocket.accept(); ? ? ? ? ? ? ? ? is = socket.getInputStream(); ? ? ? ? ? ? ? ? os = socket.getOutputStream(); ? ? ? ? ? ? ? ? while (true) { ? ? ? ? ? ? ? ? ? ? byte[] buffer = new byte[128]; ? ? ? ? ? ? ? ? ? ? int count = is.read(buffer); ? ? ? ? ? ? ? ? ? ? Message msg = new Message(); ? ? ? ? ? ? ? ? ? ? msg.obj = new String(buffer, 0, count, "utf-8"); ? ? ? ? ? ? ? ? ? ? handler.sendMessage(msg); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? } ? ? ? ? } ? ? } }
真机测试效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。
相关文章
解决Android WebView拦截url,视频播放加载失败的问题
这篇文章主要介绍了解决Android WebView拦截url,视频播放加载失败的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-03-03Android Studio 3.6 layout文件text模式切换问题
这篇文章主要介绍了Android Studio 3.6 layout文件text模式切换问,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-03-03Android应用中使用ViewPager实现类似QQ的界面切换效果
这篇文章主要介绍了Android应用中使用ViewPager实现类似QQ的界面切换效果的示例,文中的例子重写了PagerAdapter,并且讲解了如何解决Android下ViewPager和PagerAdapter中调用notifyDataSetChanged失效的问题,需要的朋友可以参考下2016-03-03
最新评论