From 77b717cb63bba2391435b0aff093a034c7352a63 Mon Sep 17 00:00:00 2001 From: zhaodengke Date: Fri, 4 Jul 2025 16:14:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/nsgk/ruralWeb/EnvWindowObject.java | 109 ++++++++++++++++-- 1 file changed, 97 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java b/app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java index ba8d7a1..1c50ca5 100644 --- a/app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java +++ b/app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java @@ -1,6 +1,8 @@ package com.nsgk.ruralWeb; +import android.annotation.SuppressLint; import android.app.Activity; +import android.location.Criteria; import android.location.LocationManager; import android.Manifest; @@ -9,6 +11,7 @@ import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.location.LocationProvider; +import android.os.Build; import android.os.Handler; import android.util.Log; import android.webkit.JavascriptInterface; @@ -23,6 +26,7 @@ import com.nsgk.ruralWeb.utils.ContextUtils; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; public class EnvWindowObject { @@ -45,12 +49,17 @@ public class EnvWindowObject @JavascriptInterface public void Toast(final String message) + { + ShowToast(message, Toast.LENGTH_LONG); + } + + private void ShowToast(final String message, int duration) { RunOnUIThread(new Runnable() { @Override public void run() { - Toast.makeText(m_context, message, Toast.LENGTH_LONG).show(); + Toast.makeText(m_context, message, duration).show(); } }); } @@ -83,38 +92,114 @@ public class EnvWindowObject return lastLocation; } + LocationInfo loc; + + loc = GetHighLocation(null); + if(null == loc) + loc = GetLastLocation(type); + + if(null != loc) + lastLocation = loc.longitude + "," + loc.latitude; + else + ShowToast("定位失败, 请先开启位置服务", Toast.LENGTH_LONG); + } + catch(Throwable e) + { + e.printStackTrace(); + } + return lastLocation; + } + + @SuppressLint("MissingPermission") + private LocationInfo GetLastLocation(final String type) + { + LocationInfo loc = null; + try + { LocationManager lm = (LocationManager) m_context.getSystemService(Context.LOCATION_SERVICE); List allProviders = lm.getAllProviders(); + Log.i("NSGK", "使用最近所有定位提供器: " + allProviders); Map map = new HashMap<>(); for(String provider : allProviders) { Location lastKnownLocation = lm.getLastKnownLocation(provider); if(null == lastKnownLocation) continue; - LocationInfo loc = new LocationInfo(provider, lastKnownLocation.getLongitude(), lastKnownLocation.getLatitude()); - map.put(provider, loc); + LocationInfo l = new LocationInfo(provider, lastKnownLocation.getLongitude(), lastKnownLocation.getLatitude()); + map.put(provider, l); } - LocationInfo loc = null; + + Log.i("NSGK", "最近定位提供器结果: " + map); if(null != type && !type.isEmpty() && map.containsKey(type)) loc = map.get(type); - else if(map.containsKey(LocationManager.NETWORK_PROVIDER)) - loc = map.get(LocationManager.NETWORK_PROVIDER); + else if(map.containsKey(FUSED_PROVIDER)) + loc = map.get(FUSED_PROVIDER); else if(map.containsKey(LocationManager.GPS_PROVIDER)) loc = map.get(LocationManager.GPS_PROVIDER); + else if(map.containsKey(LocationManager.NETWORK_PROVIDER)) + loc = map.get(LocationManager.NETWORK_PROVIDER); else if(map.containsKey(LocationManager.PASSIVE_PROVIDER)) - loc = map.get(LocationManager.GPS_PROVIDER); - else if(map.containsKey(FUSED_PROVIDER)) - loc = map.get(FUSED_PROVIDER); + loc = map.get(LocationManager.PASSIVE_PROVIDER); + if(null == loc) + Log.i("NSGK", "所有提供器无最近定位"); + else + Log.i("NSGK", "使用提供器最近定位: " + loc.provider); + } + catch(Throwable e) + { + e.printStackTrace(); + } + return loc; + } - if(null != loc) - lastLocation = loc.longitude + "," + loc.latitude; + @SuppressLint("MissingPermission") + private LocationInfo GetHighLocation(String provider) + { + if(Build.VERSION.SDK_INT < Build.VERSION_CODES.R) + { + return null; + } + + LocationInfo loc = null; + try + { + LocationManager lm = (LocationManager) m_context.getSystemService(Context.LOCATION_SERVICE); + + if(null == provider) + { + Criteria criteria = new Criteria(); + criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度 +// criteria.setPowerRequirement(Criteria.POWER_HIGH); +// criteria.setAltitudeRequired(false); + provider = lm.getBestProvider(criteria, true); + } + Log.i("NSGK", "使用高精度定位提供器: " + provider); + + if(null == provider) + { + Log.i("NSGK", "无法获取高精度定位提供器"); + return null; + } + + CompletableFuture future = new CompletableFuture<>(); + if(null == lastLocation) + ShowToast("定位中......", Toast.LENGTH_SHORT); + lm.getCurrentLocation(provider, null, m_context.getMainExecutor(), future::complete); + Location location = future.get(); + if(null == location) + { + Log.i("NSGK", "无法使用高精度提供器定位"); + return null; + } + loc = new LocationInfo(provider, location.getLongitude(), location.getLatitude()); + Log.i("NSGK", "使用高精度提供器获取定位: " + loc); } catch(Throwable e) { e.printStackTrace(); } - return lastLocation; + return loc; } protected void RunOnUIThread(Runnable runnable)