我目前正在制作一个跟踪用户运动的应用程序。基本上,它要求用户以米为单位移动给定距离。而且由于用户可以在室内移动,因此我非常需要高精度。我正在使用FusedLocationProviderClient
做我的工作。
应用启动时,它将检查位置设置以查看是否都满意。如果不是这样,它将提示一个对话框,允许用户仅点击OK
,然后所有位置设置都将正确设置。
我必须使用LocationSettingsRequest.Builder
和ResolvableApiException
类来做到这一点。
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 method
和Improve accuracy
。 Locating method
具有3个选项,分别为High accuracy
,Battery saving
和Phone only
。 Improve accuracy
有两个选项,分别为Wi-Fi scanning
和Bluetooth scanning
。
我尝试关闭设备位置,关闭Improve accuracy
中的所有2个选项,然后将Locating method
设置为Phone only
。然后我打开我的应用程序,出现了这样的对话框:
忘记用户单击NO THANKS
时的情况。当用户单击OK
时,我可以看到位置服务已激活。 Locating method
也设置为High accuracy
。但是Improve accuracy
选项内部没有任何变化。
这让我感到奇怪。我想知道当Improve accuracy
正在Locating method
时High accuracy
是否变得无用。还是根本没有用,我也必须以编程方式将它们打开。
很抱歉,我无法发布所有代码,因为它对我的问题而言非常复杂且多余。但是,如果您愿意,我可以创建一个全新的项目来演示该问题。而且我也不知道这也是问类似这样的事情的好地方。如果不是,您能给我看看吗?我感谢任何想法或解决方案。
编辑:因此,我创建了一个新的简单项目来演示此问题。您可以检查它here。
答案 0 :(得分:1)
根据扫描设置说明,即使用户关闭了wifi和蓝牙功能,也可以使用wifi和蓝牙扫描功能。因此,无需手动打开蓝牙/ wifi。
根据documentation,如果用户禁用了蓝牙,则设置cout << (void*)ptr0 << endl;
cout << (int)*ptr0 << endl;
会提示用户启用蓝牙扫描。
答案 1 :(得分:0)