【问题标题】:requestLocationUpdates permissionrequestLocationUpdates 权限
【发布时间】:2017-08-24 12:39:35
【问题描述】:

我有一个将 GPS 位置发送到 DB 的 Android 应用程序。 今天测试了一下,发现location manager需要权限才能拨打requestLocationUpdates

我想将权限设置为允许,我不想向设备或用户请求权限。

现在,代码需要添加一些代码来请求权限?

     /**
     * Enable location services
     */
    public void connect() {
        Log.d(TAG, ".connect() entered");

        // Check if location provider is enabled
        String locationProvider = LocationManager.NETWORK_PROVIDER;
        if (!locationManager.isProviderEnabled(locationProvider)) {
            Log.d(TAG, "Location provider not enabled.");
            app.setCurrentLocation(null);
            return;
        }

        // register for location updates, if location provider and permission are available
        String bestProvider = locationManager.getBestProvider(criteria, false);
        if (bestProvider != null) {
            locationManager.requestLocationUpdates(bestProvider, Constants.LOCATION_MIN_TIME, Constants.LOCATION_MIN_DISTANCE, this);
            app.setCurrentLocation(locationManager.getLastKnownLocation(locationProvider));
        }
    }

    /**
     * Disable location services
     */
    public void disconnect() {
        Log.d(TAG, ".disconnect() entered");

        String locationProvider = LocationManager.NETWORK_PROVIDER;
        if (locationManager.isProviderEnabled(locationProvider)) {
            locationManager.removeUpdates(this);
        }
    }

我也添加了清单。 PS:此权限是新要求的,因为我几天前一直在同一设备(Android 4.4)上测试该应用程序,并且运行良好。 自 2017/08/21 以来,Android 上的某些默认权限是否可能已更改?如果可以,我该如何更改?

【问题讨论】:

  • 我想将权限设置为允许,我不想向设备或用户请求权限。太糟糕了,你想要的是不可能的
  • 你能贴一些代码吗?
  • @Sandeepdhiman 我已经添加了。

标签: android permissions location locationmanager


【解决方案1】:

您必须从 Marshmallow 版本的 android 请求运行时许可。通过这个link

从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时。这种方法简化了应用程序安装过程,因为用户在安装或更新应用程序时不需要授予权限。它还使用户可以更好地控制应用程序的功能;例如,用户可以选择让相机应用程序访问相机而不是设备位置。用户可以通过进入应用程序的设置屏幕随时撤销权限。

我们使用以下代码检查位置权限:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }

【讨论】:

  • 是的,我实际上是在询问这段代码。我的设备是 API 17。
  • 你如何解释它几天前在我的设备上正常工作的事实。
  • 可能你改了buildToolsVersiontargetSdkVersioncompileSdkVersion
【解决方案2】:

您必须编写一个方法来检查用户是否授予权限。如果没有,则请求用户许可。 Constants.LOCATION_PERMISSION_REQUEST 只是在 onRequestpermission 结果中得到回调时匹配的请求码

public static boolean checkLocationPermission(Activity activity){
        if(ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED
            || ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED){

            ActivityCompat.requestPermissions(activity, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION,
                    android.Manifest.permission.ACCESS_COARSE_LOCATION}, Constants.LOCATION_PERMISSION_REQUEST);
            return false;
        }
        return true;
    }

在用户允许的情况下,您将在被覆盖的方法“onRequestPermissionsResult()”上获得回调

【讨论】:

  • 我认为这对我有用。你能告诉我什么是“WaselGiftConstants”吗?
  • 你能解释一下请求代码吗?我无法在我的应用程序上解决它。你有什么可以帮助的想法吗?谢谢
  • @ch.ihssen 我认为这个链接会更好地帮助你... :-) developer.android.com/training/permissions/…
【解决方案3】:

它是检查权限的最佳库 com.github.fccaikai:AndroidPermissionX:1.0.0

示例代码:

final PermissionCompat.Builder builder = new PermissionCompat.Builder(activity);

    builder.addPermissions(new String[]{
            Manifest.permission.CAMERA,
            Manifest.permission.RECORD_AUDIO
    });

    builder.addPermissionRationale(activity.getString(R.string.permission_rationale));

    builder.addRequestPermissionsCallBack(new OnRequestPermissionsCallBack() {
        @Override
        public void onGrant() {
            Log.d(TAG, "Grant");
        }

        @Override
        public void onDenied(String permission) {
            Log.e(TAG, "Denied");
        }
    });

    builder.build().request();

【讨论】:

  • 我想获取 GPS 位置而不是相机
  • 这只是示例。将它们更改为您的权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2019-06-29
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多