5

Is is possible to call main activity's methods from the JavaScript interface of a WebView object? Or to access SharedPreferences from this interface so I could read the data with my activity? I would like to let my Activity know that a specific JavaScript action occured.

1

3 Answers 3

2

Yes, two way communication between JavaScript and your application is possible through WebView.addJavascriptInterface(). Check this example:

http://android-developers.blogspot.com/2008/09/using-webviews.html

Sign up to request clarification or add additional context in comments.

5 Comments

OK, this sort of solves my problem. In the example given by you it works, because DemoJavaScriptInterface is a subclass of WebViewDemo class and can access its methods. But is there a way to achieve it when it is not a subclass?
It doesn't use any of WebViewDemo methods. It only uses mHandler and that could be passed to the constructor.
I tried to pass the mHandler but the main Activity is still inaccessible. When I try mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); I get myWebView cannot be resolved
You also need to pass mWebView to cunstructor, I didn't see that before.
Actually I don't. I found out that myWebView was private and that's why I wasn't able to access it :) Nevertheless I think I will make a subclass (like in the example) because it seems much easier without handlers. Thanks for your help!
2

Your activity:

/*
 * entry point of the application starting the index.html of PhoneGap
 * */

package com.test.my.myApp;

import org.apache.cordova.DroidGap;

import android.os.Bundle;
import android.util.Log;

import com.google.analytics.tracking.android.EasyTracker;

public class MyOpelMainActivitiy extends DroidGap
{

    String curPhoneNumber;

    @Override
    public void onCreate(Bundle savedInstanceState)
    { 
        super.onCreate(savedInstanceState);
        super.setIntegerProperty("splashscreen", R.drawable.splash);
        super.loadUrl("file:///android_asset/www/app/index.html",15000); 

    }
    @Override
    public void onStart() {
      super.onStart();
      this.appView.addJavascriptInterface(new JsInterface(), "android");  
      curPhoneNumber = "test";

      // The rest of your onStart() code.
      EasyTracker.getInstance().activityStart(this); // Add this method.
    }

    @Override
    public void onDestroy() 
    {
        super.onDestroy();       
        com.google.analytics.tracking.android.EasyTracker.getInstance().activityStop(this);
    }

    public class JsInterface{   





            public String getPhoneNumber()
            {

                // Here call any of the public activity methods....
                return curPhoneNumber;
            }
        }
    }

HTMl markup:

<script type="text/javascript">
            alert(android.getPhoneNumber());
        </script>

========================================================================

1 Comment

In this example for api17+ the getPhoneNumber must have the annotation @android.webkit.JavascriptInterface
1

You can use WebView.addJavascriptInterface function to achieve this. More info: In Google documentation

2 Comments

Yes, I am using addJavascriptInterface(new JavaScriptInterface(this), "Android"); The question was: how to call main activity's method from within the JavaScriptInterface class.
Can you update your question with the code you have at the moment?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.