刚刚将我的机器人更新为棉花糖,并意识到这种方法效果不佳。 我刚刚创建了一个应用程序,通过经典蓝牙报告设备和服务(带有UUID):
我已经测试过了:
API 16
API 22
API 23
我最明确的权限是:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
如果你想检查应用程序的代码:
我的想法已经不多了,所以,非常感谢任何帮助
谢谢!
答案 0 :(得分:0)
为了向用户提供更好的数据保护,从此版本开始,Android会删除使用Wi-Fi和蓝牙API的应用程序对设备的本地硬件标识符的编程访问。 WifiInfo.getMacAddress()
和BluetoothAdapter.getAddress()
方法现在返回02:00:00:00:00:00
的常量值。
要通过蓝牙和Wi-Fi扫描访问附近外部设备的硬件标识符,您的应用现在必须具有ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
权限:
WifiManager.getScanResults();
BluetoothDevice.ACTION_FOUND;
BluetoothLeScanner.startScan();
所以这是更新功能,添加这三种方法即可获得UUID
答案 1 :(得分:0)
经过头痛和数小时的研究后,答案是使用CreateInsecureRfcommSocketToServiceRecord
创建套接字不,而使用 CreateRfcommSocketToServiceRecord
创建和默认UUID比如"00001101-0000-1000-8000-00805F9B34FB"
答案 2 :(得分:0)
我认为你遇到了同样的问题,对于SDK 23,你必须让用户确认他们是否允许ACCESS_COARSE_LOCATION。 (我假设你正在进行BLE搜索)
看看你的控制台日志,我猜你会发现一个看起来像这样的非常大的错误,用蓝色突出显示。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION)){
if (DEBUG) Log.i(TAG, "EXPLANATION NEEDED");
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Warning Permission Needed");
builder.setMessage("If you don't enable the location for this app then we can not connect to the controller");
builder.setPositiveButton("Change", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION);
}
}
});
AlertDialog dialog = builder.create();
dialog.show();
}else{
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_LOCATION);
}
}
}
您似乎需要获得用户权限(例如iOS应用),因此您需要在此初始化中添加一些代码
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_LOCATION){
if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
// ask the question again as they denied the permission
}
}
}
如果用户没有阅读并点击拒绝,您必须处理该怎么做。所以检查以下方法的回报
{{1}}
毕竟,如果你的问题像我一样,它会突然再次起作用