我目前正在开发一个小应用程序,以开始使用蓝牙Android应用编程接口可以提供的服务。
编辑-
问题似乎是由特定的Nexus 5设备造成的。他们的蓝牙接收器好像不太好用。以下解决方案适用于其他设备
备注:
>
我已经完成了几乎所有我感兴趣的功能(例如检查适配器是否存在,启用/禁用蓝牙,查询成对的部分,设置适配器可发现)。
问题:
实际上,当我启动. onDiscovery()方法时,没有找到设备,即使在我的Nexus 5上的设置/蓝牙中找到了设备。
我是这样处理的:
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
...
protected void onCreate(Bundle savedInstanceState) {
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filter);
}
就我所能尝试的而言,该过滤器运行良好,即操作状态已更改(启用蓝牙)和两个操作发现。
然后成功调用以下方法:
public void onDiscovery(View view)
{
mBluetoothAdapter.startDiscovery();
}
还有我的蓝牙接收器:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
if (state == BluetoothAdapter.STATE_ON) {
showToast("ACTION_STATE_CHANGED: STATE_ON");
}
}
else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
mDeviceList = new ArrayList<>();
showToast("ACTION_DISCOVERY_STARTED");
mProgressDlg.show();
}
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action) && !bluetoothSwitchedOFF) {
mProgressDlg.dismiss();
showToast("ACTION_DISCOVERY_FINISHED");
Intent newIntent = new Intent(MainActivity.this, DeviceListActivity.class);
newIntent.putParcelableArrayListExtra("device.list", mDeviceList);
startActivity(newIntent);
}
else if (BluetoothDevice.ACTION_FOUND.equals(action)) {// When discovery finds a device
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
mDeviceList.add(device);
showToast("Device found = " + device.getName());
}
}
};
我没有任何问题出来的日志,也没有注意到任何问题,在测试期间,我做了。唯一的问题是扫描结束时没有发现任何设备,而周围有许多可发现的设备。
我尽量不写太多代码,以免淹没这个话题。问我你是否需要更多。
感谢您阅读我的文章,并提前感谢您的回答。
派对有点晚了,但这可能对其他人有用。
你需要做两件事
或
到你的Androidanifest.xml
请确保您正在请求运行时的权限以及Android 6.0设备通过使用这样的东西
int MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 1;
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
就在mBluetoothAdapter.startDiscovery()之前;
如果你不做第2步,你将无法在Android设备上获得任何硬件标识符信息
更新/编辑:
以Android版本检查和警报对话框作为警告的示例
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Only ask for these permissions on runtime when running Android 6.0 or higher
switch (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION)) {
case PackageManager.PERMISSION_DENIED:
((TextView) new AlertDialog.Builder(this)
.setTitle("Runtime Permissions up ahead")
.setMessage(Html.fromHtml("<p>To find nearby bluetooth devices please click \"Allow\" on the runtime permissions popup.</p>" +
"<p>For more info see <a href=\"http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id\">here</a>.</p>"))
.setNeutralButton("Okay", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(DeviceListActivity.this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
REQUEST_ACCESS_COARSE_LOCATION);
}
}
})
.show()
.findViewById(android.R.id.message))
.setMovementMethod(LinkMovementMethod.getInstance()); // Make the link clickable. Needs to be called after show(), in order to generate hyperlinks
break;
case PackageManager.PERMISSION_GRANTED:
break;
}
}
你在哪个版本的Android系统上运行这个?如果是Android6. x,我相信你需要在你的清单中添加ACCESS_FINE_LOCATION
权限。例如:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
我有一个类似的问题,这解决了我。
更新:添加留档直接从谷歌上:
要通过蓝牙和Wi-Fi扫描访问附近外部设备的硬件标识符,您的应用程序现在必须具有访问\u FINE\u LOCATION
或访问\u rough\u LOCATION
权限
更新2020:我们最近更新了我们的应用程序,以SDK版本29为目标。通过这样做,我们的应用程序不再能够再次发现蓝牙设备。从最初编写这个答案开始,我们就一直在使用ACCESS_COARSE_LOCATION
。更改为ACCESS_FINE_LOCATION
将修复此问题。我现在建议开发人员尝试ACCESS_FINE_LOCATION
,如果目标是29。回答更新以反映这一点。
我正在编写一个Android应用程序,它应该可以通过蓝牙发现设备。 我没有得到任何例外,但设备只是没有找到,即使我的windows pc找到他们(并可以找到自己)。 我肯定他们是好的,但我两种方法都试过了。当然我也分别试过了。 下面是我的ListActivity,它搜索设备: 日志显示扫描后MLEDeviceListAdapter:0和扫描后isEmpty():true。 则从不调用该日志(onS
我正在编写一个应用程序来打开蓝牙,扫描附近可发现的蓝牙设备,包括配对和未配对,以便将它们添加到列表中。 这是我的代码: 代码看起来很好,但它没有找到或添加任何附近的设备到列表中,当我退出应用程序时,我得到以下异常日志: 有解决问题的办法吗? 要将配对设备添加到列表视图,我必须添加一个按钮并将其与scan()方法相关联。这很令人沮丧,当我点击“打开”按钮时,我想填充列表。此外,仍然需要找到未配对的设
我正在开发一个蓝牙4.0低能耗应用程序来快速扫描周围的广告专用设备(每秒10次或更多),并用RSSI获取他们的地址。根据Android蓝牙应用编程接口,发现是异步的,大约需要12秒。有什么办法可以设置这个时间吗?或者可以使用HCI或蓝牙堆栈直接与设备通信?
我想连接第三方蓝牙设备到我的Android Wear手表(三星Gear Live)。我试图找到留档如何做到这一点,但我没有任何运气。所有的搜索,我似乎都认为我想连接到手机上。 有谁知道一个很好的例子来演示如何将蓝牙心率监视器(或其他设备)连接到Android Wear,以便我在手机不存在时保存历史记录?这可能吗?它是否与从手机/平板电脑上执行相同的协议?
我正在创建一个蓝牙扫描仪应用程序,并试图找到可用的设备配对。我有一个蓝牙耳机,我正试图找到运行android 10应用程序。 权限在清单中设置 应用程序包含一个简单的按钮,点击它我开始发现蓝牙设备 用于发现的回调 如果我错过了什么,有人能帮我吗?
我试图创建一个简单的android应用程序来连接到我的ELM327设备,以获取一些汽车诊断数据。但我无法在我的android手机和我的ELM327设备上设置蓝牙连接。 我的代码很简单,如下所示: } 在mainactivity中,我将首先新建一个Bluetooth类,然后调用Bluetooth.connect(): mBluetooth=新蓝牙();MBluetooth.Connect(); 当我