|
|
@@ -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) |
|
|
|