Как запросить разрешение на размещение во время выполнения на Android 6

В файле манифеста я добавил разрешения, грубые и прекрасные, и когда я запускаю устройство с Android 6, ничего не происходит! Я пробовал все, но не смог получить обновления местоположения …

Что я делаю не так?

public class MainActivity extends AppCompatActivity implements LocationListener { LocationManager locationManager; String provider; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); provider = locationManager.getBestProvider(new Criteria(), false); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. return; } Location location = locationManager.getLastKnownLocation(provider); if (location != null) { Log.i("Location Info", "Location achieved!"); } else { Log.i("Location Info", "No location :("); } } @Override protected void onResume() { super.onResume(); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. return; } locationManager.requestLocationUpdates(provider, 400, 1, this); } @Override protected void onPause() { super.onPause(); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. return; } locationManager.removeUpdates(this); } @Override public void onLocationChanged(Location location) { Double lat = location.getLatitude(); Double lng = location.getLongitude(); Log.i("Location info: Lat", lat.toString()); Log.i("Location info: Lng", lng.toString()); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } public void getLocation(View view) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#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 ActivityCompat#requestPermissions for more details. return; } Location location = locationManager.getLastKnownLocation(provider); onLocationChanged(location); } } 

Вам нужно запросить разрешение на размещение во время выполнения (обратите внимание на комментарии в коде, в котором указано это).

Здесь протестирован и рабочий код, чтобы запросить разрешение на размещение.

Обязательно импортируйте android.Manifest :

 import android.Manifest; 

Затем введите этот код в Activity:

 public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; public boolean checkLocationPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { // Show an explanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. new AlertDialog.Builder(this) .setTitle(R.string.title_location_permission) .setMessage(R.string.text_location_permission) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { //Prompt the user once explanation has been shown ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); } }) .create() .show(); } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); } return false; } else { return true; } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_LOCATION: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // location-related task you need to do. if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { //Request location updates: locationManager.requestLocationUpdates(provider, 400, 1, this); } } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } } } 

Затем вызовите метод checkLocationPermission() в onCreate() :

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //......... checkLocationPermission(); } 

Затем вы можете использовать onResume() и onPause() точно так же, как и в вопросе.

Вот сжатая версия, которая немного чиста:

 @Override protected void onResume() { super.onResume(); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { locationManager.requestLocationUpdates(provider, 400, 1, this); } } @Override protected void onPause() { super.onPause(); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { locationManager.removeUpdates(this); } } 

Мне нравится короткий код. Я использую RxPermission для разрешений.

Сначала добавьте эти разрешения (или нужные вам) в ваш manifest.xml .

   

Затем попросите разрешение времени выполнения от пользователя в вашей деятельности.

 RxPermissions rxPermissions = new RxPermissions(this); rxPermissions .request(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION) // ask single or multiple permission once .subscribe(granted -> { if (granted) { // All requested permissions are granted } else { // At least one permission is denied } }); 

добавьте эту библиотеку в свой build.gradle

 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { implementation 'com.github.tbruyelle:rxpermissions:0.10.1' implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1' } 

Разве это не так просто?

Google создал библиотеку для легкого управления разрешениями. Его называют EasyPermissions

Ниже приведен простой пример запроса разрешения на размещение с использованием этой библиотеки.

 public class MainActivity extends AppCompatActivity { private final int REQUEST_LOCATION_PERMISSION = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestLocationPermission(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @AfterPermissionGranted(REQUEST_LOCATION_PERMISSION) public void requestLocationPermission() { String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION}; if(EasyPermissions.hasPermissions(this, perms)) { Toast.makeText(this, "Permission already granted", Toast.LENGTH_SHORT).show(); } else { EasyPermissions.requestPermissions(this, "Please grant the location permission", REQUEST_LOCATION_PERMISSION, perms); } } } 

@AfterPermissionsGranted(REQUEST_CODE) используется для указания метода, который должен быть выполнен после запроса разрешения с кодом запроса REQUEST_CODE .

В этом случае метод requestLocationPermission() вызывается, если пользователь предоставляет разрешение на доступ к службам определения местоположения. Таким образом, этот метод действует как обратный вызов и метод для запроса разрешений.

Вы можете реализовать отдельные обратные вызовы для разрешенных разрешений и разрешенных прав. Это объясняется на странице github.

  • Использование «this» с именем classа
  • Как вы имитируете низкую память в эмуляторе Android?
  • Изменение цвета нижней строки EditText с помощью appcompat v7
  • База данных не копирует из активов
  • Как получить список установленных принтеров?
  • Упреждающий базовый аут с HttpUrlConnection?
  • Кодировщик и декодер Base64
  • В чем разница между JDK и JRE?
  • android.content.res.Resources $ NotFoundException: Идентификатор ресурса строки # 0x0
  • HttpPost работает в Java-проекте, а не в Android
  • Отправка строки через Bluetooth с ПК в качестве клиента на мобильный как сервер
  • Interesting Posts

    Масштабирование шрифтов по ширине контейнера

    Как вы полностью удаляете границу кнопки в wpf?

    javax.net.ssl.SSLException: Получено фатальное предупреждение: protocol_version

    Ограничение доступа для детей и полей с помощью правил безопасности

    Лучший способ отображения данных через JSON с помощью jQuery

    Обнаруживать, является ли stdin терминалом или трубой?

    DexIndexOverflowException только при выполнении тестов

    время ожидания запуска службы Windows

    Верхние индексы в атрибутной строке

    Возможно ли импортировать файл реестра Windows без разрушения системы?

    Совместное использование предварительно скомпилированных заголовков между проектами в Visual Studio

    Различать один клик и двойной щелчок в Java

    Любая хорошая утилита для отслеживания исходящего трафика и запросов от Win PC?

    Должен ли IDisposable.Dispose () быть безопасным звонить несколько раз?

    Можно ли показывать индикатор выполнения при загрузке изображения через Retrofit 2

    Давайте будем гением компьютера.