Android 我是否应该以编程方式打开Wifi和蓝牙扫描以提高定位精度?

Android 我是否应该以编程方式打开Wifi和蓝牙扫描以提高定位精度?,android,Android,我目前正在制作一个跟踪用户移动的应用程序。基本上,它要求用户以米为单位移动给定的距离。由于用户可以在室内移动,我迫切需要高精度。我正在使用FusedLocationProviderClient来完成我的工作 当应用程序启动时,它将检查位置设置,看看它们是否都满足要求。如果没有,它将提示一个对话框,允许用户只需点击OK,然后所有位置设置都将正确设置 我必须使用locationsetingsrequest.Builder和ResolvableApiException类来实现这一点 LocationS

我目前正在制作一个跟踪用户移动的应用程序。基本上,它要求用户以米为单位移动给定的距离。由于用户可以在室内移动,我迫切需要高精度。我正在使用FusedLocationProviderClient来完成我的工作

当应用程序启动时,它将检查位置设置,看看它们是否都满足要求。如果没有,它将提示一个对话框,允许用户只需点击
OK
,然后所有位置设置都将正确设置

我必须使用
locationsetingsrequest.Builder
ResolvableApiException
类来实现这一点

LocationSettingsRequest.Builder
类获取一个
LocationRequest
对象作为输入,然后检查设备中的位置设置是否满足给定的
LocationRequest
对象。如果不满足设备的位置设置,则执行此操作将抛出一个
ResolvableApiException
对象。并且,
ResolvableApiException
对象可以提示一个对话框,允许用户正确设置这些设置。更多详情请访问developer.android.com

LocationSettingsRequest.Builder
需要一个
LocationRequest
作为输入,因此这是我的
LocationRequest

LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(2000);
和“我的主要活动”中的“我的代码”,以检查位置设置:

public void checkLocationSettings(){
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
    builder.addLocationRequest(locationRequest);
    SettingsClient settingsClient = LocationServices.getSettingsClient(this);
    Task<LocationSettingsResponse> task = settingsClient.checkLocationSettings(builder.build());
    task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            // do works
        }
    });
    task.addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            try {
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this, 1);
            } catch (IntentSender.SendIntentException e1) {
                e1.printStackTrace();
            }
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (requestCode){
        case 1:
            if(resultCode== RESULT_OK){
                // do works
            }
            else{
                // I will automatically terminate the app in this case
            }
            break;
    }
}
public void checkLocationSettings(){
LocationSettingsRequest.Builder=新建LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
SettingsClient SettingsClient=LocationServices.getSettingsClient(此);
Task Task=settingsClient.checkLocationSettings(builder.build());
task.addOnSuccessListener(这个,新的OnSuccessListener(){
@凌驾
成功时公共无效(位置设置响应位置设置响应){
//工作
}
});
task.addOnFailureListener(这是新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
试一试{
ResolvableApiException resolvable=(ResolvableApiException)e;
可解决。开始解决结果(main activity.this,1);
}捕获(IntentSender.SendIntentException e1){
e1.printStackTrace();
}
}
});
}
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
开关(请求代码){
案例1:
if(resultCode==RESULT\u OK){
//工作
}
否则{
//在这种情况下,我将自动终止应用程序
}
打破
}
}
我正在使用三星Galaxy J7 Pro和Android操作系统8.1.0版。在定位设置中,有两个选项是
定位方法
提高精度
<代码>定位方法有3个选项,分别是
高精度
节省电池
仅限手机
<代码>提高准确性有两个选项,分别是
Wi-Fi扫描
蓝牙扫描

我尝试关闭设备位置,关闭了
提高准确性
中的所有2个选项,并将
定位方法
设置为
仅限手机
。然后我打开我的应用程序,出现了这样一个对话框:

忘记用户单击“否,谢谢”时的情况。当用户单击确定时,我可以看到定位服务已被激活。
定位方法
也可以设置为
高精度
。但是
改进准确性
选项中没有任何更改

这让我感到奇怪。我想知道当
定位方法
正在
高精度
时,
提高精度
是否变得无用。或者它一点用都没有,我也必须以编程方式打开它们

很抱歉,我不能发布我所有的代码,因为它对于我的问题来说非常复杂和冗余。但是如果你愿意,我可以创建一个全新的项目来演示这个问题。我不知道这是不是一个好地方也可以问这样的问题。如果不是,你能给我看一个吗?我欣赏任何想法或解决方案


编辑:所以我创建了一个新的简单项目来演示这个问题。您可以检查。

根据扫描设置说明,即使用户关闭了wifi和蓝牙,wifi和蓝牙扫描也可以工作。因此,不需要手动打开蓝牙/wifi


根据,设置
builder.setNeedBle(true)应提示用户启用蓝牙扫描。

结果显示
ResolvableApiException
实际上可以在“提高准确性”选项中打开Wi-Fi扫描。但仅当Wifi未打开时。在这种情况下,对话框将如下所示:

当用户单击“确定”时,它会在“提高准确性”选项中打开Wi-Fi扫描。请注意,它不会像你通常上网或类似的方式那样打开Wifi。它只是开启了一种叫做Wi-Fi扫描的功能


至于蓝牙扫描功能,我不知道为什么
ResolvableApiException
没有打开它。但由于它确实处理Wi-Fi扫描,我假设
ResolvableApiException
足够聪明,可以决定它必须做什么。因此,我想我不必再担心准确性。

使用GitHub并共享您的代码。现在,为什么谷歌提供管理选项?并非所有的手机都有相同的硬件和规格。一些人将使用“提高准确性”和“高准确性”来改进他们的服务,而其他人则不提供这一功能,Android操作系统将忽略这一功能,你将不会发现任何实质性的改进。我建议你检查方法和@Teocci谢谢。正在检查位置设置状态,同时