当前位置: 首页 > 知识库问答 >
问题:

如何修改BluetoothleGatt以在Android 6.0上启用BLE设备扫描?

王凌
2023-03-14

我是Android App开发和BLE的新手,我正在使用示例代码BluetoothLeGatt[我从Android Studio导入的那个]学习这些。该代码在我的平板电脑(Android 5.0)上运行良好,但扫描活动不会在Android 6.0上返回任何BLE设备。我收到的错误消息如下所示。

07-19 12:41:39.615 7617-7642/? W/Binder: Caught a RuntimeException from the binder stub implementation.
                                     java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results
                                         at android.os.Parcel.readException(Parcel.java:1599)
                                         at android.os.Parcel.readException(Parcel.java:1552)
                                         at android.bluetooth.IBluetoothGatt$Stub$Proxy.startScan(IBluetoothGatt.java:772)
                                         at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.onClientRegistered(BluetoothLeScanner.java:331)
                                         at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:56)
                                         at android.os.Binder.execTransact(Binder.java:458)

我查看了Android 6.0上发布的Bluetooth Low Energy startScan,没有发现设备和在运行时请求权限的官方页面,但我仍然不知道如何修改我的代码。

我确实添加了GPS、ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION的权限,并在平板电脑上打开了定位服务。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.location.gps" />

但该应用程序仍然无法返回任何BLE设备。然后,当我尝试将以下代码块添加到我的应用程序(在运行时请求权限)时,checkSelfPermission上总是出现错误[无法解析符号“checkSelfPermission”。但我确实导入了android.support.v4.content.ContextCompat

有人能帮我吗?此外,对于如何使DeviceScanActivity工作的问题,有没有更简单的答案?我真的不知道在运行时请求权限的代码块应该放在哪里:(我知道这是一个非常愚蠢的问题,但我对这个领域真的很陌生。请帮帮我!

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.READ_CONTACTS)
    != PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_CONTACTS)) {

    // Show an explanation to the user *asynchronously* -- don't block
    // this thread waiting for the user's response! After the user
    // sees the explanation, try again to request the permission.

} else {

    // No explanation needed, we can request the permission.

    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant. The callback method gets the
    // result of the request.
}
}

编辑以下是我的依赖项块。

dependencies {
compile "com.android.support:support-v4:25.3.1"
compile "com.android.support:support-v13:25.3.1"
compile "com.android.support:cardview-v7:25.3.1"
compile "com.android.support:appcompat-v7:25.3.1"
}

共有2个答案

柳正志
2023-03-14

是否添加这些所有权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

它在android 6.0上运行良好

郎同化
2023-03-14

谢谢大家的回复和帮助!我刚刚解决了我的案子!

我所做的是,除了在AndroidManifest.xml中添加权限之外,我还在DeviceScanactive中的onCreate方法中添加了以下代码,我使用的参考是运行时请求权限。此外,我只是随机分配了一个数字给MY_PERMISSIONS_REQUEST_LOCATION。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getActionBar().setTitle(R.string.title_devices);
        mHandler = new Handler();
    //Check for permissions
        int permissionCheck = ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_CALENDAR);
        Log.e(TAG, "Permission Status: " +permissionCheck );

    //***********************************************************
    // 
        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED)
        {

            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_COARSE_LOCATION))
            {

            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

            } 
            else
            {

            // No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                    MY_PERMISSIONS_REQUEST_LOCATION);
            }
        }

    ......//The rest of code
    }

当我第一次添加上述代码时,我的平板电脑上会出现一个弹出窗口,询问我的权限,我点击了“允许”然后,我就可以扫描我的ble设备了。

顺便说一句,它只需要我允许一次。当我稍后单击“运行应用程序”时(在对代码进行轻微修改后),它没有再次请求我的许可。

 类似资料:
  • 我有3台Android设备,三星Galaxy S3手机,三星Tab4和Verizon OEM平板电脑。Verizon OEM平板电脑不支持BLE、API 17。我从android开发者网站安装了“BLE设备扫描”,并在Galaxy S3上运行。它只显示Verizon平板电脑是找到的设备。当我在三星Tab4上运行相同的应用程序时,它只显示Galaxy S3作为找到的设备。如果我只看Galaxy S3

  • 我正在创建一个Android应用程序,该应用程序使用Android Studio扫描所有附近的BLE(蓝牙低功耗)设备。 我想我已经实施了所有这些文件: https://developer.android.com/guide/topics/connectivity/bluetooth/ble-overview https://developer.android.com/guide/topics/c

  • 我试图扫描BLE设备与 (我知道它在新版本中已经过时了,但我只是想看看它是否能与我的手机配合使用[4.4],我正在使用它)。因此,它开始扫描,然后继续,没有给出错误,但没有检测到设备。也会触发OnLEScan事件,但其中的设备参数为null。我的LE设备就在那里并已连接。 在Google上,我发现如果BluetoothAdapter没有UUID,就会发生这种情况。如何设置UUID?何时调用/启动O

  • 如何从设备读取RAW数据?

  • 我试图用BLE API扫描附近的蓝牙设备,但它似乎不起作用 我已经在清单中添加了权限 以下内容在创建对象时 创建扫描仪回调对象并进一步扫描 在logcat中,我只看到以下内容 这是我的app build gradle } 有人能指出我在这里遗漏了什么吗?

  • 我读过很多关于用Android通过代码读取APN的话题,自从Android 4.2以来,这似乎已经不可能了。然而,所有的主题都超过了2/3年,我想知道是否有一个好的解决方案,使我能够读取设备的当前APN。我看到过一些关于SQLiteWrapper的东西,但它不起作用,或者我只是没有足够的资格让它起作用。