Положение GPS не обновляется автоматическиAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Положение GPS не обновляется автоматически

Сообщение Anonymous »

В настоящее время я работаю над приложением Flutter для часов с использованием WearOS, поскольку не существует плагина для определения местоположения GPS с помощью часов WearOS, вам нужно сделать это вручную, используя FusedLocationProviderClient из Google Play Services, который вам нужно обработать из ./app/src/main/com/.../.../MainActivity .kt с помощью целый скрипт и система трансляции событий.
С помощью кода, который я сейчас написал, мне удастся получить пассивное положение GPS, зарегистрированное часами , так как лучше, когда вы в данный момент загружаете приложение и потенциально не подключены к Wi-Fi или сотовой связи.
PS D:\Codes\Flutter projects\idfm_wearos> flutter run --release
Launching lib\main.dart on sdk gwear x86 64 in release mode...
Running Gradle task 'assembleRelease'... 75,8s
√ Built build\app\outputs\flutter-apk\app-release.apk (28.4MB)
Installing build\app\outputs\flutter-apk\app-release.apk... 3,1s

Flutter run key commands.
h List all available interactive commands.
c Clear the screen
q Quit (terminate the application on the device).
I/flutter ( 5618): {latitude: 48.808303333333335, longitude: 3.08294}

Однако после того, как эта позиция GPS будет передана системой событий, мне не удастся получить реальную позицию GPS, даже если я подключен или повторное подключение.
Вот код кода MainActivity.kt:
package com.example.idfm_wearos

import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationManager
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.MotionEvent
import androidx.annotation.NonNull
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MethodChannel
import java.util.concurrent.TimeUnit

class MainActivity : FlutterActivity() {
private val CHANNEL = "location_permission"
private val LOCATION_CHANNEL = "location_updates"
private val PERMISSION_REQUEST_CODE = 123
private lateinit var fusedLocationClient: FusedLocationProviderClient
private var eventSink: EventChannel.EventSink? = null
private lateinit var locationCallback: LocationCallback

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)

MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
.setMethodCallHandler { call, result ->
when (call.method) {
"requestPermission" -> {
requestLocationPermission(result)
}
"checkPermission" -> {
result.success(checkLocationPermission())
}
else -> result.notImplemented()
}
}

EventChannel(flutterEngine.dartExecutor.binaryMessenger, LOCATION_CHANNEL)
.setStreamHandler(object : EventChannel.StreamHandler {
override fun onListen(arguments: Any?, eventSink: EventChannel.EventSink?) {
this@MainActivity.eventSink = eventSink
startLocationUpdates()
}

override fun onCancel(arguments: Any?) {
stopLocationUpdates()
}
})
}

private fun requestLocationPermission(result: MethodChannel.Result) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
) {
result.success(true)
return
}
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
PERMISSION_REQUEST_CODE
)
}
}

private fun checkLocationPermission(): Boolean {
return ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
}

private fun startLocationUpdates() {
if (checkLocationPermission()) {
// Use LocationManager to get last known location from passive provider
val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
val lastKnownLocation: Location? = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER)

// Check if a valid last known location is available
if (lastKnownLocation != null) {
Log.d("Location", "Last known location: $lastKnownLocation")
eventSink?.success("${lastKnownLocation.latitude}|${lastKnownLocation.longitude}")
} else {
Log.d("Location", "No passive last known location available")
}

// Now request location updates
val locationRequest = getLocationRequest()
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
for (location in locationResult.locations) {
eventSink?.success("${location.latitude}|${location.longitude}")
}
}
}
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
}
}

private fun stopLocationUpdates() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}

private fun getLocationRequest(): LocationRequest {
return LocationRequest.create().apply {
interval = TimeUnit.SECONDS.toMillis(5)
fastestInterval = TimeUnit.SECONDS.toMillis(3)
priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
}
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
eventSink?.success(true)
startLocationUpdates() // Start location updates after permission is granted
} else {
eventSink?.success(false)
}
}
}
}

Вот код класса Flutter, который я использую:
import 'package:flutter/services.dart';

class LocationService {
static const MethodChannel _methodChannel = MethodChannel('location_permission');
static const EventChannel _eventChannel = EventChannel('location_updates');

final Map _locationData = {
'latitude': 0.0,
'longitude': 0.0,
};

Future startLocationUpdates() async {
try {
await _methodChannel.invokeMethod('requestPermission');
final bool result = await _methodChannel.invokeMethod('checkPermission');
if (result) {
_eventChannel.receiveBroadcastStream().listen((event) {
// Parse the location data (event is a string)
final List data = event.split('|');
_locationData['latitude'] = double.parse(data[0]);
_locationData['longitude'] = double.parse(data[1]);
print(_locationData);

//print("Coordinates: $event");
});
}
} catch (e) {
print("Failed to start location updates: $e");
}
}

Map getLocationData() {
return _locationData;
}
}

Timer.periodic(Duration(seconds: 5), (timer) async {
Map location = _gpsLocation.getLocationData();

if (location["latitude"] != _locationData["latitude"] || location["longitude"] != _locationData["longitude"]) {
_locationData = location;
await refreshStations();
}
});


Подробнее здесь: https://stackoverflow.com/questions/793 ... omatically
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»