浏览代码

定位服务

master
zhaodengke 1周前
父节点
当前提交
c5ea66c9b9
共有 6 个文件被更改,包括 215 次插入3 次删除
  1. +1
    -1
      README.md
  2. +0
    -2
      app/src/main/AndroidManifest.xml
  3. +168
    -0
      app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java
  4. +5
    -0
      app/src/main/java/com/nsgk/ruralWeb/FullscreenActivity.java
  5. +25
    -0
      app/src/main/java/com/nsgk/ruralWeb/LocationInfo.java
  6. +16
    -0
      app/src/main/java/com/nsgk/ruralWeb/utils/ContextUtils.java

+ 1
- 1
README.md 查看文件

@@ -35,7 +35,7 @@

> 帮助脚本

* `打包-正式.bat`: 构建正式包(直接执行将使用`gradle.properties`文件里的配置进行打包, 完整命令行用法为 ```.\打包-正式.bat App主页链接地址 App名称 App图标 App启动页版权文本 App启动页厂商名称```, 此时会使用命令行里的配置进行打包. 生成的路径为`/app/build/outputs/apk/release/app-release.apk`)
* `打包-正式.bat`: 构建正式包(直接执行将使用`gradle.properties`文件里的配置进行打包, 完整命令行用法为 ```.\打包-正式.bat App主页链接地址 App名称 App图标简称 App启动页版权文本 App启动页厂商名称```, 此时会使用命令行里的配置进行打包. 生成的路径为`/app/build/outputs/apk/release/app-release.apk`)
* `打包-debug.bat`: 构建Debug包(生成的路径为`/app/build/outputs/apk/debug/app-debug.apk`)
* `安装-发布包.bat`: 将已打好的Release包安装至手机(手机需连接到电脑, 并且启用开发者模式)
* `安装-调试包.bat`: 将已打好的Debug包安装至手机(手机需连接到电脑, 并且启用开发者模式)


+ 0
- 2
app/src/main/AndroidManifest.xml 查看文件

@@ -13,8 +13,6 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!--AgentWeb 是默认允许定位的 ,如果你需要该功能 , 请在你的 AndroidManifest 文件里面加入如下权限 。-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<!-- android:icon 、 android:roundIcon 是APP显示图标-->


+ 168
- 0
app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java 查看文件

@@ -0,0 +1,168 @@
package com.nsgk.ruralWeb;

import android.app.Activity;
import android.location.LocationManager;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Handler;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.webkit.WebView;
import android.widget.Toast;

import androidx.core.app.ActivityCompat;

import com.nsgk.ruralWeb.utils.ContextUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EnvWindowObject
{
private static final String ID_TAG = EnvWindowObject.class.getName();
private static final String FUSED_PROVIDER = "fused";

private final Handler m_handler;
private final Context m_context;
private final WebView m_webView;

// 最近一次获取到的定位坐标, 如果获取定位失败则返回此值. 可能不需要, 因为PASSIVE_PROVIDER就为最近的定位
private String lastLocation = null;

public EnvWindowObject(Context context, Handler handler, WebView webView)
{
m_context = context;
m_handler = handler;
m_webView = webView;
}

@JavascriptInterface
public void Toast(final String message)
{
RunOnUIThread(new Runnable() {
@Override
public void run()
{
Toast.makeText(m_context, message, Toast.LENGTH_LONG).show();
}
});
}

@JavascriptInterface
public void Log(final String message)
{
Log.i(ID_TAG, message);
}

@JavascriptInterface
public String GetLocation(final String type)
{
try
{
if(ActivityCompat.checkSelfPermission(m_context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(m_context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(m_context, "请先允许定位服务", Toast.LENGTH_LONG).show();
ContextUtils.RequestLocationPermission((Activity) m_context, 0x1001);
return lastLocation;
}

LocationManager lm = (LocationManager) m_context.getSystemService(Context.LOCATION_SERVICE);

List<String> allProviders = lm.getAllProviders();
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 loc = null;
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(LocationManager.GPS_PROVIDER))
loc = map.get(LocationManager.GPS_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);

if(null != loc)
lastLocation = loc.longitude + "," + loc.latitude;
}
catch(Throwable e)
{
e.printStackTrace();
}
return lastLocation;
}

protected void RunOnUIThread(Runnable runnable)
{
if(null != m_handler)
m_handler.post(runnable);
else if(m_context instanceof Activity)
((Activity)m_context).runOnUiThread(runnable);
else
{
Log.e(ID_TAG, "无法在UI线程中执行");
}
}

protected void CallJSFunc(final String func, Object...args)
{
StringBuilder sb = new StringBuilder();
for(int i = 0; i < args.length; i++)
{
sb.append("'").append(args[i].toString()).append("'");
if(i < args.length - 1)
sb.append(", ");
}
final String arg = sb.toString();
RunOnUIThread(new Runnable() {
@Override
public void run()
{
String script = "javascript:typeof(" + func + ") == 'function' && " + func + "(" + arg + ");";
Log.e(ID_TAG, String.format("调用js函数: 函数(%s), 参数(%s)", func, arg));
m_webView.evaluateJavascript(script, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e(ID_TAG, String.format("js函数 %s 返回: %s", func, value));
}
});
}
});
}

