【问题标题】:Android: how to initiate android's featues through javascriptAndroid:如何通过javascript启动android的功能
【发布时间】:2014-09-25 11:36:57
【问题描述】:

我有一个代码可以说出从 html 传递的文本。我能够使用下面的代码使其工作。

代码如下:

    tts = new TextToSpeech(this, this);
    myWebView = (WebView) findViewById(R.id.webviewid);
    //The html text is from the server.
    myWebView.loadDataWithBaseURL(null,
            "<html>" +
            "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">" +
            "</head>" +
            "<body>" +
            "<input class=\"textBox\" id=\"pass\" type=\"text\" maxlength=\"30\" required/>" +
            "<input type=\"button\" value=\"Say hello\" onClick=\"androidSpeak('Hello Android!')\" />" +
            "<script type=\"text/javascript\">" +
            "    function androidSpeak(texttospeak) {" +
            "        Android.textToSpeak(texttospeak);" +
            "    }" +
            "</script>" +
            "</body>" +
            "</html>", "text/html", "UTF-8", null);
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");

这是我的 Java 脚本界面:

    protected class WebAppInterface {
        Context mContext;

        /** Instantiate the interface and set the context */
        WebAppInterface(Context c) {
            mContext = c;
        }

        /** Show a toast from the web page */
        @JavascriptInterface
        public void textToSpeak(String texttospeak) {
            Toast.makeText(mContext, texttospeak, Toast.LENGTH_SHORT).show();
            speakOut(texttospeak);
        }
    }


    private void speakOut(String text) {
        tts.speak(text, TextToSpeech.QUEUE_ADD, null);
    }

上面的代码按预期工作。 我的问题是如何通过 javascript 调用 TTS 或任何其他功能(如警报或拨打电话等)。这意味着可以从 javascript 调用 tts.speak() 方法。或者以另一种方式,我想通过 javascript 调用 androids TTS,而不是创建 Java 脚本接口(如上)。这样我就不必为我要添加的每个功能向用户提供更新。

示例:请注意:下面是一个示例,我知道这是不正确的。这是为了让您大致了解我需要做什么。

    //The html text is from the server.
    myWebView.loadDataWithBaseURL(null,
            "<html>" +
            "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">" +
            "</head>" +
            "<body>" +
            "<input class=\"textBox\" id=\"pass\" type=\"text\" maxlength=\"30\" required/>" +
            "<input type=\"button\" value=\"Say hello\" onClick=\"androidSpeak('Hello Android!')\" />" +
            "<script type=\"text/javascript\">" +
            "    function androidSpeak(texttospeak) {" +
            "        tts = new TextToSpeech(this, this);" +
            "        tts.speak(text, TextToSpeech.QUEUE_ADD, null);" +  <<< directly invoke the android's TTS.
            "    }" +
            "</script>" +
            "</body>" +
            "</html>", "text/html", "UTF-8", null);

有没有我需要添加的插件。请告诉我。任何帮助表示赞赏。

【问题讨论】:

  • 您所提议的(使用 javascript 调用 Android 代码)几乎是不可能的。即使有可能(使用反射左右),这也将是一个巨大的安全风险,并且几乎可以肯定会从游戏商店中删除。
  • 好的,我正在对此进行更多研究。我遇到了cordova。您对此有什么想法,因此上述内容可以与cordova 一起使用吗?
  • 您绝对可以使用 cordova 将 javascript 代码交叉编译到 Android,但是您无法远程更新此功能。每当您添加/更改功能时,您仍然需要上传新的 APK。

标签: javascript android android-webview android-jsinterface


【解决方案1】:

Cordova 将允许您从您的 javascript 调用自定义的原生 android 代码,或者您可以使用其库中的插件,这些插件公开常见的硬件元素(例如菜单按钮、原生通知等)。 Cordova 创建了一个完整的应用程序环境,因此您不必担心任何 android 应用程序细节,并在 html5/javascript 中构建您的所有应用程序逻辑。 Phonegap 是 Cordova 的一个实现,它提供了非常好的构建工具——你甚至不需要在你的开发机器上设置 android 构建工具——只需上传你的 html 站点,它就会为你构建你的 android 应用程序。 :P

【讨论】:

  • 在不上传新APK的情况下,我可以只更新html站点并触发Android功能吗?比如今天我添加了TTS功能,明天不更新APK,我可以使用Cordova添加Alarm功能吗?
  • 不,所需的权限包含在您构建cordova 应用程序时。除非您更新应用程序,否则这些无法更改。当然,即使您尚未构建功能,也没有什么能阻止您请求您认为可能需要的所有权限。除了请求所需的权限外,您需要在构建中包含适当的插件。您的实际 html 文件可以是远程文件,也可以嵌入 iframe,因此您可以像更新网站一样轻松部署新的应用程序逻辑。
  • 要明确一点:是的,只要 html 存储在远程服务器上,您就可以更新您的站点/应用程序(我通常通过 iframe 执行此操作,但这不是必需的)。重要的是使用适当的权限和插件构建应用程序。完成后,您可以随意更新您的应用,而无需重新部署。
  • 如果您将 html 应用程序存储在远程服务器上,您还应该使用 appCache html5 功能,该功能可确保代码/文件缓存在本地。如果你做对了,你可以在离线模式下很好地使用你的应用程序。
  • 如果我们需要在构建应用程序之前放置所有插件,那么这就是我的想法……但这不是正确的解决方案。 :) 因为我们甚至不知道要添加或删除什么功能。我们在想或想的是“一个 java 脚本语句应该调用 android 的功能”。如果可能的话,那么我们可以只更新 html(在远程位置),甚至不更新 APK。
【解决方案2】:

您可以查看 Intel XDK:https://software.intel.com/en-us/html5/tools 并从 http://xdk-software.intel.com/ 下载。它提供了您在对先前答案的回复中提到的 cordova 构建选项:https://software.intel.com/en-us/html5/articles/using-the-cordova-for-android-ios-etc-build-option

谢谢

【讨论】:

  • 是的,我提到过,但您认为我的实际问题会得到解决吗?
【解决方案3】:

是的,请查看 WebView 中的addJavascriptInterface 方法。 查看更多信息 herehere

【讨论】:

  • 是的,我也用过,请看原始问题。但问题是如何从 Java 脚本启动 android 功能。
  • 您将不得不在 js 中使用“Android”对象,并根据需要调用它使用参数实现的方法,这将立即在 java 端产生回调。在此示例中为 Android. textToSpeak("Some text")
  • 我猜,您已经查看了原始问题中的代码。您的建议已经发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多