您现在的位置是:网站首页> Android

实用源码下载

  • Android
  • 2022-04-08
  • 835人已阅读
摘要

实用源码下载

点击下载二维码识别

点击下载Android打印源码

点击下载Android打印PDF文件

android 蓝牙遥控器开发 android蓝牙遥控器app





android 蓝牙遥控器开发 android蓝牙遥控器app

开机方法(webpad官改系统测试有效)

如果只是想要在关机情况下开机,方法很简单,只要把手机和盒子事先配对好,打开手机蓝牙界面,点击一下盒子的名称即可唤醒盒子,这种办法连编程都不需要,可以说是个蓝牙设备都能唤醒盒子。即使要编程,也很简单:


BluetoothAdapter adapter= BluetoothAdapter.getDefaultAdapter();

BluetoothDevice device = adapter.getRemoteDevice("FC:7C:02:00:00:00");//n1 MAC地址

BluetoothGatt gatt = device.connectGatt(this, false, new BluetoothGattCallback(){});//只需连接一下,不需要发送特定的数据,就能唤醒盒子

gatt.close();


编程的目的是弥补wifi遥控不能开机的缺点。把以上代码加到电源键的逻辑后面,实现既能关机又能开机的wifi遥控。


遥控方法

如果要实现蓝牙遥控换台、调音量等功能,就要去写代码了。代码的关键是BluetoothHidDevice这个类,该类是在安卓9(API 28)中才开放的,所以手机安卓系统版本在9.0以下的就不用看了。使用BluetoothHidDevice,可以让安卓手机模拟为一个蓝牙hid设备,比如蓝牙鼠标、蓝牙键盘、蓝牙触摸板等等。


相较于wifi遥控来说,蓝牙遥控比较复杂一些,需要了解蓝牙协议栈,精通linux和安卓。由于我也不是专业做安卓开发的,对蓝牙协议也不了解,只是一个业余爱好者,希望哪位感兴趣的大神可以把这个蓝牙遥控器给做得漂亮一点。


使用说明

配对过程中不能离开app界面,否则服务会暂停,导致配对后不能把手机识别为hid设备(这一点大神们可以完善一下)。那怎么办呢?可以用盒子来发起配对请求,或者在手机上下拉通知栏打开蓝牙进行搜索,或者使用分屏功能等等,总之,办法有很多。配对成功后可以在盒子上看到有一个输入设备,如下图:

1.png


如果没有成功,需要取消配对,重新进入软件,再按上面的步骤操作。然后就可以在手机上遥控盒子了:

2.png

Android Studio工程代码和apk: https://lanzous.com/b00th063g 密码:flos

 https://github.com/domi1294/BluetoothHidDemo

点击下载:

BluetoothHidDemo-master.zip


通过蓝牙HID将安卓手机模拟成鼠标和键盘

一直以来就有一种想法,就是自己写一个APP将安卓手机模拟成鼠标/键盘,应急的时候可以用来代替鼠标/键盘。之前也在国内外的网站上找了各种方案,但是这些方案不是很好,直到谷歌发布的API28后终于有了很好的解决方案。为了实现这个想法也走了不少弯路,也许方法不对吧,但看到最终完美运行的APP,心中还是很有成就感的。经测试装了此APP的手机能与几乎所有安卓手机、WIN10笔记本电脑连接并操作,苹果设备需要IOS13及以上版本才能支持蓝牙鼠标/键盘。苹果系统下鼠标功能正常,键盘输入文字没问题,但是其它功能键(如:Win,Menu,PageUp/Down,上下左右键...)则没什么作用。


BluetoothHidDevice

android.bluetooth.BluetoothHidDevice是完成任务的核心类。通过它将我们的应用注册成具有HID特征的蓝牙设备,并传送HID设备的报告描述符。如果我们的报告描述符没有问题,那么我们的设备就会成功模拟想要的HID设备。


码砖思路


首先将我们的应用注册为HID设备;

BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, mProfileServiceListener,BluetoothProfile.HID_DEVICE);


