我只是在玩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
答案 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);
}