Android - How to run intent from JavaScript

13,923

Solution 1

public class MainActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setIntegerProperty( "splashscreen", R.drawable.splash );

        JavaScriptInterface jsi = new JavaScriptInterface(this, appView);
        appView.addJavascriptInterface(jsi, "Android");

        super.loadUrl("file:///android_asset/www/index.html", 1000);
    }
}

and

public class JavaScriptInterface {
    private WebView mAppView;
    private DroidGap mGap

    public JavaScriptInterface (DroidGap gap, WebView view)
    {
        mAppView = view;
        mGap = gap;
    }

    public void doEmail(){
        Intent sendIntent = new Intent(Intent.ACTION_SEND);
        sendIntent.setType("text/html");
        sendIntent.putExtra(android.content.Intent.EXTRA_TEXT,"test text");
        sendIntent.putExtra(Intent.EXTRA_SUBJECT,"test subject");
        sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        sendIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://test co.html"));
        startActivity(Intent.createChooser(sendIntent, "Send email..."));
    } 
}

Solution 2

This documentation tells you exactly how to do it.

It looks like there are three main steps:

  1. Create your 'interface' class in Android
  2. Add an instance of this 'interface' to the WebView you are using.
  3. Call the interface from your JavaScript.

Solution 3

Using addJavaScriptInterface will extend the DOM inside the embedded browser, and allow JS to access a Java object, which is exactly what you want.

There are too many steps to outline here, that have already been documented. This link has a good overview.

Share:
13,923
user899641
Author by

user899641

Updated on June 18, 2022

Comments

  • user899641
    user899641 almost 2 years

    I am new to Android and Java. I have constructed an app using HTML/Javascript that is working great.

    I now need to create an activity that launches the email client, fills in subject and body, and (the tough part) adds a file attachment. I have not been able to do this from within JavaScript, mailto: will not attach the file.

    So I need to accomplish this through Java and execute it from JavaScript. I think this can be done by using addJavaScriptInterface but I cannot find any detailed documentation or examples to go off of.

    How could I do this?

    Here is what I have so far after reading the documentation:

    2nd update to code:

    MainActivity.java

    public class MainActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setIntegerProperty( "splashscreen", R.drawable.splash );
        super.loadUrl("file:///android_asset/www/index.html", 1000);
        WebView mWebView;
        mWebView = (WebView)findViewById(R.id.webview);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(new JavaScriptInterface(), "Android"); 
    }
    }
    

    JavaScriptInterface.java

    public class JavaScriptInterface {
    
    public void doEmail(){
        Intent sendIntent = new Intent(Intent.ACTION_SEND);
        sendIntent.setType("text/html");
        sendIntent.putExtra(android.content.Intent.EXTRA_TEXT,"test text");
        sendIntent.putExtra(Intent.EXTRA_SUBJECT,"test subject");
        sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        sendIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://test co.html"));
        startActivity(Intent.createChooser(sendIntent, "Send email..."));
        } 
    }
    

    Then I would reference the intent through JavaScript by using Android.doEmail().

    With the above code I am getting 2 errors in Eclipse 1. The method startActivity(Intent) is undefined for the type - JavaScriptInterface 2. webview cannot be resolved or is not a field - MainActivity

    What am I doing wrong?

  • user899641
    user899641 over 12 years
    Ok, I edited my question and included what I have so far. Can you tell me what I'm doing wrong?
  • user899641
    user899641 over 12 years
    I edited my question and included what I have so far. Can you tell me what I'm doing wrong?
  • nicholas.hauschild
    nicholas.hauschild over 12 years
    Your JavaScriptInterface class should not extend Activity. It will be its own class that has a send() method. Your Activity class should do the second part of your codes send() method (the WebView portion)
  • user899641
    user899641 over 12 years
    I already have a MainActivity. Would I include the other stuff here? public class MainActivity extends DroidGap { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setIntegerProperty( "splashscreen", R.drawable.splash ); super.loadUrl("file:///android_asset/www/index.html", 1000); } }
  • adamcodes
    adamcodes over 12 years
  • user899641
    user899641 over 12 years
    I updated my question with my current code. Please let me know what you think now.
  • user899641
    user899641 over 12 years
    Awesome! This really helps. I am still having one issue though. "The method startActivity(Intent) is undefined for the type - JavaScriptInterface"
  • adamcodes
    adamcodes over 12 years
    That is because startActivity is a method under the Activity class. Try mGap.startActivity. If not, there's probably a workaround.
  • user899641
    user899641 over 12 years
    ok, mGap.startActivity worked. The app now works as expected using Gmail when prompted but when I select Email this is what I get: "The application Email (process com.google.android.email) has stopped unexpectedly. Force close." I need it to use corporate email so this is no good. Any ideas?
  • NagarjunaReddy
    NagarjunaReddy about 11 years
    @nicholas.hauschild i'am follow same documentation but toast message no fire why.