【问题标题】:Am I missing something to get google maps to open from android webview我是否遗漏了一些东西来让谷歌地图从 android webview 打开
【发布时间】:2018-06-21 02:42:13
【问题描述】:

我是 android 编程环境的新手,正在创建我的第一个应用程序。当在 webview 中单击谷歌地图链接时,我试图让 webview 打开谷歌地图。我是否遗漏了为什么这仍然在 webview 中打开链接而不是执行谷歌地图?当它在 webview 中打开时,它显示目的地很好,但它没有显示我的位置,并声明它无法确定我在显示页面底部的位置

这里是 MainActivity

package com.example.micha.myapplication;


import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.CookieManager;
import android.webkit.DownloadListener;
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 {

/**
 * WebViewClient subclass loads all hyperlinks in the existing WebView
 */
public class GeoWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // When user clicks a hyperlink, load in the existing WebView
        view.loadUrl(url);
        return true;
    }
}

/**
 * WebChromeClient subclass handles UI-related calls
 * Note: think chrome as in decoration, not the Chrome browser
 */
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);
    }
}

private WebView myWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myWebView = findViewById(R.id.webView);
    WebView myWebView = findViewById(R.id.webView);
    WebSettings webSettings = myWebView.getSettings();
    myWebView.setWebViewClient(new GeoWebViewClient());

    webSettings.setJavaScriptEnabled(true);
    myWebView.getSettings().setGeolocationEnabled(true);
    CookieManager.getInstance().setAcceptCookie(true);
    //webSettings.setDomStorageEnabled(true);
    myWebView.clearHistory();
    myWebView.clearFormData();
    myWebView.clearCache(true);

    myWebView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if( url.startsWith("http:") || url.startsWith("https:") ) {
            return false;
        }

        if(url.contains("https://www.google.com/maps/"))
        {
            Uri gmmIntentUri = Uri.parse(url);
            Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
            mapIntent.setPackage("com.google.android.apps.maps");
            if (mapIntent.resolveActivity(getPackageManager()) != null) {
                startActivity(mapIntent);
            }
            return true;
        }


        // Otherwise allow the OS to handle things like tel, mailto, etc.
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity( intent );
        return true;
    }

});

    myWebView.loadUrl("http://www.example.com");



    //THIS IS TO DOWNLOAD THE PDF FILES OR OTHER DOWNLOAD LINKS
    myWebView.setDownloadListener(new DownloadListener() {
        @Override
        public void onDownloadStart(String url, String userAgent,
                                    String contentDisposition, String mimetype,
                                    long contentLength) {

            startActivity(new Intent(Intent.ACTION_VIEW,  Uri.parse(url)));
        }
    });

}


@Override
public void onBackPressed() {
    if (myWebView.canGoBack()) {
        myWebView.goBack();
        return;
    }
        super.onBackPressed();
    }



  }



Here is the AndroidManifest.XML


    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.micha.myapplication">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACTION_DIAL"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"   />
  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_principal"
    android:label="Admin Tools"
    android:supportsRtl="true"
    android:theme="@style/Theme.AppCompat.NoActionBar">
    <activity android:name=".MainActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />


            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
 </application>

 </manifest>

【问题讨论】:

    标签: java android google-maps android-studio webview


    【解决方案1】:

    发现问题。

    if( url.startsWith("http:") || url.startsWith("https:") ) {

    阻止谷歌地图打开,因为它强制任何带有 https 的 url 留在 web 视图中。修改为

    if( url.startsWith("http:")) {

    现在一切都很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 2011-05-14
      • 1970-01-01
      • 2019-05-17
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多