Я не могу получить доступ к GPS с помощью Android 10 (API 29)

#android

#Android

Вопрос:

Я использую код, который отлично работал с Android 4.1. Но этот код больше не работает с Android 10. Код выглядит следующим образом :

 LocationManager Objgps = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Objlistener = new GPSlistener();
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    // TODO: Consider calling
    //    Activity#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 Activity#requestPermissions for more details.
    return;
}
Objgps.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, Objlistener);
 

и :

 private class GPSlistener implements LocationListener {
    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public void onLocationChanged(Location location) {
        Latitude.setText(CoordHrzSoleil.DDecToDMS(location.getLatitude()));
    }
}
 

и в манифесте :

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

Кажется, что в нем отсутствуют некоторые дополнительные разрешения, но я не знаю, что это такое и как их применять.

Спасибо за вашу помощь.

Pierre.

Ответ №1:

Что ж, наконец-то я нашел (или нашел) решение; это тот же вид гимнастики, что и для записи / чтения файлов:

В манифесте вы должны :

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

Затем, в коде :

     if (Build.VERSION.SDK_INT >= 23) {
        if (checkPermission()) {
        } else {
            requestPermission(); // Code for permission
        }
    }
 

 private boolean checkPermission() {
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
    amp;amp; checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        return true;
    } else {
        return false;
    }
}

private void requestPermission() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)
    amp;amp; ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.ACCESS_COARSE_LOCATION)) {
        Toast.makeText(MainActivity.this, "Access fine and coarse location allows us to use GPS. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show();
    } else {
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}, GPS_PERMISSION_REQUEST);
        ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}, GPS_PERMISSION_REQUEST);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case GPS_PERMISSION_REQUEST:
            if (grantResults.length > 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.e("value", "Permission Granted, Now you can use GPS .");
                } else {
                Log.e("value", "Permission Denied, You cannot use GPS .");
                }
            break;
    }
}
 

Я не предоставил разрешение на «ACCESS_BACKGROUND_LOCATION». Мне нужно будет проверить, необходимо ли это.

Сердечно.

Pierre.