Android - 如何从JavaScript中运行意图(Intent)

6

我对Android和Java都是新手。我使用HTML/Javascript构建了一个很好的应用程序。

现在我需要创建一个活动来启动电子邮件客户端,填写主题和正文,并(难点)添加附件。我无法从JavaScript中实现此操作,mailto:将不会添加文件。

因此,我需要通过Java完成这项任务,并从JavaScript执行它。我认为可以使用addJavaScriptInterface来完成,但我找不到任何详细的文档或示例。

我该如何做呢?

在阅读文档后,以下是我的一些代码:

代码的第二次更新:

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

然后我将使用Android.doEmail()通过JavaScript引用意图。

使用上述代码,我在Eclipse中遇到了两个错误: 1. 方法startActivity(Intent)未定义 - JavaScriptInterface 2. webview无法解析或不是字段 - MainActivity

我做错了什么?

4个回答

6

这份文档会准确告诉你如何做。

看起来有三个主要步骤:

  1. 在Android中创建你的“接口”类。
  2. 将此“接口”的实例添加到你正在使用的WebView中。
  3. 从你的JavaScript中调用该接口。

好的,我编辑了我的问题并包含了我目前所拥有的内容。你能告诉我我做错了什么吗? - user899641
你的 JavaScriptInterface 类不应该继承 Activity。它将是一个拥有 send() 方法的独立类。你的 Activity 类应该完成 send() 方法的第二部分(即 WebView 部分)。 - nicholas.hauschild
@nicholas.hauschild 我按照相同的文档操作,但是提示消息没有触发,为什么呢? - NagarjunaReddy

4
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);
    }
}

并且

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

我已经有一个MainActivity。我应该在这里包含其他的东西吗?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); } } - user899641
https://dev59.com/XHE85IYBdhLWcg3wikEu - adamcodes
我更新了我的问题并附上了我的当前代码,请告诉我您现在的想法。 - user899641
太棒了!这真的很有帮助。不过我还有一个问题。“The method startActivity(Intent) is undefined for the type - JavaScriptInterface”。 - user899641
这是因为startActivity是Activity类下的一个方法。尝试使用mGap.startActivity。如果不行,可能有一些解决方法。 - adamcodes
好的,mGap.startActivity 起作用了。现在该应用程序在提示时可正常使用 Gmail,但当我选择 Email 时,会得到以下结果:“应用程序 Email (进程 com.google.android.email) 已突然停止。强制关闭。” 我需要使用企业电子邮件,所以这不是个好办法。有什么想法吗? - user899641

2

使用addJavaScriptInterface将扩展嵌入式浏览器内部的DOM,并允许JS访问Java对象,这正是您想要的。

这里有太多步骤需要概述,已经有文档记录。这个链接提供了很好的概述。


我编辑了我的问题并包含了我目前的进展。你能告诉我我做错了什么吗? - user899641

0
我使用了Boris Smus的WebIntents(http://smus.com/android-phonegap-plugins),它非常好用。您还可以浏览一下他的代码,更好地理解他使用插件的方法。
注意:您确实需要稍微更新提供的代码(请参见注释),并且插件架构已经有所改变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接