diff --git a/README.md b/README.md
index 48e2236..959958f 100644
--- a/README.md
+++ b/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包安装至手机(手机需连接到电脑, 并且启用开发者模式)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9ec4a09..e3487cd 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,8 +13,6 @@
-
-
diff --git a/app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java b/app/src/main/java/com/nsgk/ruralWeb/EnvWindowObject.java
new file mode 100644
index 0000000..ce6cdbb
--- /dev/null
+++ b/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 allProviders = lm.getAllProviders();
+ Map 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() {
+ @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);
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/nsgk/ruralWeb/FullscreenActivity.java b/app/src/main/java/com/nsgk/ruralWeb/FullscreenActivity.java
index 4cf5e29..38beb1f 100644
--- a/app/src/main/java/com/nsgk/ruralWeb/FullscreenActivity.java
+++ b/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
diff --git a/app/src/main/java/com/nsgk/ruralWeb/LocationInfo.java b/app/src/main/java/com/nsgk/ruralWeb/LocationInfo.java
new file mode 100644
index 0000000..f49fa77
--- /dev/null
+++ b/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 +
+ '}';
+ }
+}
diff --git a/app/src/main/java/com/nsgk/ruralWeb/utils/ContextUtils.java b/app/src/main/java/com/nsgk/ruralWeb/utils/ContextUtils.java
new file mode 100644
index 0000000..69a95d8
--- /dev/null
+++ b/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() {}
+}