1

I'm working on an App, where I execute a Java method when I click on a link in a webview and expect a result from that method. In that method I start another activity with startActivityForResult which works just fine (I have putted some logs on that activity and everythings is good), but it looks like the method doesn't return anything..

Here's my code :

HTML : (all the includes are ok)

<script type="text/javascript">
    $("#run-qrscan").on("click", function(){

        var qr_data = window.WebAppInterface.startScan(); 
        // startScan is the Java method I call
        // call the function opens the activity etc.. but doesn't get any result 

        $("#display-qrresult").html(qr_data); // doesn't display anything
    });
</script>

My activity : WebActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_web);

    WebView webview = (WebView) findViewById(R.id.aw_webView);

    WebAppInterface jsInterface = new WebAppInterface(this);
    webview.getSettings().setJavaScriptEnabled(true);

    webview.setWebChromeClient(new WebChromeClient());

    webview.addJavascriptInterface(jsInterface, "WebAppInterface");
    webview.loadUrl("file:///android_asset/index.html");
}

My Javascript interface : WebAppInterface.java

import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.webkit.JavascriptInterface;

public class WebAppInterface {

    private static Activity activity;
    public static int WEB_APP = 0;

    private static int REQUEST_FOR_ACTIVITY_CODE_SCAN = 1000;
    private static String qr_data = "";
    private static Intent intent;

    public WebAppInterface(Activity activity) {
        WebAppInterface.activity = activity;
    }

    @JavascriptInterface
    public static String startScan() {
        Intent intent = new Intent(activity, ScanActivity.class);
        WEB_APP = 1;

        activity.startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE_SCAN);

        //Wait for startActivityForResult to end -since it's asynchronous
        while(WEB_APP == 1) {}

        Log.d("qr_return", qr_data); // Doesn't display it.

        return qr_data; // Empty
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Scan QR
        if (requestCode == REQUEST_FOR_ACTIVITY_CODE_SCAN) {
            if (resultCode == Activity.RESULT_OK) {
                qr_data = data.getStringExtra("qr_data");
            }
        }
        WEB_APP = 0;
    }
}

So what am I doing wrong ? Thank you.

1 Answer 1

2

Sorry, My bad, I didn't pay attention that the class where i was calling the startActivityForResult was only a class and not an Activity.. So when the data was returned it wasn't returned to it..

I'm posting this code in case someone like me didn't pay attention to that.

1- Remove the WebAppInterface.java class

2- WebActivity.java :

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebView;

public class WebActivity extends Activity {

    public static int WEB_APP = 0;

    private static int REQUEST_FOR_ACTIVITY_CODE_SCAN = 1000;
    private static String qr_data = "";

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);

        WebView webview = (WebView) findViewById(R.id.aw_webView);

        WebAppInterface jsInterface = new WebAppInterface();
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebChromeClient(new WebChromeClient());
        webview.addJavascriptInterface(jsInterface, "WebAppInterface");
        webview.loadUrl("file:///android_asset/index.html");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return false;
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Scan QR
        if (requestCode == REQUEST_FOR_ACTIVITY_CODE_SCAN) {
            if (resultCode == Activity.RESULT_OK) {
                qr_data = data.getStringExtra("qr_data");

                Log.d("QR", qr_data);
            }
        }
        WEB_APP = 0;
    }

    public class WebAppInterface {

        WebAppInterface() {}

        @JavascriptInterface
        public  String startScan() {
            Intent intent = new Intent(WebActivity.this, ScanActivity.class);
            WEB_APP = 1;

            startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE_SCAN);

            while(WEB_APP == 1) {}

            Log.d("qr_return", qr_data);

            return qr_data;
        }
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

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