2011-08-03 148 views
3

我看了就放在這裏這一問題的各種問題,如:的Android使用的WebView GeolocationPermissions

但我還是一個有點困惑,我知道我應該從抽象類WebChromeClient創建我自己的類。哪個位置可以獲取,但這個對象究竟是如何發送地理定位/他們如何進行通信的呢?

這裏是我的代碼:(?是這樣的,至少在正確的軌道)

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); 
} 

} 

我的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> 
+0

好的你想做什麼? –

+0

發送地理位置到我的網絡視圖的Javascript中,所以我用它在webView中顯示路線 – rajh2504

+0

是你寫的HTML代碼嗎?你可以編輯它嗎? –

回答

3

這是相當簡單的,當HTML是你的自己:

有一對夫婦的方式:我給你2其中:

  • 使用簡單的方法GET

想法是在URL發送位置(你可能需要一些編碼,但只要其唯一的數字和沒有空格則沒

某些編輯爲您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; 
} 

在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]; 
} 

然後使用WebView.addJavascriptInterface

var geo_location = getParam('geo'); 

  • (從來沒有試圖從Java值傳遞給JavaScript,但可能工作以及)

想法是提供您的JavaScript可以訪問得到你想要傳遞給JavaScript

內,您的Activity類的參數的java類:

public String location; //as an example 

    public class SherifJS { 
     public String getLocation(){ 
      return location; 
     } 
    } 
//bla bla 

    SherifJS loc = new SherifJS(); 
    yourWebView.addJavascriptInterface(loc, "locationProvider"); 

裏面你的JavaScript:

<script type="text/javascript"> 
     <!-- 

function sherifJS() { 
    document.getElementById("locationHolder").innerHTML = 
    window.locationProvider.getLocation(); 
} 

     --> 
</script> 
+0

哇,比我想象的要簡單1000倍。謝謝謝里夫! – rajh2504