2017-08-04 61 views
1

我知道这个问题已被问了很多时间,但我找不到任何帮助。Android WebView geolocation

我正在尝试构建一个应用程序,该应用程序可以加载使用地理位置的网站。

当应用程序加载时,它应该打开一个带有我的位置的谷歌地图。在网络浏览器上它工作正常。

链接我试图访问https://pas.irsglobal.net/test/

我的代码如下。

//MainActivity.java

package za.co.opexsolutions.www.panicapp; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
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); 
    } 
} 



WebView wv; 
String mypage = "https://pas.irsglobal.net/test/"; 
String mypage_error = "file:///android_asset/mypage_error/index.html"; 

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


    wv = (WebView) findViewById(R.id.wv); 
    wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
    wv.setWebViewClient(new GeoWebViewClient()); 
    wv.getSettings().setJavaScriptEnabled(true); 
    wv.getSettings().setGeolocationEnabled(true); 
    wv.setWebChromeClient(new GeoWebChromeClient()); 
    wv.setFocusable(true); 
    wv.setFocusableInTouchMode(true); 
    wv.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); 
    wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 
    wv.getSettings().setDomStorageEnabled(true); 
    wv.getSettings().setDatabaseEnabled(true); 
    wv.getSettings().setAppCacheEnabled(true); 



    wv.setWebChromeClient(new WebChromeClient() { 
     public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { 
      // callback.invoke(String origin, boolean allow, boolean remember); 
      callback.invoke(origin, true, false); 
     } 
    }); 

    wv.loadUrl(mypage); 

    wv.setWebViewClient(new WebViewClient(){ 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      wv.loadUrl(mypage_error); 
     } 
    }); 



} 

}

//Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission> 
<uses-permission android:name="android.permission.LOCATION_HARDWARE"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/shipping" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/shipping" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <activity android:name=".HomeActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

+0

请参阅:[?如何避免误用标签](https://meta.stackoverflow.com/questions/354427/how-do-i-avoid-misusing-标签) – EJoshuaS

回答

0

好的,经过一段时间的寻找可能是问题,我希望这也能帮助其他人。 在这种情况下,问题不是我的代码,而是我在仿真器上运行的Android版本。 (我正在使用Android 7牛轧糖)。

从Android 6.0(API级别23)开始,用户在应用程序运行时为应用程序授予权限,而不是在安装应用程序时授予应用程序权限。

如果设备运行的是Android 6.0或更高版本,并且您的应用的目标SDK为23或更高:应用必须列出清单中的权限,并且它必须在应用运行时请求所需的每个权限。用户可以授予或拒绝每个权限,并且即使用户拒绝权限请求,应用也可以继续以有限的功能运行。

对于全力协助Please Click Here