最后我遇到了一个问题,由于缺少 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION,我无法扫描信标。
我尝试使用此处找到的代码来修复它找到的代码来修复它,但它实际上对我有部分帮助。
当此视图出现时
,我单击允许。之后我不再收到此java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results
错误,但我仍然看不到我的信标,当我打开设置视图时,位置已关闭,如下图所示。
当我用手指打开位置时,一切正常,所以我可以看到我的信标和应用程序正常工作。这里的问题是这些某种错误,或者我错过了在打开对设备位置的访问后从后面的代码中打开位置的东西?
对于开发,我使用 Nexus 5x 和 android 7.1.1。
编辑:代码是从上面链接的教程中复制的,带有启动信标扫描仪的按钮的片段:
public void onBleClicked(View view)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("This app needs location access");
builder.setMessage("Please grant location access so this app can detect beacons.");
builder.setPositiveButton(android.R.string.ok, null);
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
}
}
});
builder.show();
}
BleManager bleManager = new BleManager(this);
bleManager.tryToTurnOnBle();
}
声明权限的清单片段:
<!-- app only for phones -->
<uses-feature android:name="android.hardware.telephony"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
蓝牙权限显然在库中。
我现在发现的是,这里有类似的问题。但是这种将用户重定向到位置选项屏幕的解决方案对我来说似乎并不干净。