javascript WebView में एंड्रॉइड कॉलिंग जावास्क्रिप्ट फ़ंक्शन




android (5)

मैंने जावास्क्रिप्ट विधियों को कॉल करने के लिए एक अच्छा रैपर बनाया; यह लॉग में जावास्क्रिप्ट त्रुटियों को भी दिखाता है:

private void callJavaScript(String methodName, Object...params){
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("javascript:try{");
    stringBuilder.append(methodName);
    stringBuilder.append("(");
    for (int i = 0; i < params.length; i++) {
        Object param = params[i];
        if(param instanceof String){
            stringBuilder.append("'");
            stringBuilder.append(param);
            stringBuilder.append("'");
        }
        if(i < params.length - 1){
            stringBuilder.append(",");
        }
    }
    stringBuilder.append(")}catch(error){Android.onError(error.message);}");
    webView.loadUrl(stringBuilder.toString());
}

आपको इसे भी जोड़ना होगा:

private class WebViewInterface{

    @JavascriptInterface
    public void onError(String error){
        throw new Error(error);
    }
}

और इस इंटरफेस को अपने वेबव्यू में जोड़ें:

webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new WebViewInterface(), "AndroidErrorReporter");

मैं android webview अंदर चल रहे html पेज में बैठे कुछ javascript कार्यों को कॉल करने की कोशिश कर रहा हूं। एंड्रॉइड ऐप से कोड को नीचे करने की कोशिश करने के लिए बहुत आसान है, एक javascript फ़ंक्शन को एक टेस्ट संदेश के साथ कॉल करें, जो एंड्रॉइड ऐप में जावा फ़ंक्शन को वापस कॉल करता है जो टोस्ट के माध्यम से परीक्षण संदेश प्रदर्शित करता है।

javascript फ़ंक्शन इस तरह दिखता है:

function testEcho(message){
     window.JSInterface.doEchoTest(message);
}

वेबव्यू से, मैंने javascript को बिना किसी किस्मत के निम्नलिखित तरीकों से कॉल करने का प्रयास किया है:

myWebView.loadUrl("javascript:testEcho(Hello World!)");
mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()");

मैंने WebView पर javascript को सक्षम किया है

myWebView.getSettings().setJavaScriptEnabled(true);
// register class containing methods to be exposed to JavaScript
myWebView.addJavascriptInterface(myJSInterface, "JSInterface"); 

और Java क्लास का पालन करता है

public class JSInterface{

private WebView mAppView;
public JSInterface  (WebView appView) {
        this.mAppView = appView;
    }

    public void doEchoTest(String echo){
        Toast toast = Toast.makeText(mAppView.getContext(), echo, Toast.LENGTH_SHORT);
        toast.show();
    }
}

मैंने यह देखने के लिए बहुत समय बिताया है कि मैं क्या गलत कर रहा हूं। मैंने पाया है कि सभी उदाहरण इस दृष्टिकोण का उपयोग करें। क्या कोई यहां कुछ गलत देखता है?

संपादित करें: html में संदर्भित और उपयोग की जाने वाली कई अन्य बाहरी javascript फाइलें हैं, क्या वे समस्या हो सकती हैं?


मुझे पता चला कि समस्या क्या थी: testEcho () पैरामीटर में गायब उद्धरण। इस तरह मुझे कॉल करने के लिए कॉल मिला:

myWebView.loadUrl("javascript:testEcho('Hello World!')");

हां आपके पास वाक्यविन्यास त्रुटि है। अगर आप अपने जावास्क्रिप्ट में अपनी जावास्क्रिप्ट त्रुटियों और प्रिंटिंग कथन प्राप्त करना चाहते हैं तो आपको अपने onConsoleMessage(ConsoleMessage cm) में onConsoleMessage(ConsoleMessage cm) विधि को लागू करना होगा। यह वेब कंसोल (तत्व का निरीक्षण) जैसे पूर्ण स्टैक निशान देता है। विधि यहाँ है।

public boolean onConsoleMessage(ConsoleMessage cm) 
    {
        Log.d("ShowMote", cm.message() + " -- From line "
                             + cm.lineNumber() + " of "
                             + cm.sourceId() );
        return true;
    }

कार्यान्वयन के बाद आपको अपने जावास्क्रिप्ट त्रुटियों और प्रिंट स्टेटमेंट्स ( console.log ) को आपके लॉगकैट पर प्राप्त होगा।


किटकैट से नीचे जावास्क्रिप्ट फ़ंक्शंस को कॉल करने के लिए बजाय LOUrl का मूल्यांकन करें जावास्क्रिप्ट विधि का उपयोग करें

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        webView.evaluateJavascript("enable();", null);
    } else {
        webView.loadUrl("javascript:enable();");
    }

@Ilya_Gazman उत्तर का संशोधन

    private void callJavaScript(WebView view, String methodName, Object...params){
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("javascript:try{");
        stringBuilder.append(methodName);
        stringBuilder.append("(");
        String separator = "";
        for (Object param : params) {               
            stringBuilder.append(separator);
            separator = ",";
            if(param instanceof String){
                stringBuilder.append("'");
            }
                stringBuilder.append(param);
            if(param instanceof String){
                stringBuilder.append("'");
            }

        }
        stringBuilder.append(")}catch(error){console.error(error.message);}");
        final String call = stringBuilder.toString();
        Log.i(TAG, "callJavaScript: call="+call);


        view.loadUrl(call);
    }

जेएस कॉल जैसे सही ढंग से बना देगा

callJavaScript(mBrowser, "alert", "abc", "def");
//javascript:try{alert('abc','def')}catch(error){console.error(error.message);}
callJavaScript(mBrowser, "alert", 1, true, "abc");
//javascript:try{alert(1,true,'abc')}catch(error){console.error(error.message);}

ध्यान दें कि वस्तुओं को सही ढंग से पारित नहीं किया जाएगा - लेकिन आप तर्क के रूप में गुजरने से पहले उन्हें क्रमबद्ध कर सकते हैं।

साथ ही मैंने यह भी बदल दिया है कि त्रुटि कहां जाती है, मैंने इसे कंसोल लॉग में बदल दिया है जिसे सुनकर सुना जा सकता है:

    webView.setWebChromeClient(new CustomWebChromeClient());

और ग्राहक

class CustomWebChromeClient extends WebChromeClient {
    private static final String TAG = "CustomWebChromeClient";

    @Override
    public boolean onConsoleMessage(ConsoleMessage cm) {
        Log.d(TAG, String.format("%s @ %d: %s", cm.message(),
                cm.lineNumber(), cm.sourceId()));
        return true;
    }
}




webview