3

我对android开发比较陌生,我正在尝试制作一个允许我启动android相机应用程序的WebView。如何使用我的 JavaScriptInterface 调用主类中的方法?

谢谢。

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();
    }
4

2 回答 2

4

您已经存储了应该能够用来访问您的MainActivity.

改变这个:

public void takePic() {
    MainActivity.takePicture();
}

对此:

public void takePic() {
    ((MainActivity)mContext).takePicture();
}

注意:您可能想要添加一些类型检查或限制提供给 a 的上下文类型MainActivity以强制执行正确的行为。

于 2012-07-17T02:30:50.050 回答
0

调用 ((MainActivity)mContext).takePicture() 的建议(可能)是错误的,至少对我来说它失败了。原因是调用不会在主/UI 线程上,而是在另一个线程上。

此外,您必须将 @JavascriptInterface 注释放在每个接口方法之前。

调用主 UI 线程的正确方法是:

...inside JavaScriptInterface class

public void takePic() {
    ((MainActivity)mContext).post(new Runnable() {
        @Override
        public void run() {
            ((MainActivity)mContext).takePicture();
        }
    });
}

在 Kotlin 中,它看起来要简单得多:

@JavascriptInterface
fun takePic() {
    (mContext as MainActivity).mainWebView?.post {
        (mContext as MainActivity).takePicture()
    }
}

WebView 与 Android 后端集成的完整示例,在 JS 和 Android 之间来回调用 bak,在这里:https ://github.com/latitov/Android_WebViewApp_FullScreen

于 2019-08-25T12:49:46.447 回答