使用 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 代码似乎函数 onReceive
在 BroadcastReceiver
类中被覆盖但不知道该怎么做在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 方法
使用 PyJnius 从 Python 实现 Java 接口