Android-从JavaScriptInterface内的主类调用方法
我对android开发相对来说是新手,我正在尝试制作一个网络视图,让我能够启动android摄像头应用程序。如何使用JavaScriptInterface在主类中调用方法 谢谢Android-从JavaScriptInterface内的主类调用方法,android,Android,我对android开发相对来说是新手,我正在尝试制作一个网络视图,让我能够启动android摄像头应用程序。如何使用JavaScriptInterface在主类中调用方法 谢谢 public class MainActivity extends Activity { public static final int MEDIA_TYPE_IMAGE = 1888; @Override public void onCreate(Bundle savedInstanceSt
public class MainActivity extends Activity {
public static final int MEDIA_TYPE_IMAGE = 1888;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
mainWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android");
WebSettings webSettings = mainWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mainWebView.setWebViewClient(new MyCustomWebViewClient());
//mainWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
mainWebView.loadUrl("file:///mnt/sdcard/page.html");
}
private class MyCustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
public void takePicture() {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, MEDIA_TYPE_IMAGE);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MEDIA_TYPE_IMAGE) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
}}
}
package com.cargowise.view;
import android.content.Context;
import android.os.Handler;
import android.widget.Toast;
public class JavaScriptInterface {
Context mContext;
/** Instantiate the interface and set the context */
JavaScriptInterface(Context c) {
mContext = c;
}
public void takePic() {
MainActivity.takePicture();
}
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
您已经存储了应该能够用来访问
main活动的上下文
更改此项:
public void takePic() {
MainActivity.takePicture();
}
为此:
public void takePic() {
((MainActivity)mContext).takePicture();
}
注意:您可能需要添加一些类型检查或限制提供给MainActivity
的上下文类型,以强制执行正确的行为。调用((MainActivity)mContext.takePicture()的建议(可能)是错误的,至少对我来说是失败的。原因是调用将不在主/UI线程上,而是在另一个线程上
此外,必须将@JavascriptInterface注释放在每个接口方法之前
对主UI线程进行调用的正确方法是这样的,而主UI线程将能够像往常一样在该线程上执行所有操作:
...inside JavaScriptInterface class
public void takePic() {
((MainActivity)mContext).post(new Runnable() {
@Override
public void run() {
((MainActivity)mContext).takePicture();
}
});
}
在科特林,这看起来简单得多:
@JavascriptInterface
fun takePic() {
(mContext as MainActivity).mainWebView?.post {
(mContext as MainActivity).takePicture()
}
}
WebView与Android后端集成的完整示例,以及JS和Android之间的bak和forth调用,如下所示:@cklab您是一个救生员。