Android WebView utilizzando GeolocationPermissions

Ho esaminato le diverse domande su questo problema qui come:

  • Utilizzo di navigator.geolocation.getCurrentPosition in WebView su Android 2.0+ (correlati a PhoneGap)
  • android webview geolocation
  • Android: Utilizzo di html5 per determinare la geolocalizzazione in webview con javascript api

Ma sono ancora un po 'confuso, so che dovrei creare la mia class dalla class astratta WebChromeClient . Quale ottiene la posizione, ma come esattamente da lì questo object invia il webView la geolocalizzazione / come comunicano?

  • Apri l'URL in WebView anziché il browser predefinito
  • jQuery Mobile non funziona in WebView durante il caricamento da risorse locali
  • Caricare l'html locale in WebView?
  • Apri un collegamento in un webview anziché il browser predefinito
  • Come cambiare la faccia del carattere di Webview in Android?
  • Utilizzo di navigator.geolocation.getCurrentPosition in WebView su Android 2.0+ (correlati a PhoneGap)
  • Ecco il mio codice: (questo è alless sulla buona strada?)

     import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.webkit.GeolocationPermissions.Callback; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import android.webkit.GeolocationPermissions; public class site extends Activity { WebView engine; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WebViewClient yourWebClient = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.contains("tel:") == true) { Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); startActivity(intent); } else if(url.contains("visitchicagosouthland") == true) { view.loadUrl(url); } //Here is where I create my object, I did this because I only need the location when this //page is loaded. Could this be part of the problem? else if(url.contains("directions.cfm") == true) { GeoClient geo = new GeoClient(); engine.setWebChromeClient(geo); String origin = ""; //how to get origin in correct format? Callback call = null; geo.onGeolocationPermissionsShowPrompt(origin, call ); } else { /*Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("url")); startActivity(browserIntent);*/ } return true; } }; engine = (WebView) findViewById(R.id.web_engine); engine.getSettings().setJavaScriptEnabled(true); engine.getSettings().setBuiltInZoomControls(true); engine.getSettings().setSupportZoom(true); engine.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); engine.getSettings().setGeolocationEnabled(true); engine.setWebViewClient(yourWebClient); engine.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); engine.loadUrl("http://www.visitchicagosouthland.com/jrudnydev/phone/"); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.home, menu); return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && engine.canGoBack()) { engine.goBack(); return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection if(item.getItemId() == R.id.home) { engine.loadUrl("http://www.visitchicagosouthland.com/mobile/"); return true; } else if(item.getItemId() == R.id.refresh) { engine.reload(); return true; } else if(item.getItemId() == R.id.stop) { engine.stopLoading(); return true; } else { return super.onOptionsItemSelected(item); } } } final class GeoClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int progress) { // Activities and WebViews measure progress with different scales. // The progress meter will automatically disappear when we reach 100% //Activity.setProgress(progress * 100); } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { //Log.d(LOG_TAG, message); // This shows the dialog box. This can be commented out for dev AlertDialog.Builder alertBldr = new AlertDialog.Builder(null); alertBldr.setMessage(message); alertBldr.setTitle("Alert"); alertBldr.show(); result.confirm(); return true; } @Override public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) { // TODO Auto-generated method stub super.onGeolocationPermissionsShowPrompt(origin, callback); callback.invoke(origin, true, false); } } 

    il mio android-manifest.xml:

     <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.visitchicagosouthland" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <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" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".site" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="4" /> </manifest> 

  • Standard di codifica Null
  • BitmapFactory.Options.inBitmap causa lacerazione quando si commuta spesso il bitmap di ImageView
  • One Solution collect form web for “Android WebView utilizzando GeolocationPermissions”

    È piuttosto semplice quando l'html è il tuo:

    Ci sono un paio di modi: ti darò due di loro:

    • modo semplice usando GET

    L'idea è quella di submit la posizione nell'URL (potrebbe essere necessaria una codifica, ma finché non sono i soli numbers e gli spazi in cui si va bene

    Alcune modifiche per il tuo shouldOverridUrlLoading

     public boolean shouldOverrideUrlLoading(WebView view, String url){ if (url.needs_geo) //meaning if this is the url that needs the geo location url += "?geo=" + your_location; view.loadUrl(url); return true; } 

    Nel tuo javascript

     function getParam(name) { name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regexS = "[\\?&]"+name+"=([^&#]*)"; var regex = new RegExp( regexS ); var results = regex.exec( window.location.href ); if( results == null ) return ""; else return results[1]; } 

    poi

     var geo_location = getParam('geo'); 

    • utilizzando WebView.addJavascriptInterface (non ha mai cercato di passare i valori da java a javascript ma probabilmente functionrà anche)

    L'idea è quella di fornire per il tuo javascript una class java a cui è ansible accedere per get i parametri che si desidera passare a javascript

    All'interno della tua class Attività:

     public String location; //as an example public class SherifJS { public String getLocation(){ return location; } } //bla bla SherifJS loc = new SherifJS(); yourWebView.addJavascriptInterface(loc, "locationProvider"); 

    All'interno del tuo javascript:

     <script type="text/javascript"> <!-- function sherifJS() { document.getElementById("locationHolder").innerHTML = window.locationProvider.getLocation(); } --> </script> 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.