Android Marshmallow [API 23]:蓝牙UUID返回NULL

时间:2016-02-03 16:19:02

标签: android bluetooth uuid android-6.0-marshmallow android-permissions

刚刚将我的机器人更新为棉花糖,并意识到这种方法效果不佳。 我刚刚创建了一个应用程序,通过经典蓝牙报告设备和服务(带有UUID):

我已经测试过了:

API 16

enter image description here

API 22

enter image description here

API 23

enter image description here

我最明确的权限是:

<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" />

如果你想检查应用程序的代码:

我的想法已经不多了,所以,非常感谢任何帮助

谢谢!

3 个答案:

答案 0 :(得分:0)

为了向用户提供更好的数据保护,从此版本开始,Android会删除使用Wi-Fi和蓝牙API的应用程序对设备的本地硬件标识符的编程访问。 WifiInfo.getMacAddress()BluetoothAdapter.getAddress()方法现在返回02:00:00:00:00:00的常量值。

要通过蓝牙和Wi-Fi扫描访问附近外部设备的硬件标识符,您的应用现在必须具有ACCESS_FINE_LOCATIONACCESS_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}}

毕竟,如果你的问题像我一样,它会突然再次起作用