gpt4 book ai didi

java - 蓝牙 PAN 连接 Android 11

转载 作者:行者123 更新时间:2023-12-05 00:03:08 25 4
gpt4 key购买 nike

我的应用程序通过蓝牙作为 PAN 设备连接到 radio 。使用新的 android 11 更新此代码不起作用

String sClassName = "android.bluetooth.BluetoothPan";
final Class<?> classLocalBluetoothProfileManager = Class.forName(sClassName);
Constructor<?> ctor = classLocalBluetoothProfileManager.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
ctor.setAccessible(true);
Object instance = ctor.newInstance(getApplicationContext(), new BluetoothProfile.ServiceListener() {
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
Method connectMethod = null;
try {
connectMethod = proxy.getClass().getDeclaredMethod("connect", BluetoothDevice.class);
if (((Boolean) connectMethod.invoke(proxy, device))) {
System.out.println(">>> ConnectPAN ->true");
} else {
System.out.println(">>> ConnectPAN ->false");
}
} catch (Exception e) {
System.out.println(">>> ConnectPAN ->ex " + e.getMessage());
}
BluetoothAdapter.getDefaultAdapter().closeProfileProxy(PAN, proxy);

// some stuff with connect events
在 11 android 上,我在 try 方法中得到空引用,所以可能这个 api 从 11 android 开始被隐藏。
编辑:
实际上我发现了异常,它是
Caused by: java.lang.SecurityException: Need BLUETOOTH_PRIVILEGED 
permission: Neither user 10282 nor current process has
android.permission.BLUETOOTH_PRIVILEGED
所以,谷歌只是隐藏了它看起来的 API,那么我怎样才能将 PAN 连接到我的 radio 呢?
所以我打开文档并尝试连接蓝牙套接字:
这个想法被描述 here .我认为我不需要重写此示例代码,但我尝试过:
  • 与连接
    “00000000-0000-1000-8000-00805f9b34fb” - 默认 UUID
  • 与自定义 uuid 连接
    00001116 和 00001112
    使用默认和 1116 ID 套接字未打开并出现错误
    unable to connect read failed, socket might closed or timeout, read ret: -1

  • 当我使用 1112 uuid 时,连接正在建立,但没有 PAN 连接,所以我没有从设备获取 IP,并且未选中设置中蓝牙设备中的“Internet 访问”复选框。
    所有这些 UUID 都通过安全、不安全和反射方法进行检查。
    我还尝试使用反射和选择 channel 创建套接字,尝试了所有 30 个 channel ,有时连接已建立但也没有 PAN。
     socket =(BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}).invoke(device,1);
  • 我检查了所有 SO 问题,我认为整个互联网,但仍然没有其他解决方案。有什么可以尝试的?

  • 编辑2:
    当我在设备的蓝牙设置中检查互联网访问时,它连接正常,我可以使用我的应用程序,但我无法以编程方式连接,甚至没有找到如何设置此复选框或为用户弹出此窗口

    最佳答案

    是的,此 API 在 Android 11 的灰名单中。
    但我在 Android 11 来源中看到的内容:
    在 PanService(蓝牙应用程序)中,connect 方法调用 getConnectionState,它被列入黑名单。
    所以最后这个方法应该被视为黑名单。

    关于java - 蓝牙 PAN 连接 Android 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67280240/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com