开发者

Android - How to run intent from JavaScript

开发者 https://www.devze.com 2023-03-31 07:55 出处:网络
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 (t

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");
  开发者_如何学Go  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?


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.


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..."));
    } 
}


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.


I used WebIntents from Boris Smus (http://smus.com/android-phonegap-plugins) and it works like a charm. You can also peruse his code a little to understand better the approach he took with plugins.

NOTE: you do need to update the code provided as is a little (see comments) and the plugin architecture has changed a little.

0

精彩评论

暂无评论...
验证码 换一张
取 消