| @@ -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<String> allProviders = lm.getAllProviders(); | |||
| Log.i("NSGK", "使用最近所有定位提供器: " + allProviders); | |||
| Map<String, LocationInfo> 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<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) | |||
| { | |||
| e.printStackTrace(); | |||
| } | |||
| return lastLocation; | |||
| return loc; | |||
| } | |||
| protected void RunOnUIThread(Runnable runnable) | |||