android 蓝牙之数据传输

 

因为项目需要,需要将本地数据库的数据,通过蓝牙传输到另一台设备上。然后百度了蛮久,看了蛮多的,觉得有必要自己整理一下,蓝牙的传输功能。

首先,我们都知道的,蓝牙连接数需要先配对的,两台手机配对后才可进行蓝牙处理。对于蓝牙配对的方法网上一大堆,我也就不具体说了,大概记录一下。基本的我们可以通过手机原有的蓝牙功能,进行搜索配对后在自身的APK中,直接启动蓝牙,然后查询已匹配设备就行了。因为项目目前没有要求实现匹配功能,我也就能省则省了...不过还是总体介绍一下吧。

在安卓源码中,首先要知道有提供了一个蓝牙类:BluetoothAdapter , 我们需要先初始化这个类,才能huod获得蓝牙的相关数据。 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  接着我们需要先注册广播,广播的注册有静态注册和动态注册,我就不详说了,我这用的是动态注册: 

  //注册蓝牙广播
        IntentFilter filter = new IntentFilter(
                BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        getActivity().registerReceiver(receiver, filter);
        filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        getActivity().registerReceiver(receiver, filter);

然后再实现广播的处理:

public class BluetoothReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(BluetoothDevice.ACTION_FOUND)) {
            //未匹配
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
            //搜索完成
        }
    }

}

基本就是这样,里面的参数判断的话,蓝牙有各种不同的状态,可以根据搜索到的设备进行检查,然后区分当前蓝牙处于什么状态。而我因为业务原因,暂时也不需要去监听匹配,所以,我用的是以下这个方法:

   Set<BluetoothDevice> bondedDevices = mBluetoothAdapter.getBondedDevices();
        for (BluetoothDevice bondedDevice : bondedDevices) {
            bluetoothDevices.add(bondedDevice);
        }

当蓝牙开启后,通过此方法,获得已匹配的设备。

另外补充一个开启蓝牙的方法:此方法为了让其他设备可以搜索到本机,里面的300表示暴露时间秒

 //开启显示,让本机可以被搜索到
            if (mBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
                Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
                startActivity(discoverableIntent);
            } else {
                showToast("蓝牙已开启");
            }

 

好了,以上是一些基本的蓝牙功能,到哪里都可以找到一大堆的。下面开始记录关键,蓝牙数据传输

既然要传输数据,和给api通讯一样,肯定是要有一个服务端,一个客户端的。而服务端是需要在开启状态,监听客户端发送的数据。而服务属于阻塞操作,所以要开启一个线程,再来开启一个服务:

 BluetoothServerSocket mmServerSocket=mBluetoothAdapter.listenUsingRfcommWithServiceRecord("Name", UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66"));
 BluetoothSocket socket = mmServerSocket.accept();

通过以上方法来开启一个服务,这里“Name”,UUID,服务端和客户端都必须一样,这是识别用的。另外要注意mmServerSocket 是否为 null ,若未null 则也是无法开启的。另外在之后若出现无法连接的情况,这里我们可以查下缓一缓UUID的值,具体这个坑什么原因我也说不清,反正换一换呗。

当以上的方法调用了之后,服务器基本就算开启了的。只要没抛异常的话。

然后我们需要一个输入流,可以写循环,也可以不写循环。循环的话就通过传输过来的数据,做个标记结束它。这些都是一些废话,就直接写个流吧...

 
InputStream mmInStream = socket.getInputStream();

 bytes = mmInStream.
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值