| @@ -1,6 +1,8 @@ | |||||
| package com.nsgk.ruralWeb; | package com.nsgk.ruralWeb; | ||||
| import android.annotation.SuppressLint; | |||||
| import android.app.Activity; | import android.app.Activity; | ||||
| import android.location.Criteria; | |||||
| import android.location.LocationManager; | import android.location.LocationManager; | ||||
| import android.Manifest; | import android.Manifest; | ||||
| @@ -9,6 +11,7 @@ import android.content.pm.PackageManager; | |||||
| import android.location.Location; | import android.location.Location; | ||||
| import android.location.LocationManager; | import android.location.LocationManager; | ||||
| import android.location.LocationProvider; | import android.location.LocationProvider; | ||||
| import android.os.Build; | |||||
| import android.os.Handler; | import android.os.Handler; | ||||
| import android.util.Log; | import android.util.Log; | ||||
| import android.webkit.JavascriptInterface; | import android.webkit.JavascriptInterface; | ||||
| @@ -23,6 +26,7 @@ import com.nsgk.ruralWeb.utils.ContextUtils; | |||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.concurrent.CompletableFuture; | |||||
| public class EnvWindowObject | public class EnvWindowObject | ||||
| { | { | ||||
| @@ -45,12 +49,17 @@ public class EnvWindowObject | |||||
| @JavascriptInterface | @JavascriptInterface | ||||
| public void Toast(final String message) | public void Toast(final String message) | ||||
| { | |||||
| ShowToast(message, Toast.LENGTH_LONG); | |||||
| } | |||||
| private void ShowToast(final String message, int duration) | |||||
| { | { | ||||
| RunOnUIThread(new Runnable() { | RunOnUIThread(new Runnable() { | ||||
| @Override | @Override | ||||
| public void run() | 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; | 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); | LocationManager lm = (LocationManager) m_context.getSystemService(Context.LOCATION_SERVICE); | ||||
| List<String> allProviders = lm.getAllProviders(); | List<String> allProviders = lm.getAllProviders(); | ||||
| Log.i("NSGK", "使用最近所有定位提供器: " + allProviders); | |||||
| Map<String, LocationInfo> map = new HashMap<>(); | Map<String, LocationInfo> map = new HashMap<>(); | ||||
| for(String provider : allProviders) | for(String provider : allProviders) | ||||
| { | { | ||||
| Location lastKnownLocation = lm.getLastKnownLocation(provider); | Location lastKnownLocation = lm.getLastKnownLocation(provider); | ||||
| if(null == lastKnownLocation) | if(null == lastKnownLocation) | ||||
| continue; | 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)) | if(null != type && !type.isEmpty() && map.containsKey(type)) | ||||
| loc = map.get(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)) | else if(map.containsKey(LocationManager.GPS_PROVIDER)) | ||||
| loc = map.get(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)) | 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<Location> 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) | catch(Throwable e) | ||||
| { | { | ||||
| e.printStackTrace(); | e.printStackTrace(); | ||||
| } | } | ||||
| return lastLocation; | |||||
| return loc; | |||||
| } | } | ||||
| protected void RunOnUIThread(Runnable runnable) | protected void RunOnUIThread(Runnable runnable) | ||||