android - Android - 我的应用程序可以在打开谷歌地图之前获取位置信息,尽管它具有相关权限
问题描述
我是 Android 开发的新手。所以我的问题可能太基本了。非常遗憾。现在我正在维护以前编写的代码。
此应用程序使用手机的定位服务。在清单文件中写着:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
但是虽然用户允许使用位置服务,但在大多数情况下,应用程序无法直接获取位置。
例如,虽然我的应用程序无法获取位置信息,但打开 Google 地图应用程序后,我的应用程序始终可以获取位置信息。然后我对位置没有问题。但首先我必须用谷歌地图触发。
什么可能导致这种情况?为什么我的应用打开谷歌地图后可以获取位置信息?我的清单文件中是否需要其他权限?
我的代码块如下所示,
private static final int LOCATION_SERVICES_RESOLUTION_REQUEST = 9001;
private void initMainActivity() {
int fineAccessGranted = ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
int coarseAccessGranted = ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION);
int externalWrite = ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
int externalRead = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE);
int camera = ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA);
ArrayList<String> permissionsNeeded = new ArrayList<String>();
if (fineAccessGranted == PackageManager.PERMISSION_DENIED)
permissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
if (coarseAccessGranted == PackageManager.PERMISSION_DENIED)
permissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION);
if (externalWrite == PackageManager.PERMISSION_DENIED)
permissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (externalRead == PackageManager.PERMISSION_DENIED)
permissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
if (camera == PackageManager.PERMISSION_DENIED)
permissionsNeeded.add(Manifest.permission.CAMERA);
if (permissionsNeeded.size() == 0) {
this.initMainActivityAfterPermissions();
} else {
ActivityCompat.requestPermissions(this, permissionsNeeded.toArray(new String[0]), LOCATION_SERVICES_RESOLUTION_REQUEST);
}
}
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case LOCATION_SERVICES_RESOLUTION_REQUEST: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
this.initMainActivityAfterPermissions();
} else {
}
return;
}
获取位置的代码片段;
result = LocationServices.FusedLocationApi.getLastLocation(instance.mGoogleApiClient);
解决方案
基本上这意味着您尝试通过检索位置mFusedLocationClient.getLastLocation()
并且此时设备上没有位置。所以你需要请求位置更新,比如mFusedLocationClient.requestLocationUpdates
. 此链接将很有用https://developer.android.com/training/location/receive-location-updates?hl=es和https://github.com/googlesamples/android-play-location
推荐阅读
- javascript - 正负浮点型正则表达式
- fullcalendar - 选择日期后全日历填充事件
- javascript - 使用 JS 在迭代期间按一个字段对 JSON 数组进行排序
- python - 当用户进入网站/链接时,有没有办法调用函数?
- java - 在 Android Studio 中从 Github 克隆项目
- intellij-idea - 有没有人知道如何创建“运行/远程”配置 IntelIj 来连接 Wildfly 服务器,请告诉我
- react-native - 任何可用于 react-native 的应用内文档(pdf、docx、xslx)查看器库模块?
- c# - 创建索引时,在elasticsearch中获取“Query_shard_exception”
- python - 查找在指定小时内完成任务所花费的时间
- java - 使用 StringBuilder 连接查询字符串