protected void CallJSFunc_beforeAndroid4_4(final String func, Object...args)
{
StringBuilder sb = new StringBuilder();
for(int i = 0; i < args.length; i++)
{
sb.append("'").append(args[i].toString()).append("'");
if(i < args.length - 1)
sb.append(", ");
}
final String arg = sb.toString();
RunOnUIThread(new Runnable() {
@Override
public void run() {
Log.e(ID_TAG, String.format("调用js函数: 函数(%s), 参数(%s)", func, arg));
String script = "javascript:typeof(" + func + ") == 'function' && " + func + "(" + arg + ");";
Log.e(ID_TAG, script);
m_webView.loadUrl(script, null);
}
});
}
}

+ 5
- 0
app/src/main/java/com/nsgk/ruralWeb/FullscreenActivity.java 查看文件

@@ -3,6 +3,7 @@ package com.nsgk.ruralWeb;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.ViewGroup;
@@ -34,6 +35,7 @@ public class FullscreenActivity extends AppCompatActivity {

setContentView(R.layout.activity_fullscreen);
String appHomeUrl = GetHomeUrl();
//appHomeUrl = "http://192.168.0.250:85/sunVillage_info/login";
Log.i("NSGK", "App home url: " + appHomeUrl);
// init();
mAgentWeb = AgentWeb.with(this)//
@@ -61,6 +63,9 @@ public class FullscreenActivity extends AppCompatActivity {
.ready()//设置 WebSettings。
.go(appHomeUrl); //WebView载入该url地址的页面并显示。

// 注入宿主对象
mAgentWeb.getJsInterfaceHolder().addJavaObject("_Native_object", new EnvWindowObject(this, new Handler(), mAgentWeb.getWebCreator().getWebView()));

/* 上边url是各个APP项目的入口地址
事项审批 http://116.255.223.226:82/yinnongLogin 图标 ic_launcher_sxsp 或者 ic_launcher_yhzl
阳光村务(村级事项) http://116.255.223.226:82/sunVillage_info/login 图标 ic_launcher_ygcw


+ 25
- 0
app/src/main/java/com/nsgk/ruralWeb/LocationInfo.java 查看文件

@@ -0,0 +1,25 @@
package com.nsgk.ruralWeb;

public final class LocationInfo
{
public final String provider;
public final double longitude;
public final double latitude;

public LocationInfo(String provider, double longitude, double latitude)
{
this.provider = provider;
this.longitude = longitude;
this.latitude = latitude;
}

@Override
public String toString()
{
return "LocationInfo{" +
"provider='" + provider + '\'' +
", latitude=" + latitude +
", longitude=" + longitude +
'}';
}
}

+ 16
- 0
app/src/main/java/com/nsgk/ruralWeb/utils/ContextUtils.java 查看文件

@@ -0,0 +1,16 @@
package com.nsgk.ruralWeb.utils;

import android.app.Activity;
import android.content.Intent;
import android.provider.Settings;

public final class ContextUtils
{
public static void RequestLocationPermission(Activity context, int requestCode)
{
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
context.startActivityForResult(intent, requestCode);
}

private ContextUtils() {}
}

正在加载...
取消
保存