public static BluetoothProfile.ServiceListener mProfileServiceListener = new BluetoothProfile.ServiceListener() {

    @Override

    public void onServiceDisconnected(int profile) { }

    @SuppressLint("NewApi") @Override

    public void onServiceConnected(int profile, BluetoothProfile proxy) {

        bluetoothProfile = proxy;

        if (profile == BluetoothProfile.HID_DEVICE) {

            HidDevice = (BluetoothHidDevice) proxy;

            HidConsts.HidDevice = HidDevice;

            BluetoothHidDeviceAppSdpSettings sdp = new BluetoothHidDeviceAppSdpSettings(HidConsts.NAME, HidConsts.DESCRIPTION, HidConsts.PROVIDER,BluetoothHidDevice.SUBCLASS1_COMBO, HidConsts.Descriptor);

            HidDevice.registerApp(sdp, null, null, Executors.newCachedThreadPool(), mCallback);

        }

    }

};

public static final BluetoothHidDevice.Callback mCallback = new BluetoothHidDevice.Callback() {

    @Override

    public void onAppStatusChanged(BluetoothDevice pluggedDevice, boolean registered) { }

    @Override

    public void onConnectionStateChanged(BluetoothDevice device, int state) {

        if(state == BluetoothProfile.STATE_DISCONNECTED){

            HidUitls.IsConnected(false);

            if(connectionStateChangeListener != null){

                connectionStateChangeListener.onDisConnected();

            }

        }else if(state == BluetoothProfile.STATE_CONNECTED){

            HidUitls.IsConnected(true);

            if(connectionStateChangeListener != null){

                connectionStateChangeListener.onConnected();

            }

        }else if(state == BluetoothProfile.STATE_CONNECTING){

            if(connectionStateChangeListener != null){

                connectionStateChangeListener.onConnecting();

            }

        }

    }

};

然后判断想要连接的蓝牙设备有没有配对过(双方都要配对好),如果没有配对则需要建立配对;

public static boolean Pair(String deviceAddress){

    if(BluetoothAdapter.checkBluetoothAddress(deviceAddress)){

        try {

            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

            if(BtDevice == null){

                BtDevice = mBluetoothAdapter.getRemoteDevice(deviceAddress);

            }

            if(BtDevice.getBondState() == BluetoothDevice.BOND_NONE){

                BtDevice.createBond();

                return false;

            }else if(BtDevice.getBondState() == BluetoothDevice.BOND_BONDED){

                return true;

            }else if(BtDevice.getBondState() == BluetoothDevice.BOND_BONDING){

                return false;

            }

        }catch (Exception ex){ ex.printStackTrace(); }

    }

    return false;

}

配对完成后获取蓝牙设备的MAC地址,用MAC地址连接目标设备;

public static boolean Connect(String deviceAddress){

    if(TextUtils.isEmpty(deviceAddress)){return false;}

    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    if(BtDevice == null){

        BtDevice = mBluetoothAdapter.getRemoteDevice(deviceAddress);

    }

    boolean ret = HidDevice.connect(BtDevice);

    return ret;

}


IOS13相关设置

安装了HidDroid后的安卓机要控制苹果手机需要做如下设置,在苹果手机上找到:设置->辅助功能->触控->辅助触控->设备,选择已经配对并连接的安卓手机,设置成功后屏幕上出现一个白色的球,这个球就是鼠标指针。

1.png


在鼠标键盘的基础上新增多媒体控制功能,媒体控制包含7个功能,分别是:上一首、下一首、音量+、音量-,停止播放、播放/暂停、静音。在实现HID媒体播放的过程中发现,安卓对报告描述符的兼容性非常好,只要看上去正确的描述符运行起来基本没有问题,而win10就没有那么好的兼容性了,从理论上分析正确的描述符不一定能在win10下工作。经过了不知多少次的尝试后终于能够编写出兼容win10的描述符。还有,既然能兼容安卓,那么智能电视的媒体控制自然是不在话下的。

本文源码下载地址:

HidDroid_CN.rar





























Top