【问题标题】:My app is not able to access the location of a specific device我的应用无法访问特定设备的位置
【发布时间】:2016-04-12 19:47:55
【问题描述】:

我以前玩过 Android 应用程序开发,但现在我正在开发我的第一个严肃的 Android 应用程序。我已经准备好了第一个版本,我们的客户想要对其进行测试。

应用程序使用设备的位置并将位置与其他数据一起发送到服务器。要被允许发送数据,设备必须已获得位置。我已经实现了必要的功能来要求用户访问和许可设备的位置。 (我正在使用 google play 服务获取该位置)

我的问题如下:在模拟器和我测试过的每台设备中,这都能正常工作。用户打开应用程序,应用程序请求权限/访问,并且用户能够使用该应用程序。 现在我已经构建了一个 .apk 文件供客户测试(使用 Android Studio > Build > Build APK)。我的老板开车去找客户,并在他们提供的设备上安装了 .apk(运行 Android 5.1.1 的三星 Galaxy S5 Neo)。在此设备上,我的应用无法获取设备的位置。该应用程序甚至不请求该位置的权限或访问权限。

我想知道是什么导致了这个问题。该设备上的其他应用程序(例如谷歌地图)能够很好地访问该位置。但我的应用程序不能。

我通过 Android Studio 将该应用部署到我的测试设备。这可能是问题吗?我是否需要配置其他选项才能通过 .apk 安装我的应用并访问设备的位置?

我还通过 .apk 将应用程序安装到 Sony 设备上。在那里,应用程序能够检索设备的位置。我还使用 Android Studio 将我的应用程序部署到设备(通过 Run),然后将其卸载,然后通过 .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: 我现在有了设备。当我在设备上从 Android Studio 安装/运行应用程序时,它会正确询问位置权限/设置。

【问题讨论】:

  • 不看代码很难判断,但是由于您的客户使用的是v22,您是否在android清单上设置了适当的权限?它还可以帮助您登录失败回调以查看失败的原因。
  • 我想是的。我在我的问题中编辑了一些代码。可悲的是,我无权访问该设备来调试它。我希望我的老板能够随身携带。

标签: android android-location fusedlocationproviderapi


【解决方案1】:

我得到了这种访问权限的解决方案。

我的应用无法访问特定设备的位置,因为某些设备在 App info 中有额外的权限设置。如果您需要访问联系人或位置等,您需要在设备权限管理器中为您的应用启用权限。

【讨论】:

  • 你是对的,谢谢你的回答,我的代码有效。
【解决方案2】:

在收到另一批无法使用该应用程序的手机后,我终于找到了解决问题的方法:当设备的 google play 服务过期时,我的“请求权限”代码不会是到达。但是我的主要活动的 onConnectionFailed 方法被调用了。

所以我添加了以下代码来解决连接到播放服务 api 期间的错误(感谢https://stackoverflow.com/a/22651625/5396040):

@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 play 服务已过时并提示用户更新它们。更新播放服务后,我的应用会正确请求位置设置和/或权限。

【讨论】:

    【解决方案3】:

    问题必须是您检查用户权限的 if 语句,问题似乎是您只要求 android.permission.ACCESS_FINE_LOCATION 但在代码中您也在 if 语句中请求 android.permission.ACCESS_COARSE_LOCATION。由于旧版本无法在运行时请求访问,它只会返回并且不会到达 LocationServices 调用。我认为最简单的方法是将该权限添加到您的清单中。或者您只能请求在您的服务中使用 ACCESS_FINE_LOCATION 而不要检查 ACCESS_COARSE_LOCATION。

    【讨论】:

    • 感谢您的回答。我尝试了两件事:添加粗略位置权限而不检查粗略位置权限(当然是分开的)。不幸的是,这并没有什么不同。
    • 是的,实际上我读到要求 FINE_LOCATION 隐含地要求 COARSE_LOCATION。我做了一些进一步的阅读,可能是用户没有安装谷歌服务,看看这个链接 [developers.google.com/android/guides/…?
    • 谢谢,我会调查的。
    • google play 服务似乎已安装。我现在有了设备。当我在设备上从 Android Studio 安装/运行应用程序时,它会正确询问位置权限/设置。
    【解决方案4】:

    先生,我认为您使用了错误的 apk 进行测试。只需按照以下步骤获取 apk: 项目文件夹 -> 应用程序 -> 构建 -> 输出 -> apk -> app-debug.apk

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 2018-01-06
      • 2011-12-01
      • 1970-01-01
      • 2018-08-07
      • 2017-08-23
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多