Ошибка CheckPermissions для LocationManager в Android Studio

У меня было хорошее рабочее приложение для GetGeoLocation для уровня API 23 (с использованием checkSelfPermission). Но затем мне пришлось сделать его совместимым с уровнем API 21. Итак, checkSelfPermission не работал, поскольку он был введен в уровне API 23.

Итак, я изменил код, чтобы учесть это:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    CheckForCoarseLocationPermission();

}
private void CheckForCoarseLocationPermission()
{
    if (android.os.Build.VERSION.SDK_INT >= 23)
    {
        // ANDROID 6.0 AND UP!
        boolean accessCoarseLocationAllowed = false;
        try
        {
            // Invoke checkSelfPermission method from Android 6 (API 23 and UP)
            java.lang.reflect.Method methodCheckPermission = Activity.class.getMethod("checkSelfPermission", java.lang.String.class);
            Object resultObj = methodCheckPermission.invoke(this, Manifest.permission.ACCESS_COARSE_LOCATION);
            int result = Integer.parseInt(resultObj.toString());
            if (result == PackageManager.PERMISSION_GRANTED)
            {
                accessCoarseLocationAllowed = true;


            }
        }
        catch (Exception ex)
        {
        }
        if (accessCoarseLocationAllowed)
        {
            Log.v("TAG","Granted");
            LocationManager locationManager=    (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,new LocationListener());//ERROR Happening Here!!!!!!!!!!!
        }
        try
        {
            // We have to invoke the method "void requestPermissions (Activity activity, String[] permissions, int requestCode) "
            // from android 6
            java.lang.reflect.Method methodRequestPermission = Activity.class.getMethod("requestPermissions", java.lang.String[].class, int.class);
            methodRequestPermission.invoke(this, new String[]
                    {
                            Manifest.permission.ACCESS_FINE_LOCATION
                    }, 0x12345);
        }
        catch (Exception ex)
        {
        }
    }
}

Теперь LocationManager.requestLocationUpdate выдает ошибку Вызов требует разрешения, которое может быть отклонено пользователем: код должен явно проверять наличие разрешения (с checkPermission) или явно обрабатывать потенциальное SecurityException меньше

Как с этим справиться, если я хочу использовать LocationManager и CheckPermission для уровня API >=21.

Пожалуйста, помогите.


person Sourav Das    schedule 24.08.2016    source источник
comment
stackoverflow.com /вопросы/38141523/   -  person Sohail Zahid    schedule 24.08.2016
comment
если (Manifest.permission.ACCESS_FINE_LOCATION== PackageManager.PERMISSION_GRANTED || Manifest.permission.ACCESS_COARSE_LOCATION == PackageManager.PERMISSION_GRANTED) { locationManager.removeUpdates(GPSListener.this); } попробуй это.   -  person Hemina    schedule 24.08.2016


Ответы (2)


Попробуй это

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // coarse permission is granted
            // Todo
} else { // permission is not granted, request for permission
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION)) { // show some info to user why you want this permission
       Toast.makeText(this, "Allow Location Permission to use this functionality.", Toast.LENGTH_SHORT).show();
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 123 /*LOCATION_PERMISSION_REQUEST_CODE*/);
    } else {
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 123 /*LOCATION_PERMISSION_REQUEST_CODE*/);

    }
}

Примечание. У вас должно быть следующее разрешение в манифесте Android.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
person Deepak Goyal    schedule 24.08.2016

Вы можете использовать библиотеку поддержки здесь, например,

if(android.support.v4.content.PermissionChecker.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED)
        {
...
         }
person Aneeb Khawar    schedule 24.08.2016