迫于公司贫穷,人员较少,对于Android开发不专业,我们想着把一套H5程序打包成app,既方便又省事。但是最近需要调用语音、视频相关原生的api,没办法只能考虑打包成app后调用Android方法。
对于目前的webview来说,已经提供了相关的方法
webView.addJavascriptInterface(new JsInterface(), "android");
暴露Android方法
public class JsInterface{ @JavascriptInterface public void call(String userId){ System.out.println(userId); } }
js 调用
android.call("abcde12345")
那我们就按照上述实现来设计我们的方式,首先webview方面我们使用
AgentWeb这个基于的 Android WebView ,极度容易使用以及功能强大的库,它提供了 Android WebView 一系列的问题解决方案 ,并且轻量和极度灵活。
public class MainActivity extends Activity { // WebView webView; AgentWeb mAgentWeb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout view=findViewById(R.id.test); mAgentWeb = AgentWeb.with(this) .setAgentWebParent((LinearLayout) view, new LinearLayout.LayoutParams(-1, -1)) .useDefaultIndicator() .createAgentWeb() .ready() .go("http://192.168.1.106:3002"); mAgentWeb.getJsInterfaceHolder().addJavaObject("testandroid",new TestVoice(this)); IAgentWebSettings agentWebSettings = mAgentWeb.getAgentWebSettings(); agentWebSettings.getWebSettings().setDomStorageEnabled(true); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { System.out.println("返回事件"); if(keyCode==KeyEvent.KEYCODE_BACK){ if(!mAgentWeb.back()){ finish(); return true; }else{ mAgentWeb.back(); return true; } } return false; } }
然后建立一个TestVoice 类来将Android方法暴露给window对象
public class TestVoice { Intent intent = null; private Context mContext; public TestVoice(Context context){ this.mContext = context; } @JavascriptInterface public void hello(String username,String userid){ System.out.println("hello"+username); } @JavascriptInterface public void call(){ intent = new Intent(mContext,TestActivity.class); startActivity(intent); } }
然后在我们前端vue页面直接调用
// 调用方法 window.testandroid.hello("1237","112345") // 打开activity window.testandroid.call()
思路就是将java方法暴露给window对象,然后js就可以调用了