Как запросить разрешение на размещение во время выполнения на 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.

  • Невозможно получить информацию о подписке из API разработчика Google Play для Android
  • Как измерить прошедшее время
  • Ошибка MediaPlayer -38,0
  • Java: как получить входные данные из System.console ()
  • Как передать функцию в качестве параметра в Java?
  • Android: как скрыть ActionBar при определенных действиях
  • Добавление элемента подменю ListView в Android
  • Текст Android-центра на canvasе
  • размер растрового изображения превышает бюджетную ошибку Vm
  • Анализ ответа ksoap2
  • Уровень заряда батареи и состояние в Android
  • Interesting Posts

    Что такое файлы hiberfil.sys и pagefile.sys, и могу ли я безопасно их удалить?

    Как инициализировать List для заданного размера (в отличие от емкости)?

    Страtagsя аутентификации Microservice

    Почему интерфейс в Java-8 позволил получить основной метод?

    Кто удаляет память, выделенную во время «новой» операции, которая имеет исключение в конструкторе?

    Идентификатор канонической регистрации и формат идентификатора сообщения

    Зачем использовать звездочку «» вместо целого числа для параметра массива VLA функции?

    Удаление узлов из XmlDocument

    sizeof () для ссылочных типов?

    Когда использовать статическое ключевое слово перед глобальными переменными?

    Как определить повторяющиеся значения в числовой последовательности с помощью XPath 2.0?

    Установщик Windows с использованием USB-накопителя для временных целей

    Как преобразовать изображение RGB в оттенки серого, но сохранить один цвет?

    Игнорировать все предупреждения в определенном файле, используя LLVM / Clang

    Установка цвета фона для JFrame

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