#android #android-manifest #android-permissions #android-location
#Android #android-манифест #android-разрешения #android-расположение
Вопрос:
Я пытаюсь получить текущее местоположение либо от GPS, либо от сетевого провайдера, для которого я использую эти разрешения, объявив его в AndroidManifest.xml,
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Я проверяю разрешение во время выполнения как,
ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
и
ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
Для меня это отлично работает с Android SDK версии 22, тогда как в SDK версии 25, хотя разрешение объявлено в AndroidManifest.xml это не отражается во время выполнения.
Я проверил, предоставлены ли эти разрешения или нет с помощью,
пакет adb shell dumpsys com.abc.xyz
Разрешения не были предоставлены для моего приложения, которое работает на SDK-25, когда я попытался предоставить разрешение с помощью adb shell как,
adb shell pm предоставляет com.abc.xyz Android.Манифест.разрешение.ACCESS_COARSE_LOCATION
Я подозреваю, что Android предоставил эти разрешения из SDK версии 25 (пожалуйста, поправьте меня, если я ошибаюсь). Просто погуглив, я не могу выяснить, как уровень разрешений / серьезность менялись между версиями SDK.
Пожалуйста, помогите мне узнать об этом.
Комментарии:
1.
ACCESS_FINE_LOCATION
охватывает оба. Когда у вас есть,ACCESS_FINE_LOCATION
тогда вам не нужноACCESS_COARSE_LOCATION
.2. Читать developer.android.com/guide/topics/location/… для уточнения.
Ответ №1:
Во всех версиях Android ваше приложение должно объявлять как обычные, так и опасные разрешения, которые ему нужны в манифесте приложения, как описано в разделе Объявление разрешений. Однако эффект от этого объявления отличается в зависимости от версии системы и целевого уровня SDK вашего приложения:
Если целевой SDK вашего приложения равен 22 или ниже: если вы указываете опасное разрешение в своем манифесте, пользователь должен предоставить разрешение при установке приложения; если они не предоставляют разрешение, система не устанавливает приложение вообще.
Если целевой SDK вашего приложения равен 23 или выше: Приложение должно перечислять разрешения в манифесте и запрашивать каждое опасное разрешение, которое ему требуется, во время работы приложения. Пользователь может предоставлять или отклонять каждое разрешение, и приложение может продолжать работать с ограниченными возможностями, даже если пользователь отклоняет запрос на разрешение.
вы можете обратиться к этой ссылке
Комментарии:
1. вы можете проверить вышеупомянутую ссылку для документов разработчика Android
Ответ №2:
Попробуйте это.
private boolean RequestPermissions() {
int camera = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.CAMERA);
int storage = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
List<String> listPermissionsNeeded = new ArrayList<>();
if (camera != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(CAMERA);
}
if (storage != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(WRITE_EXTERNAL_STORAGE);
listPermissionsNeeded.add(READ_EXTERNAL_STORAGE);
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray
(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
это функция, которая проверяет, нужны ли разрешения, и если они недоступны, она запрашивает у пользователя.
Комментарии:
1. Это действительно необходимо для запроса от пользователя? Как я могу проверить, когда Android накладывает такие ограничения с версиями SDK?
2. Где я мог бы проверить эту информацию? Я не могу найти это в документе для разработчиков Android.
3. <использует разрешение android:name=»android.permission. ACCESS_COARSE_LOCATION»/> <использует разрешение android:name=»android.permission. ACCESS_FINE_LOCATION «/> сделайте это в манифесте и запишите обратный код в файл Java, и все готово.
Ответ №3:
ACCESS_FINE_LOCATION включает ACCESS_COARSE_LOCATION. Однако есть одна загвоздка:
ACCESS_COARSE_LOCATION предоставляет вам последнее известное местоположение, которое работает от батареиhttps://developer.android.com/training/location/retrieve-current.html#setup
Однако, если вам нужно что-то вроде местоположения в реальном времени, например Pokemon Go, используйте ACCESS_FINE_LOCATION, это дает вам местоположение в реальном времени.
Ответ №4:
Еще одна вещь, которую вы должны иметь в виду, которая ACCESS_FINE_LOCATION
дает вам лучшее и точное местоположение и ACCESS_COARSE_LOCATION
дает вам менее точное местоположение.