简体   繁体   English

如何解决Android中的“ gps”位置提供者安全异常

[英]How to solve “gps” location provider security exception in android

I am creating an application that consists of using GPS. 我正在创建一个使用GPS组成的应用程序。 Here when i was running my code on 4.x and 5.x devices it works fine. 在这里,当我在4.x5.x设备上运行代码时,它可以正常工作。 But coming to the android 6.0(Marshmallow) version devices it was showing an exception called java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission . 但是来到android 6.0(Marshmallow)版本的设备时,它显示了一个名为java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission的异常java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission I read about this according to my knowledge we want to take permissions in runtime for devices 6.0 and higher.But here i was confused that how i can take the permission runtime in my code can any one tell me detail about this This is my code 我是根据我的知识阅读的,我们想在6.0或更高版本的设备上获取运行时permissions 。但是在这里,我很困惑如何在我的代码中获取权限运行时,谁能告诉我有关此的详细信息,这是我的代码

if (locationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER))
            if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                if (locationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER))
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                            0, this); //This is where i am getting error


                if (locationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER))
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

This is the Log cat: 这是日志猫:

  java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
      at android.os.Parcel.readException(Parcel.java:1599)
      at android.os.Parcel.readException(Parcel.java:1552)
      at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:606)
      at android.location.LocationManager.requestLocationUpdates(LocationManager.java:885)
      at android.location.LocationManager.requestLocationUpdates(LocationManager.java:469)
      at com.subtabs.Dailyreport.Today_job.onCreateView(Today_job.java:235)
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
      at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1177)
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1025)
      at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1723)
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:788)
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:648)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:223)
      at android.view.View.measure(View.java:19169)
      at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1075)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1723)
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:788)
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:648)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:223)
      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1723)
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:788)
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:648)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:223)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1723)
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:788)
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:648)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124)
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:223)
      at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2747)
      at android.view.View.measure(View.java:19169)
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2485)
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1444)
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1698)
    at

Code to ask permission: 要求许可的代码:

    private static final int REQUEST_PERMISSION_LOCATION = 255; // int should be between 0 and 255

    ...

    // When you need the permission, e.g. onCreate, OnClick etc.
    if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);
    } else {
        // We have already permission to use the location
    }

And the result: 结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_PERMISSION_LOCATION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // We now have permission to use the location
        }
    }
}

And in the Android Manifest: 在Android清单中:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
//region Marshmellows permissions
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
private void checkAndAddPermission() {
    List<String> permissionsNeeded = new ArrayList<>();

    final List<String> permissionsList = new ArrayList<>();
    if (!addPermission(permissionsList, android.Manifest.permission.ACCESS_FINE_LOCATION))
        permissionsNeeded.add("GPS");

    if (!addPermission(permissionsList, android.Manifest.permission.ACCESS_COARSE_LOCATION))
        permissionsNeeded.add("Coarse");

    if (permissionsList.size() > 0) {
        if (permissionsNeeded.size() > 0) {
            // Need Rationale
            String message = "You need to grant access to " + permissionsNeeded.get(0);
            for (int i = 1; i < permissionsNeeded.size(); i++)
                message = message + ", " + permissionsNeeded.get(i);

            ActivityCompat.requestPermissions(MainActivity.this, permissionsList.toArray(new String[permissionsList.size()]),
                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
        } else {
            ActivityCompat.requestPermissions(MainActivity.this, permissionsList.toArray(new String[permissionsList.size()]),
                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
        }
    }
}

 @TargetApi(Build.VERSION_CODES.M)
private boolean addPermission(List<String> permissionsList, String permission) {
    if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
        permissionsList.add(permission);
        // Check for Rationale Option
        if (!shouldShowRequestPermissionRationale(permission))
            return false;
    }
    return true;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {
            Map<String, Integer> perms = new HashMap<>();
            // Initial
            perms.put(android.Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
            perms.put(android.Manifest.permission.ACCESS_COARSE_LOCATION, PackageManager.PERMISSION_GRANTED);

            // Fill with results
            for (int i = 0; i < permissions.length; i++)
                perms.put(permissions[i], grantResults[i]);
            // Check for ACCESS_FINE_LOCATION
            if (perms.get(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                    && perms.get(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                // All Permissions Granted
                startBackgroundServiceForLocationUpdate();
            } else {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)
                        .show();
            }
        }
        break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
//endregion

call in your main activity->onCreate 调用您的主要活动-> onCreate

checkAndAddPermission();

In Marshmallow you need to add the runtime permission add run time permission by following 在棉花糖中,您需要添加运行时权限,并按照以下步骤添加运行时权限

 public boolean checkPermissionForLocation() {
        int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION);
        if (result == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            return false;
        }
    }

If permission is not granted you have to ask for permission like below 如果未授予许可,则必须如下所示请求许可

 public void requestPermissionForLocation() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION)) {
        Toast.makeText(activity, "Location permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, "1");
    } else {
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, "1");
    }
}

Put the above code in a different class 将上面的代码放在另一个类中

and add the code in your Activity where you are fetching the location 并将代码添加到您获取位置的“活动”中

 MarshMallowPermission marshMallowPermission;

//Inside onCreate
  marshMallowPermission = new MarshMallowPermission(this);

 if (!marshMallowPermission.checkPermissionForLocation()) {
                                        marshMallowPermission.requestPermissionForLocation();
                                    } else {
                                      //Do work here
                                    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM