无论个人资料如何,如何获取Android的所有已连接蓝牙设备的列表?
另外,我看到您可以通过BluetoothManager.getConnectedDevices获取特定配置文件的所有连接的设备。
而且我想我可以通过ACTION_ACL_CONNECTED / ACTION_ACL_DISCONNECTED侦听连接/断开连接来查看连接了哪些设备...似乎容易出错。
但是我想知道是否有一种更简单的方法来获取所有已连接的蓝牙设备的列表。
如何应对Android中的定向广告(ADV_DIRECT_IND == 0001)?
有一个BLE小工具可以向Android手机发送定向广告(目前使用手机的硬编码MAC地址),在我的Android应用中,我想做出反应并启动与小工具的连接并阅读org.bluetooth.小工具中的characteristic.location_and_speed值:
请通过Android 5 API告知是否可行.
android bluetooth bluetooth-lowenergy android-bluetooth android-ble
我最近正在创建一个使用蓝牙的应用程序。问题是当我启动蓝牙服务时我的应用程序崩溃了。这是我的清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="in.petalappstudio.fit" >
<uses-permission android:name="ANDROID.PERMISSION.BLUETOOTH"/>
<uses-permission android:name="ANDROID.PERMISSION.BLUETOOTH_ADMIN"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".bluetoothManager"
android:enabled="true"
android:exported="true">
</service>
</application>
Run Code Online (Sandbox Code Playgroud)
现在,如您所见,我已经添加了蓝牙和蓝牙管理员的权限。
我的应用程序如何崩溃并且在 LOGCAT 中错误是
"java.lang.RuntimeException: Unable to start service " and is caused by
"java.lang.SecurityException: Need BLUETOOTH ADMIN permission: Neither user 10145 nor current process has android.permission.BLUETOOTH_ADMIN."
Run Code Online (Sandbox Code Playgroud)
但我已经添加了权限,如您所见。现在为什么会发生这种情况?
我正在构建一个应用程序来从 ble 设备读取数据。连接到我调用的设备后mBluetoothGatt.discoverServices(),onServicesDiscovered(..)我正在通过调用getServices().
问题是有时列表是空的。有没有人遇到过这个问题。这个问题是随机的,不是 100% 可重现的。
从Android M开始,如果您在位置设置中启用了蓝牙扫描选项,即使全局位置已关闭,也可以在后台扫描蓝牙设备(请参见屏幕截图).
要扫描BLE设备,必须满足以下条件:
COARSE_LOCATION或FINE_LOCATION许可.以下之一:
我可以检查授予权限和位置选择器的状态就好了.我无法做到的是弄清楚如何检查Bluetooth Scanning选项的状态?
任何见解都非常感谢!
android bluetooth android-location bluetooth-lowenergy android-bluetooth
在 VOIP 应用程序上工作,在静音模式下,警报音或铃声应仅在蓝牙耳机上播放。如果已连接,可以在耳机上播放,但如果未连接耳机,尽管手机处于静音模式,但扬声器上会播放声音。
有人请解释是否有办法检测蓝牙耳机已连接。
我只想保持蓝牙开启,为此我监听蓝牙状态,如果它被关闭,广播接收器可以启用它。我也希望它在应用程序关闭时运行。因此,即使在应用程序关闭后(当它不工作时),我也试图运行蓝牙广播接收r。为此,我了解到我需要使用工作管理器来支持所有设备。我试图结合 Broadcast Receiver 和 Work Manager。但是当应用程序关闭时我无法让它运行。
这是我的MainActivity.java在这里,我将工作请求排入队列。
package com.example.workmanagersample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class).build();
WorkManager.getInstance().enqueue(workRequest);
}
}
Run Code Online (Sandbox Code Playgroud)
下面的类是我的MyWorker.java 在这里我注册了接收器。
package com.example.workmanagersample;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.IntentFilter;
import android.support.annotation.NonNull;
import android.support.v4.app.NotificationCompat;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
public class MyWorker extends Worker {
private …Run Code Online (Sandbox Code Playgroud) android background-service broadcastreceiver android-bluetooth android-workmanager
很长一段时间以来,我一直在使用 BluetoothDevice 类中的 removeBond 方法来取消设备配对。但是在大多数小米设备中,这是行不通的。
检查我正在使用的以下代码:
Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();
for (BluetoothDevice device : devices) {
Log.i("DeletePairedDeviceByNm", "Found Device:" +
device.getName() + ", Looking for:" + BDName + "\n");
if ((device.getName().trim().equals(BDName.trim()))) {
Method m = device.getClass().getMethod("removeBond", (Class[]) null);
Object value=m.invoke(device, (Object[]) null);
if((boolean)value){
numberPairedDevicesDeleted++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是“取消配对”连接设备的唯一方法。
还有什么可以使用的吗?请向我提供一些有价值的反馈。
提前致谢!
一些经过测试的设备是:
我被一个问题困住了。我已经尝试过 Stack Overflow 和其他网站的一些提示。
我想编写一个应用程序,它搜索周围的所有蓝牙设备,如果找到匹配的设备(MAC 地址作为参考),该应用程序将开始连接。
因此,我编写了一个测试应用程序来测试发现功能。但不幸的是,在我的 Android 10 设备上启动发现过程存在一个大问题。我有一个旧的三星 S3 Mini,上面有 Android 4.1.2 (SDK 16),我的代码运行良好。在 Android 10 设备上startDiscovery()返回 false,与在 Android 4 设备上返回 true 不同。在 android 开发人员页面上,他们说,如果发生错误,则 false 是返回值。BroadcastReceiver 应该可以正常工作,因为 Android 9 手机上的应用程序检测到设置中已启动蓝牙搜索。这只是startDiscovery()问题所在的功能(在我看来)。
在开始发现过程之前,我正在检查所有权限和蓝牙状态。但我认为,它不能是书面代码,因为它在旧设备上运行良好。也许我对较新的设备缺少一些东西。
正如 Thomas Morris 在下面解释的那样,在 Android 10 中,您需要用户打开位置。在 Android 9 或更低版本中,Thomas Morris 的回答是正确的,因为在所有低于 29 的 SDK 中,只需要许可,而不需要启用位置服务。
是否有避免要求用户自己打开位置的解决方案?
这是我的主要活动:
public class MainActivity extends AppCompatActivity {
final String TAG = "MainActivity";
BluetoothAdapter bluetoothAdapter;
int status = 0; //0 = start discovering, 1 = …Run Code Online (Sandbox Code Playgroud) 我有一个扫描 BLE 设备的应用程序。它在 Android 10 上运行良好,但自从我将手机更新到Android 11后,如果我将应用程序置于后台或锁定屏幕,则onScanResult 永远不会被调用。
这很烦人。我还没有找到任何可能导致这种情况的合理想法。我在 Android 11 中没有发现任何表明此行为发生变化的差异。如果您将应用程序定位到 api 级别 31,则 Android 12 具有新的 BT 权限,但我确实将我的应用程序定位到 api 级别 30,并且我确实在 Android 11 上运行我的应用程序。
我完全一无所知。我尝试了不同的扫描模式,以及添加扫描过滤器,但没有任何改变。
我的扫描设置:
ScanSettings ss = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();
List<ScanFilter> filterList = new ArrayList<>();
filterList.add(new ScanFilter.Builder().setManufacturerData(Constants.HARDWARE_MANUFACTURER_ID, new byte[]{}).build());
BluetoothUtil.getBluetoothLeScannerInstance().startScan(filterList, ss, leScanCallback);
Run Code Online (Sandbox Code Playgroud)
onScanResult当应用程序位于前台且设备屏幕未锁定时,通话效果良好。一旦我将应用程序推到后台或锁定屏幕,我就不再收到任何回调onScanResult
15:47:15 com.myapp.co I/BL_START: ...Starting BL scan. (Start of current window)
15:47:17 com.myapp.co I/SCANNED_: onScanResult ran!
15:47:21 com.myapp.co I/SCANNED_: onScanResult ran! …Run Code Online (Sandbox Code Playgroud)