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() {} +}