Подтвердить что ты не робот

Поставщик местоположения "gps" требует разрешения ACCESS_FINE_LOCATION для Android версии 6.0

В файле манифеста Android я добавил следующие разрешения для gps для доступа к местоположению

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Я обновляю настройки местоположения, как показано ниже, с помощью класса Location Manager

 private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
 private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
 locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    MIN_TIME_BW_UPDATES,
                    MIN_DISTANCE_CHANGE_FOR_UPDATES, 
                    this
                );

Но вышеприведенная строка дает исключение, указывающее

"gps" location provider requires ACCESS_FINE_LOCATION permission

Эта вещь происходит только с targetSDKVersion 23 (i.e с android 6.0), и я также тестировал в android 5.1, который отлично работает.

Пожалуйста, помогите!! Спасибо в Advance.

4b9b3361

Ответ 1

Начиная с 6.0 некоторые разрешения считаются "опасными" (FINE_LOCATION - один из них).

Чтобы защитить пользователя, они должны быть авторизованы во время выполнения, поэтому пользователь знает, связано ли это с его действием.

Для этого:

 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);

Он покажет DialogBox, в котором пользователь будет выбирать, как авторизовать приложение, чтобы использовать его или нет.

Затем получите ответ пользователя с помощью этой функции:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
        return;
        }
            // other 'case' lines to check for other
            // permissions this app might request
    }
}

Если пользователь примет его один раз, ваше приложение запомнит его, и вам больше не нужно будет отправлять этот DialogBox. Обратите внимание, что пользователь может отключить его позже, если он это решит. Затем, прежде чем запрашивать местоположение, вам нужно будет проверить, разрешено ли разрешение:

public boolean checkLocationPermission()
{
    String permission = "android.permission.ACCESS_FINE_LOCATION";
    int res = this.checkCallingOrSelfPermission(permission);
    return (res == PackageManager.PERMISSION_GRANTED);
}

Все объяснено в документации на Android: http://developer.android.com/training/permissions/requesting.html

Ответ 2

Попробуйте этот код

private void marshmallowGPSPremissionCheck() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                && getActivity().checkSelfPermission(
                Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && getActivity().checkSelfPermission(
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
                            Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSION_LOCATION);
        } else {
            //   gps functions.
        }
    }

добавьте это также..................

@Override
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permissions, int[] grantResults) {
        if (requestCode == MY_PERMISSION_LOCATION
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //  gps functionality
        }
    }

Ответ 3

У нас есть некоторые изменения в разрешениях на Android с версии 6. Вы должны согласиться с разрешениями на время их использования, а не при установке приложения. Если вы используете buildtools версии 23, могут возникнуть некоторые проблемы. Проверьте эту ссылку, чтобы понять. Перейдите в настройки устройствa > приложения и выберите свое приложение, затем примите разрешения вручную и проверьте, не решена ли ваша проблема.

Ответ 4

Недавно я столкнулся с этой проблемой. В Android 6.0 вам необходимо явно запрашивать необходимые разрешения, когда вы используете их в приложении. Если вы этого не сделаете, разрешение на местоположение автоматически будет отклонено.

    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(thisActivity,
                    Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user response! After the user
            // sees the explanation, try again to request the permission.

        } else {

            // No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_FINE_LOCATION);

            // MY_PERMISSIONS_REQUEST_FINE_LOCATION is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }

Дополнительная информация здесь: http://developer.android.com/training/permissions/requesting.html