【问题标题】:Android Webview with HTML 5 geolocation带有 HTML 5 地理位置的 Android Webview
【发布时间】:2015-11-24 00:39:38
【问题描述】:

我正在使用 webview 来加载 web 应用程序。在我加载的页面中,我使用 HTML 5 地理定位 API 来检测用户位置。这适用于所有浏览器,目前可以在 iOS 应用程序中使用。出于某种原因,我无法让它在 Android 网络视图中工作。当我运行下面的代码时,我在堆栈跟踪中看到了这条消息:

[INFO:CONSOLE(24)] "Uncaught ReferenceError: PageMethods is not defined",来源:[THE URL FOR THE SCRIPT] (24)

这个功能在浏览器中也很好。

    package bar.krowd.krowdapp;

    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.webkit.GeolocationPermissions;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;

    public class MainActivity extends AppCompatActivity {

    private WebView KrowdView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().hide();

        KrowdView = (WebView) findViewById((R.id.activity_main_webview));

        WebSettings ws = KrowdView.getSettings();
        ws.setJavaScriptEnabled(true);
        ws.setGeolocationEnabled(true);


        KrowdView.setWebViewClient(new WebViewClient());
        KrowdView.setWebChromeClient(new GeoWebChromeClient());

        KrowdView.setBackgroundColor(Color.BLACK);
        KrowdView.loadUrl([I AM PUTTING THE URL HERE]);
}


@Override
public void onBackPressed() {
    // Pop the browser back stack or exit the activity
    if (KrowdView.canGoBack()) {
        KrowdView.goBack();
    }
    else {
        super.onBackPressed();
    }
}

public class GeoWebChromeClient extends WebChromeClient {
    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
                                                   GeolocationPermissions.Callback callback) {
        // Always grant permission since the app itself requires location
        // permission and the user has therefore already granted it
        callback.invoke(origin, true, false);
    }
}

}

我的 AndroidManifest.xml 中列出了以下内容:

    <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" />

【问题讨论】:

    标签: javascript android html webview


    【解决方案1】:

    这似乎是一个错误,我解决了它在 app build.gradle 中将 targetSdkVersion 从 23 降级到 21

    【讨论】:

    • 这应该在 cmets 部分而不是答案
    【解决方案2】:

    添加这个:

    webView.getSettings().setAppCacheEnabled(true);
    webView.getSettings().setDatabaseEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    

    【讨论】:

    • 我看起来好像没有找到 jQuery。我知道 jQuery 在位置加载之前作为动画仍在运行。正如您从下面看到的,我收到“应用程序没有足够的地理位置权限”错误。
    • I/chromium: [INFO:CONSOLE(117)] "未捕获的 ReferenceError: JQuery 未定义",来源:[脚本 URL] (117) 11-23 20:33:33.689 2168-2168 /bar.krowd.krowdapp E/LocationProvider:在从系统注册位置更新时捕获安全异常。该应用程序没有足够的地理定位权限。 11-23 20:33:34.006 2168-2168/bar.krowd.krowdapp I/chromium: [INFO:CONSOLE(2)] “未捕获的 ReferenceError: $ 未定义”,来源:[脚本 URL] (2)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2011-01-15
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多