使用 pyjnius java wrapper 的 Python 蓝牙设备扫描

Posted

技术标签:

【中文标题】使用 pyjnius java wrapper 的 Python 蓝牙设备扫描【英文标题】:Python bluetooth device scanning using pyjnius java wrapper 【发布时间】:2020-12-22 18:56:47 【问题描述】:

我正在尝试复制下面的代码,该代码应该在 android 设备上扫描蓝牙设备,但我正在尝试使用 pyjnius java to python 包装器在 python 中编写它。

关于如何做到这一点的文档很少,所以我无法弄清楚如何让它工作,查看 java 代码似乎函数 onReceiveBroadcastReceiver 类中被覆盖但不知道该怎么做在python中。目前代码只是在没有任何调用回溯的情况下失败,所以我什至无法调试它。

感谢任何帮助

Java 蓝牙代码


 mBluetoothAdapter.startDiscovery();
 mReceiver = new BroadcastReceiver() 
 public void onReceive(Context context, Intent intent) 
     String action = intent.getAction();

     //Finding devices
     if (BluetoothDevice.ACTION_FOUND.equals(action))
     
         // Get the BluetoothDevice object from the Intent
         BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
         // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
     
   
 ;

 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
 registerReceiver(mReceiver, filter);

python 代码


from android.broadcast import BroadcastReceiver
from jnius import autoclass
from android.permissions import request_permissions, Permission

BluetoothAdapter = autoclass('android.bluetooth.BluetoothAdapter')
BluetoothDevice = autoclass('android.bluetooth.BluetoothDevice')
BluetoothSocket = autoclass('android.bluetooth.BluetoothSocket')
BroadcastReceiver = autoclass('android.content.BroadcastReceiver')
IntentFilter = autoclass('android.content.IntentFilter')
Intent = autoclass('android.content.Intent')


request_android_permissions()
mBLuetoothAdapter = BluetoothAdapter.getDefaultDevice()
mBLuetoothAdapter.startDiscovery()

mReceiver = BroadcastReceiver(self.on_broadcast, actions = ['ACTION.FOUND'])
mReceiver.start()

def request_android_permissions():
    def callback(permissions, results):
        if all([res for res in results]):
            print("callback. All permissions granted")
        else:
            print("callback. Some permissions refused")

    request_permissions([Permission.ACCESS_COARSE_LOCATION, Permission.ACCESS_FINE_LOCATION])

def onReceive(context, intent):
    action = intent.getAction()
    
    if BluetoothDevice.ACTION_FOUND.equals(action):
        device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
        Devices.append(device.getName() + "  " + device.getAddress())

filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
BroadcastReceiver.registerReceiver(mReceiver, filter)

【问题讨论】:

【参考方案1】:

我使用 BroadcastReceiver 进行 WiFi 扫描,它可以工作,您应该可以将此示例用于蓝牙。

https://github.com/kivy/python-for-android/issues/2308

这是在“问题”中,因为 BroadcastReceiver 中存在一个崩溃错误,该错误发生在第二次启动时,例如来自 on_resume()。该修复在第二篇文章中进行了描述,需要克隆 p4a 的本地副本,按照描述进行编辑,并在 .spec 中使用 p4a.source_dir 指向它

【讨论】:

以上是关于使用 pyjnius java wrapper 的 Python 蓝牙设备扫描的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pyjnius 覆盖 Python 中的 Java 方法

Python 与 Java,PyJNIus 安装

使用 PyJnius 从 Python 实现 Java 接口

导入我自己的 java 文件时找不到 Pyjnius 类

如何编译 java 文件并使用 pyjnius 和 kivy 导入它们

pyjnius java抽象类实现