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

时间:2019-05-20 07:43:07

标签: android

我目前正在制作一个跟踪用户运动的应用程序。基本上,它要求用户以米为单位移动给定距离。而且由于用户可以在室内移动,因此我非常需要高精度。我正在使用FusedLocationProviderClient做我的工作。

应用启动时,它将检查位置设置以查看是否都满意。如果不是这样,它将提示一个对话框,允许用户仅点击OK,然后所有位置设置都将正确设置。

我必须使用LocationSettingsRequest.BuilderResolvableApiException类来做到这一点。

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

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

LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(2000);

然后在MainActivity中检查位置设置的代码:

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;
    }
}

我正在将Samsung Galaxy J7 Pro与Android OS版本8.1.0配合使用。在位置设置中,有两个选项Locating methodImprove accuracyLocating method具有3个选项,分别为High accuracyBattery savingPhone onlyImprove accuracy有两个选项,分别为Wi-Fi scanningBluetooth scanning

我尝试关闭设备位置,关闭Improve accuracy中的所有2个选项,然后将Locating method设置为Phone only。然后我打开我的应用程序,出现了这样的对话框: enter image description here

忘记用户单击NO THANKS时的情况。当用户单击OK时,我可以看到位置服务已激活。 Locating method也设置为High accuracy。但是Improve accuracy选项内部没有任何变化。

这让我感到奇怪。我想知道当Improve accuracy正在Locating methodHigh accuracy是否变得无用。还是根本没有用,我也必须以编程方式将它们打开。

很抱歉,我无法发布所有代码,因为它对我的问题而言非常复杂且多余。但是,如果您愿意,我可以创建一个全新的项目来演示该问题。而且我也不知道这也是问类似这样的事情的好地方。如果不是,您能给我看看吗?我感谢任何想法或解决方案。

编辑:因此,我创建了一个新的简单项目来演示此问题。您可以检查它here

2 个答案:

答案 0 :(得分:1)

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

根据documentation,如果用户禁用了蓝牙,则设置cout << (void*)ptr0 << endl; cout << (int)*ptr0 << endl; 会提示用户启用蓝牙扫描。

答案 1 :(得分:0)

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

当用户单击确定时,它会在提高准确性选项中打开 Wi-Fi扫描。请注意,它不会像通常那样上网时打开Wifi上网。它只是打开了名为 Wi-Fi扫描

的功能

蓝牙扫描功能以来,我不知道为什么ResolvableApiException无法打开它。但是由于它确实可以处理 Wi-Fi扫描,因此我认为ResolvableApiException足够聪明,可以决定该做什么。因此,我认为我不再需要担心准确性。