我的应用无法访问特定设备的位置
My app is not able to access the location of a specific device
我以前玩过 Android 应用程序开发,但我现在正在为 Android 开发我的第一个正式应用程序。我已经准备好我的第一个版本,我们的客户想要测试。
该应用程序使用设备的位置并将该位置与其他数据一起发送到服务器。要允许发送数据,设备必须已获得位置。我已经实现了必要的功能来请求用户访问和许可设备的位置。 (我正在为该位置使用 google 播放服务)
我的问题如下:在模拟器和我测试过的每台设备中,这工作正常。用户打开应用程序,应用程序请求 permissions/access 并且用户能够使用该应用程序。
现在我已经构建了一个 .apk 文件供客户测试(使用 Android Studio > Build > Build APK)。我的老板开车去找客户并在他们提供的设备上安装了 .apk(三星 Galaxy S5 Neo 运行 Android 5.1.1)。在此设备上,我的应用程序无法获取设备的位置。该应用程序甚至不要求权限或访问该位置。
我想知道是什么导致了这个问题。该设备上的其他应用程序(例如 Google 地图)能够很好地访问该位置。但是我的应用程序不能。
我通过 Android Studio 将应用程序部署到我的测试设备。这可能是问题所在吗?我是否需要配置其他选项才能通过 .apk 安装我的应用程序并访问设备的位置?
我还通过 .apk 将应用程序安装到索尼设备上。该应用程序能够在那里检索设备的位置。我还使用 Android Studio 将我的应用程序部署到设备(通过 运行),然后卸载它,然后通过 .apk 再次安装它。
问题是特定于设备还是在能够通过 apk 文件安装我的应用程序并使其正常运行之前我是否需要考虑其他事项?
编辑:我的一些代码...
权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
我检查位置设置的代码:
private void checkLocationSettings(PendingResult<LocationSettingsResult> result) {
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
// final LocationSettingsStates locationSettingsStates = locationSettingsResult.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
// Ignore the error;
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
break;
}
}
});
}
我检查权限的代码:
protected void startLocationUpdates() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, this.permissions, REQUEST_LOCATION_ID);
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(this.googleApiClient, this.locationRequest, this);
}
编辑 2:
我现在得到了设备。当我在设备上 installing/running 来自 Android Studio 的应用程序时,它正确地请求位置 permissions/settings。
问题必须是您检查用户权限的 if 语句,问题似乎是您只要求 android.permission.ACCESS_FINE_LOCATION
但在代码中您还要求 android.permission.ACCESS_COARSE_LOCATION
在 if 语句中。由于旧版本无法在运行时请求访问权限,因此它只会 return 而不会到达 LocationServices 调用。我认为最简单的方法是将该权限添加到您的清单中。或者您只能请求 ACCESS_FINE_LOCATION 在您的服务中使用,而不检查 ACCESS_COARSE_LOCATION.
先生,我认为您在测试中使用了错误的 apk。只需按照以下步骤获取apk:
项目文件夹 -> app -> build -> outputs -> apk -> app-debug.apk
在收到另一批无法使用该应用程序的手机后,我终于找到了解决问题的方法:当设备的 google 播放服务过时时,我的 "ask for permissions" 无法访问代码。但是我的主要 activity 的 onConnectionFailed 方法被调用了。
所以我添加了以下代码来解决连接播放服务期间的错误api(感谢):
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.i(TAG, "Connection failed: ConnectionResult.getCollectionStatus() = " + connectionResult.getErrorCode());
GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
int status = googleApiAvailability.isGooglePlayServicesAvailable(this);
if (status != ConnectionResult.SUCCESS) {
if (googleApiAvailability.isUserResolvableError(status)) {
googleApiAvailability.getErrorDialog(this, status,
REQUEST_CODE_RECOVER_PLAY_SERVICES).show();
} else {
Toast.makeText(this, "This device is not supported.",
Toast.LENGTH_LONG).show();
finish();
}
}
}
现在我的应用程序通知用户 google 播放服务已过期并提示用户更新它们。播放服务更新后,我的应用会正确请求位置设置 and/or 权限。
我得到了这种访问权限的解决方案。
我的应用程序无法访问特定设备的位置,因为某些设备在 App info 中有额外的权限设置。如果您需要访问联系人或位置等,您需要在设备权限管理器中为您的应用启用权限。
我以前玩过 Android 应用程序开发,但我现在正在为 Android 开发我的第一个正式应用程序。我已经准备好我的第一个版本,我们的客户想要测试。
该应用程序使用设备的位置并将该位置与其他数据一起发送到服务器。要允许发送数据,设备必须已获得位置。我已经实现了必要的功能来请求用户访问和许可设备的位置。 (我正在为该位置使用 google 播放服务)
我的问题如下:在模拟器和我测试过的每台设备中,这工作正常。用户打开应用程序,应用程序请求 permissions/access 并且用户能够使用该应用程序。 现在我已经构建了一个 .apk 文件供客户测试(使用 Android Studio > Build > Build APK)。我的老板开车去找客户并在他们提供的设备上安装了 .apk(三星 Galaxy S5 Neo 运行 Android 5.1.1)。在此设备上,我的应用程序无法获取设备的位置。该应用程序甚至不要求权限或访问该位置。
我想知道是什么导致了这个问题。该设备上的其他应用程序(例如 Google 地图)能够很好地访问该位置。但是我的应用程序不能。
我通过 Android Studio 将应用程序部署到我的测试设备。这可能是问题所在吗?我是否需要配置其他选项才能通过 .apk 安装我的应用程序并访问设备的位置?
我还通过 .apk 将应用程序安装到索尼设备上。该应用程序能够在那里检索设备的位置。我还使用 Android Studio 将我的应用程序部署到设备(通过 运行),然后卸载它,然后通过 .apk 再次安装它。
问题是特定于设备还是在能够通过 apk 文件安装我的应用程序并使其正常运行之前我是否需要考虑其他事项?
编辑:我的一些代码...
权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
我检查位置设置的代码:
private void checkLocationSettings(PendingResult<LocationSettingsResult> result) {
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
// final LocationSettingsStates locationSettingsStates = locationSettingsResult.getLocationSettingsStates();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
// Ignore the error;
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
break;
}
}
});
}
我检查权限的代码:
protected void startLocationUpdates() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, this.permissions, REQUEST_LOCATION_ID);
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(this.googleApiClient, this.locationRequest, this);
}
编辑 2: 我现在得到了设备。当我在设备上 installing/running 来自 Android Studio 的应用程序时,它正确地请求位置 permissions/settings。
问题必须是您检查用户权限的 if 语句,问题似乎是您只要求 android.permission.ACCESS_FINE_LOCATION
但在代码中您还要求 android.permission.ACCESS_COARSE_LOCATION
在 if 语句中。由于旧版本无法在运行时请求访问权限,因此它只会 return 而不会到达 LocationServices 调用。我认为最简单的方法是将该权限添加到您的清单中。或者您只能请求 ACCESS_FINE_LOCATION 在您的服务中使用,而不检查 ACCESS_COARSE_LOCATION.
先生,我认为您在测试中使用了错误的 apk。只需按照以下步骤获取apk: 项目文件夹 -> app -> build -> outputs -> apk -> app-debug.apk
在收到另一批无法使用该应用程序的手机后,我终于找到了解决问题的方法:当设备的 google 播放服务过时时,我的 "ask for permissions" 无法访问代码。但是我的主要 activity 的 onConnectionFailed 方法被调用了。
所以我添加了以下代码来解决连接播放服务期间的错误api(感谢):
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.i(TAG, "Connection failed: ConnectionResult.getCollectionStatus() = " + connectionResult.getErrorCode());
GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
int status = googleApiAvailability.isGooglePlayServicesAvailable(this);
if (status != ConnectionResult.SUCCESS) {
if (googleApiAvailability.isUserResolvableError(status)) {
googleApiAvailability.getErrorDialog(this, status,
REQUEST_CODE_RECOVER_PLAY_SERVICES).show();
} else {
Toast.makeText(this, "This device is not supported.",
Toast.LENGTH_LONG).show();
finish();
}
}
}
现在我的应用程序通知用户 google 播放服务已过期并提示用户更新它们。播放服务更新后,我的应用会正确请求位置设置 and/or 权限。
我得到了这种访问权限的解决方案。
我的应用程序无法访问特定设备的位置,因为某些设备在 App info 中有额外的权限设置。如果您需要访问联系人或位置等,您需要在设备权限管理器中为您的应用启用权限。