Я хочу, чтобы приложение было очень минималистичным и простым, и как только пользователь открывает его, оно имеет карту и центрируется по местоположению пользователя (я использую OSM для картографических данных). Приложение также должно сохранять журналы NMEA, которые пользователь может просматривать.
Также появляется всплывающий экран, сообщающий пользователю, что его местоположение будет отслеживаться во время использования приложения, и если он нажмет «Нет», приложение закроется, но если он нажмет «Да», приложение запрашивает разрешение и показывает карту.
Но как бы я ни пытался запросить разрешения на определение местоположения, я никогда не получаю от Android небольшого всплывающего окна, чтобы пользователь дал разрешение.
Я делаю это. в моем XML-манифесте есть "android.permission.ACCESS_COARSE_LOCATION" и "android.permission.ACCESS_FINE_LOCATION".
Я тестировал оба варианта с помощью requestPermissions() или с помощью RegisterForActivityResult(ActivityResultContracts.RequestMultiplePermissions()), пробовал очистить градиент и переустановить приложение между тестами. Я оставлю оба примера в приведенном ниже примере, чтобы показать, как я пробовал.
MainActivity.kt:
Код: Выделить всё
class MainActivity : ComponentActivity() {
private val locationPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()) { perms ->
Timber.d("Requested Foreground location permissions")
if (perms.all { it.value }) {
Timber.d("Foreground location granted")
GNSS().startListeningNmea(this@MainActivity)
} else {
Toast.makeText(this, "Foreground location permissions are required", Toast.LENGTH_LONG).show()
Timber.e("Foreground location permissions are required")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
appContainer = AppContainerImpl(applicationContext)
Timber.plant(DebugTree())
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val locationPermissions = arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
)
fun hasLocationPermissions(): Boolean {
return locationPermissions.all {
checkSelfPermission(it) == PackageManager.PERMISSION_GRANTED
}
}
fun requestLocationPermissions() {
ActivityCompat.requestPermissions(this, locationPermissions, 1001)
}
val map = findViewById(R.id.mapView) as MapView
map.setMultiTouchControls(true)
val drawerLayout = binding.drawerLayout
val layoutConsent = binding.consentLayout
val btnConsentTrue = binding.btnConsentTrue
val btnConsentFalse = binding.btnConsentFalse
btnConsentFalse.setOnClickListener{
finishAndRemoveTask()
}
btnConsentTrue.setOnClickListener {
Timber.i("User consented to location")
if (!hasFineLocationPermissions()) {
Timber.w("Fine location permission missing — requesting")
//requestFineLocationPermissions()
fineLocationPermissionLauncher.launch(fineLocationPermissions)
//temp duplicate to hide the layout, will make into function
if(hasFineLocationPermissions()){
Timber.d("Hiding consent layout")
layoutConsent.visibility = View.GONE
layoutConsent.isEnabled = false
btnConsentFalse.visibility = View.GONE
btnConsentFalse.isEnabled = false
btnConsentTrue.visibility = View.GONE
btnConsentTrue.isEnabled = false
}
} else {
GNSS().startListeningNmea(this@MainActivity)
Timber.d("Hiding consent layout")
layoutConsent.visibility = View.GONE
layoutConsent.isEnabled = false
btnConsentFalse.visibility = View.GONE
btnConsentFalse.isEnabled = false
btnConsentTrue.visibility = View.GONE
btnConsentTrue.isEnabled = false
}
}
// Map stuff
val geoPoint = GeoPoint(
currentLatitude,
currentLongitude
)
val mapController = map.controller
mapController.setZoom(9.0) //TODO: test good zoom level
mapController.setCenter(geoPoint)
}
override fun onDestroy() {
super.onDestroy()
GNSS().stopListeningNmea(this@MainActivity)
}
}
Заметил это в Logcat, но никогда не запрашиваю устройства поблизости: ни одно из [android.permission.ACCESS_COARSE_LOCATION, android.permission.ACCESS_FINE_LOCATION] в {android.permission-group.NEARBY_DEVICES=[android.permission.BLUETOOTH_SCAN, android.permission.BLUETOOTH_CONNECT]
Подробнее здесь: https://stackoverflow.com/questions/797 ... get-sdk-33
Мобильная версия