Android - How to run intent from JavaScript
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:
- Create your 'interface' class in Android
- Add an instance of this 'interface' to the
WebView
you are using. - 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.
user899641
Updated on June 18, 2022Comments
-
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 over 12 yearsOk, I edited my question and included what I have so far. Can you tell me what I'm doing wrong?
-
user899641 over 12 yearsI edited my question and included what I have so far. Can you tell me what I'm doing wrong?
-
nicholas.hauschild over 12 yearsYour
JavaScriptInterface
class should not extendActivity
. It will be its own class that has asend()
method. YourActivity
class should do the second part of your codessend()
method (theWebView
portion) -
user899641 over 12 yearsI 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 over 12 years
-
user899641 over 12 yearsI updated my question with my current code. Please let me know what you think now.
-
user899641 over 12 yearsAwesome! This really helps. I am still having one issue though. "The method startActivity(Intent) is undefined for the type - JavaScriptInterface"
-
adamcodes over 12 yearsThat is because startActivity is a method under the Activity class. Try mGap.startActivity. If not, there's probably a workaround.
-
user899641 over 12 yearsok,
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 about 11 years@nicholas.hauschild i'am follow same documentation but toast message no fire why.