从浏览器访问 Android API

Mic*_*ael 4 javascript android native

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

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

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

apa*_*osa 5

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

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

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

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

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

    <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."); }
        });
    });
    
    Run Code Online (Sandbox Code Playgroud)
  3. 配置您的嵌入式 web 视图以允许跨源请求。在 phonegap 中,您可以执行以下操作:

    <widget ...>

    <!-- 小部件配置的东西在这里 -->

    <access origin="*" />

    <!-- 更多小部件配置的东西 -->

    </widget>

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

希望这可以帮助。