2014-09-25 55 views
3

我有一個代碼來說明從HTML傳遞的文本。我可以使用下面的代碼使其工作。Android:如何通過JavaScript啓動android的功能

下面是代碼:

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來調用androidTSTTS,而不是創建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); 

是否有我需要添加的插件。請告訴我。任何幫助表示讚賞。

+0

您提出的問題(使用JavaScript調用Android代碼)幾乎是不可能的。即使有可能(使用反射等),這將是一個巨大的安全風險,幾乎肯定會從遊戲商店中刪除。 – Nachi 2014-09-25 11:50:06

+0

好的,我正在研究更多這個..我碰到'cordova'。你有這個想法,所以上面可以使用'cordova'嗎? – User12111111 2014-09-25 12:06:02

+0

您絕對可以使用cordova將JavaScript代碼交叉編譯爲Android,但無法遠程更新此功能。每當您添加/更改功能時,您仍然必須上傳新的APK。 – Nachi 2014-09-25 12:08:10

回答

1

Cordova將允許您從您的JavaScript調用自定義原生Android代碼,或者你可以從他們的圖書館,其揭露使用插件常見的硬件元素(如菜單按鈕,原生通知等)。 Cordova創建了一個完整的應用程序環境,因此您不必擔心任何android應用程序細節,並在html5/javascript中構建所有應用程序邏輯。 Phonegap是Cordova的一個實現,它提供了非常好的構建工具 - 你甚至不需要在你的開發機器上設置android構建工具 - 只需上傳你的html網站,它就會爲你構建你的android應用程序。 :P

+0

沒有上傳新的APK,我可以只更新HTML網站並觸發Android功能嗎?例如今天我添加了'TTS'功能,明天不更新APK,我可以使用'Cordova'添加'Alarm'功能嗎? – User12111111 2014-10-06 13:15:34

+0

不,所需的權限在構建科爾多瓦應用程序時包含在內。除非您更新應用程序,否則這些更改無法更改。當然,即使您尚未構建功能,也不會阻止您請求所有您認爲可能需要的權限。除了請求所需的權限之外,您還需要在構建中包含適當的插件。您的實際HTML文件可以是遠程文件,也可以嵌入iframe,因此您可以像更新網站一樣輕鬆地部署新的應用程序邏輯。 – 2014-10-06 19:43:37

+0

只是要清楚:是的,只要html存儲在遠程服務器上,我就可以更新您的網站/應用程序(我通常通過iframe執行此操作,但這不是必需的)。重要的是使用適當的權限和插件來構建應用程序。一旦完成,您可以在不重新部署的情況下儘可能多地更新您的應用程序。 – 2014-10-06 19:45:53

0

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

+0

是的,我用過,請看原文。但問題是如何從Java腳本啓動android功能。 – User12111111 2014-10-06 13:13:10

+0

你將不得不使用js中的「Android」對象,並根據需要調用它實現的參數方法,這將立即在java方面產生回調。在這個例子中就是'Android。 textToSpeak(「一些文本」)' – buddy123 2014-10-06 18:20:42

+0

我想,你已經看了原代碼中的代碼。你建議的內容已經發布。 – User12111111 2014-10-07 07:07:23