2017-08-04 52 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