如何使用android webview在appcelerator的钛移动应用程序上运行地理定位

时间:2011-05-09 07:10:22

标签: javascript android geolocation webview titanium

我只是在玩Appcelerator的Titanium平台来开发移动应用程序。

我的测试应用程序只是打开一个指向在线网页的webview。此页面uses the W3C Geolocation API用于获取用户的位置。

这是我的tiapp.xml特定的android权限:

<android xmlns:android="http://schemas.android.com/apk/res/android">
    <manifest>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    </manifest>
</android>

这是我获取coords的javascript代码:

if (navigator.geolocation) {

    navigator.geolocation.getCurrentPosition(function(position){

        $("#results").append('Longitude: ' + position.coords.longitude + '<br/>');
        $("#results").append('Latitude: ' + position.coords.latitude + '<br/>');

    }, function(error){

        $("#results").append('An error ocurred ' + error.message);
    });

} else {

    $("#results").append('Geolocation not supported');
}

似乎定义了navigator.geolocation和navigator.geolocation.getCurrentPosition,但无论如何都没有执行委托。

问题是:如何让这个工作? : - )

提前致谢。

更新:我发现问题似乎是Android 2.x webview有自己的navigator.geolocation实现。根据关于phonegap源代码的this commit

更新2:我写了一个非常小的完全原生的Android应用程序,打开一个webclient到同一个网页,并且工作正常:

package com.sourcerebels;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.GeolocationPermissions.Callback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;

class MyClient extends WebChromeClient {

    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
            Callback callback) {
        callback.invoke(origin, true, false);
    }
}

public class TestWebClient extends Activity {

    WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webView = (WebView) findViewById(R.id.webView1);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setGeolocationDatabasePath("/data/data/testWebClient");
        webView.loadUrl("http://www.sourcerebels.com/index2.html");

        webView.setWebChromeClient(new MyClient());
    }
}

更新3 :我从appcelerator的github网站找到了这个来源:https://github.com/appcelerator/titanium_mobile/blob/master/android/modules/ui/src/ti/modules/titanium/ui/widget/webview/TiWebChromeClient.java

3 个答案:

答案 0 :(得分:4)

Titanium最强大的方面是它在每个平台上都是Native Code。通过使用webview,您将极大地避免使用本机代码。

http://wiki.appcelerator.org/display/guides/Using+Location+services

http://wiki.appcelerator.org/display/guides/HTML5+vs+Native+UI

在标题为何时使用HTML的部分中,它说明了以下内容:

“应该尽可能地避免使用HTML。几乎所有你需要的东西都可以使用本机代码来完成。应用程序加载速度更快,对用户的操作反应更快,从而带来更好的用户体验。”

按照这些标准,我会建议您获取位置,然后创建或更新Webview。至于javascript无法正常工作的原因我没有答案,因为在创建webview时会加载完整的DOM?

答案 1 :(得分:3)

最后,我通过修改Titanium mobile SDK源中的TiWebChromeClient.java并生成一个新的titanium-ui.jar文件解决了这个“问题”。

添加了此代码,现在我可以在Android webView上使用地理位置:

import android.webkit.GeolocationPermissions.Callback;

...

    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
            Callback callback) {
        callback.invoke(origin, true, false);
    }

答案 2 :(得分:1)

我们的解决方案如下:

import android.webkit.GeolocationPermissions;

    // enable navigator.geolocation 
    mWebView.getSettings().setGeolocationEnabled(true);
    mWebView.getSettings().setGeolocationDatabasePath("/data/data/databases/");


    // START Allow Geolocation prompt
    public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
        callback.invoke(origin, true, false);
    }