我是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"
}
是否添加这些所有权限:
<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上运行良好
谢谢大家的回复和帮助!我刚刚解决了我的案子!
我所做的是,除了在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的东西,但它不起作用,或者我只是没有足够的资格让它起作用。