簡體   English   中英

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

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

我正在創建一個使用GPS組成的應用程序。 在這里,當我在4.x5.x設備上運行代碼時,它可以正常工作。 但是來到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 我是根據我的知識閱讀的,我們想在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);

這是日志貓:

  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

要求許可的代碼:

    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
    }

結果:

@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
        }
    }
}

在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

調用您的主要活動-> onCreate

checkAndAddPermission();

在棉花糖中,您需要添加運行時權限,並按照以下步驟添加運行時權限

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

如果未授予許可,則必須如下所示請求許可

 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");
    }
}

將上面的代碼放在另一個類中

並將代碼添加到您獲取位置的“活動”中

 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