Bläddra i källkod

定位

master
zhaodengke 2 veckor sedan
förälder
incheckning
77b717cb63
1 ändrade filer med 97 tillägg och 12 borttagningar
  1. +97
    -12
      app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java

+ 97
- 12
app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java Visa fil

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


Laddar…
Avbryt
Spara