android 6.0之后锁屏一段时间搜索不到beacon设备 5C

最近做一款beacon相关的应用,我知道6.0之后搜索ble设备需要动态申请权限。我在activity申请权限的代码如下

@Override
protected void onResume() {
super.onResume();
Log.e("ScanActivity", "onResume方法");
//判断 当前android版本大于6.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Log.e("onResume","申请权限");

            requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
        }else {
            startBeaconService();
        }
    }else {
        startBeaconService();
    }


}

//判断网络是否可用
public  boolean isGpsEnable(final Context context) {

    LocationManager locationManager
            = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    if (gps || network) {
        return true;
    }
    Toast.makeText(getApplicationContext(), "网络不可用",Toast.LENGTH_SHORT).show();
    return false;
}
//回调权限
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
        case PERMISSION_REQUEST_COARSE_LOCATION:

            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (!isGpsEnable(this)){
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    startActivityForResult(intent,100);
                }else {
                    ScanActivity.this.finish();
                    Intent startIntent = new Intent(this, ScanActivity.class);
                    startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startIntent);
                    startBeaconService();
                }
            } else {

                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
            break;
    }
}

在使用该应用时可以正常搜索到beacon设备,但离开应用或者锁屏一段时间后,有的手机就开始搜索不到设备了,比如小米锁屏一分多钟后无法搜索到设备,点开屏幕再次聚焦到屏幕可以继续搜索。但华为、oppo之类的再次聚焦也不行,我关闭了搜索设备的activity和服务重新点开也不行,,,就是要把应用kill掉之后再打开应用才能再次搜索到设备。。。。

搜索设备的代码一直在跑,但检测不到beacon设备,因为6.0之后ACCESS_COARSE_LOCATION权限才能搜索到设备,而ACCESS_COARSE_LOCATION权限属于比较危险的权限,我猜测申请到这个权限然后是在离开应用一段时间后这个权限被系统收回去了所以无法搜索到设备。

有没有什么办法让这个权限不被系统收回?或者收回后如何再次申请又不会让用户有所感知,就是能到达持续搜索到设备的效果就好。我试过在连续几次搜索到的设备都是空的时候就开启1像素的activity在这里重新申请权限,但这个方法对小米有用,对华为没有用。

2个回答

首先,没明白为什么锁屏或者退到后台以后还需要去继续执行搜索,因为退到后台或者锁屏,系统会回收资源的,时间一长肯定会有问题,如果一定要这么做,那必须想办法保活,比如利用service等
其次,安卓6.0及以上,app内申请并且通过以后的权限应该是会一直持有的,不会被回收吧,除非手动去关闭这个权限,也就是说等你获得过位置权限以后,不管是锁屏也好home键退到后台也好,再次回到前台以后应该是直接绕过if判断而直接走的startBeaconService();方法,所以如果没必要在后台保活的话,建议退到后台的时候尽量去关掉搜索,回到前台以后再去重新执行搜索,这样会好一点

qq_39189034
jay lian 回复芒大大: 用的 uni-app
4 个月之前 回复
qq_39189034
jay lian 回复芒大大: 我现在也在做这个 锁屏时候获取不到 beacon设备 ,亮屏就可以了。
4 个月之前 回复
qq_39189034
jay lian 回复芒大大: 大佬 你这个怎么解决的呐,
4 个月之前 回复
qq_35696987
芒大大 因为要用beacon做室内定位,就像使用地图步行的导航,锁屏拿着手机也希望能听到声音提醒你左转右转。service已经保活了,确实绕过了权限的判断,就是那段代码一直还在执行(我打印了log,它还在跳动),但搜到的结果是空的;所以代码都在跑但明明设备就在旁边就是搜不到,我就以为是权限问题...
接近 2 年之前 回复

是不是可以监听锁屏跟开屏的广播做一些处理呢,锁屏后继续搜索之类的。

qq_34965487
有个小目标 回复qq_35696987: 大佬,找到方法解决没?
一年多之前 回复
qq_16258813
qq_16258813 砸了
接近 2 年之前 回复
qq_35696987
芒大大 做了呢,其实是搜索的代码还在跑。但搜索的结果是空的字符串。我猜是定位的权限被系统收回了
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问