从浏览器访问Android API

时间:2013-10-27 05:31:17

标签: javascript android native

我知道如果我使用嵌入式WebView,我可以从javascript调用android本机API。

但是,是否可以从Android中的常规浏览器访问这些API,例如Firefox Mobile或股票浏览器?我认为我必须在某处明确授予许可,否则这将是一个很大的安全漏洞。

我很难看到使用创建运行javascript的特殊应用程序;我的应用程序是运行服务器的常规Web应用程序(未嵌入我的Android应用程序中)并且经常更新(因此不适合嵌入应用程序),在某些情况下,添加直接查询各种信息的功能会很有用来自网页,主要是为了防止Android杀死浏览器并在重新进入时强制重新加载网络应用程序,因为我不得不花5秒钟跳出(例如)Firefox以手动获取信息。

1 个答案:

答案 0 :(得分:2)

我认为无论如何都可以从常规浏览器调用您的Android API(它们没有将它们作为DOM模型的一部分),除非您为每个浏览器构建自己的特定扩展。这将是乏味的工作,可能不值得,因为这正是嵌入式WebViews存在的原因(如Phonegap)。

现在,您可以尝试反过来,即从服务器直接从WebView加载您的网页。默认情况下,webviews会从设备的本地存储中加载其内容,但是,使用XHR,您可以调用传统网页并在Webview中显示它们。

这可以使用可以嵌入服务器内容或iframe的div来实现,从浏览器中完全加载整个页面。第二种方法将更加透明,因为您可以完全重用当前的网页,但是由于跨源问题的安全限制,它会阻止您将包装器与网页进行通信。我建议采用第一种方法,尽管您可能需要重构服务器网页,以便更好地与您的应用程序集成。

这样可以这样工作(为了简单起见,我使用的是JQuery,但你可以直接使用XHR):

  1. 在webview中创建一个小的index.html(phonegap或者你正在使用的任何东西)并定义一个将作为包装来调用你的服务器:

    <html>
    <head>
    <!-- Load all your css and javascript stuff here -->
    </head>
    <body>
    <div id="wrapperdiv"></div>
    </body>
    </html>

  2. 包含javascript以动态加载服务器中的内容:

    $(function() {
        $.ajax({
            url: 'http://www.michaels-server.com/your-web-endpoint',
            type: 'GET',
            crossDomain: true,
            success: function(data, textStatus, xhr) {
                $('#wrapperdiv').html(data);
            }
            error: function() { alert("Cannot contact server."); }
        });
    });
    
  3. 配置嵌入式Web视图以允许跨源请求。在phonegap中,您可以执行以下操作:

    &lt; widget ...&gt;

    &lt;! - 这里的小部件配置 - &gt;

    &lt; access origin =“*”/&gt ;

    &lt;! - 更多小部件配置 - &gt;

    &lt; / widget&gt;

  4. html包装器中的div现在将动态加载服务器中的内容。该页面中的任何javascript都可以使用嵌入式webviews DOM模型调用Native API,例如Phonegap提供的模型。

    希望这有帮助。