gpt4 book ai didi

javascript - 如何使用 android webview 在 appcelerator 的 titanium 移动应用程序上进行地理定位

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:09 29 4
gpt4 key购买 nike

我只是在玩 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>

这是我获取坐标的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 似乎已定义,但无论如何都不会执行委托(delegate)。

问题是:如何让它发挥作用? :-)

提前致谢。

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

更新 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

最佳答案

Titanium 最强大的方面是它是每个平台上的 native 代码。通过使用 webview,您可以大大避免原生代码的优势。

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

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

在标题为何时使用 HTML 的部分中声明如下:

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

按照这些标准,我建议您获取位置,然后创建或更新 WebView 。至于为什么 javascript 不工作,我没有答案,因为在创建 webview 时加载了完整的 DOM?

关于javascript - 如何使用 android webview 在 appcelerator 的 titanium 移动应用程序上进行地理定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933699/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com