2014-03-05 12 views
5

Ich benutze Geolokalisierung des Benutzers über Phonegap.The exapmle wird unten angezeigt. (ANDROID)Öffnen Android-Standorteinstellungen mit Phonegap

// onSuccess Callback 
    // This method accepts a Position object, which contains the 
    // current GPS coordinates 
    // 
    var onSuccess = function(position) { 
     var element = document.getElementById('geolocation'); 
     element.innerHTML = 'Latitude: '+ position.coords.latitude   +'<br/>' + 
       'Longitude: '   + position.coords.longitude  +<br/>' + 
       'Altitude: '    + position.coords.altitude   +'<br/>' + 
       'Accuracy: '    + position.coords.accuracy   +<br/>' + 
       'Altitude Accuracy: ' + position.coords.altitudeAccuracy +'<br/>' + 
       'Heading: '    + position.coords.heading   +<br/>' + 
       'timestamp: '   + position.timestamp    +<br/>'; 
    }; 

    // onError Callback receives a PositionError object 
    // 
    function onError(error) { 
     alert('code: ' + error.code + '\n' + 
       'message: ' + error.message + '\n'); 
    } 

    navigator.geolocation.getCurrentPosition(onSuccess, onError); 

Ist es möglich (mit phonegap) auf Fehlerfunktion Dialog zu öffnen, die uns zu Standorteinstellungen führen wird (wo Benutzer in der Lage sein werden, mir Zugang zu seinem Standort zu geben) statt wachsam, wie es ist in Google Maps Android-Anwendung gemacht (Screenshot unten)? like this

+0

haben Sie die ACCESS_FINE_LOCATION Erlaubnis in Manifest-Datei –

+0

ja natürlich hinzufügen, ich habe Zugang zu Standort des Benutzers, mein Problem ist offen Einstellungen Seite auf Fehler – David

+0

Verwenden Sie ein Plugin wie: https://github.com/romainperruchon/ gpssettings/blob/master/src/android/com/dataforpeople/plugins/GpsSettings.java. –

Antwort

0

Ich würde genau das tun, was Sie sagen, erstellen Sie den Dialog, und senden Sie sie an Einstellungen; Ich nehme an, Sie haben es geschafft, die onError fcn am apropos Zeit genannt zu bekommen, also dann

AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setTitle(getString(R.string.loc_man)); 
    builder.setMessage(getString(R.string.ask_for_gps)); 
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(i);  
      } 
     }); 
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       Toast.makeText(getBaseContext(), getString(R.string.gps_no), Toast.LENGTH_SHORT).show(); 
       finish(); 
      } 
     }); 
    builder.create().show(); 

, was Sie auch tun müssen, ist diese Funktion von Ihrem JavaScript-Aufruf ... Oh, das ist Spaß, b/c Sie werden viele ziemlich coole Java-Konzepte auf einmal verwenden und ich habe nur mit Cordova gearbeitet, aber das sollte alles gleich funktionieren =] Denken Sie daran, wenn Sie eine Variable undefiniert in meinem Code sehen, Sie sollte wahrscheinlich davon ausgehen, dass es ein Feld ist.

Also sagen wir, Sie sind sicher, dass dieser Code auf Fehler trifft, lassen Sie uns einen Schnittstellennamen machen; 'Android' ist eine ziemlich logische Eins

function onError(error) { 
    alert('code: ' + error.code + '\n' + 
      'message: ' + error.message + '\n'); 
    Android.TurnOnTuneIn(); 
} 

jetzt zurück in Ihre Java, grep um Ihre phonegap App zu finden, wo immer es hat 'WebView'; Wenn es etwas wie meine Cordova-Implementierungen ist, wird es irgendwo webview.loadUrl() enthalten. Öffnen Sie die Datei, die diese Klasse definiert. Hier bearbeiten/platzieren Sie das gesamte Java, an dem wir arbeiten, in dieser Frage. Nach etwas wie 'öffentliche Klasse PhoneGapActivity extends Activity', fügen Sie 'implements CordovaInterface' ein (ich glaube nicht PhoneGapInterface); Wenn Ihre IDE Ihnen einen Fehler mit der Option zum Implementieren abstrakter Methoden gibt, sollten Sie das packen.

Sicherstellen, dass die WebView ein feild in der Klasse ist, nicht eine Variable in einem Verfahren, dann

//CordovaWebView should work, but maybe it needs to be PhoneGapWebView, you're smart, you'll figure it out =] 
      webView = (CordovaWebView) findViewById(R.id.data_window); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setBuiltInZoomControls(false); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); //this always seemed like a good idea to me 
    webView.addJavascriptInterface(new JSInterface(this), "Android"); //see the interface name? =] 
//this line should already be in this class, just re-use it 
webView.loadUrl("file:///"+getContext().getFilesDir().toString()+"/index.html"); 

jetzt diese Schnittstelle machen:

public class JSInterface { 
    // these fcns are exposed to the WebView 
    private Context context; 
    public JSInterface(Context context) 
    { 
     context = context; 
    } 
    @JavascriptInterface 
    public void doEchoTest(String echo) 
    { 
//A useful test; I usually use it in a webViewClient that runs the function that calls this in my javascript with this: 
//webView.loadUrl("javascript:echo('"echo!!!"');"); //this exact formatting 
//but webViewClient is outside the scope of your question and would just confuse the 
//issue; however, you may need to implement 
//webViewClient with an delaying asynctask to seperatly run the js you loaded with the webpage, 
//again, I used to do this ground-up, and phoneGap Might Just Work. 

     Toast.makeText(context, echo, Toast.LENGTH_SHORT).show(); 
    } 
    @JavascriptInterface 
    public void TurnOnTuneIn 
    { 
     aMethodThatHasThatFirstBitOfCodeIPublished(); 
    } 
} 

I-Schnittstellen lieben =]

Der Rest ist ziemlich Standard für Ihre Zwecke (aber Spaß zu spielen mit trotzdem!) Und Sie brauchen nicht viel wenn überhaupt. Wenn Sie bemerken, dass die Methode, die ich oben platziert habe, nicht so zurückkehrt, wie Sie es wollen, können Sie die startActivityForResult-Methode verwenden, um das Gleiche zu tun, und ich wette, es wird gut funktionieren; Beachten Sie das "Super". Rufen Sie an, dass das Override macht; Sie brauchen nur die Absicht (wie ich Ihnen oben gezeigt habe) und eine Referenznummer, um das Ergebnis zu erhalten ... wieder, außerhalb des Bereichs der Frage. Außerdem habe ich Unterstützung für den ResultCallback b/c eingebaut, mit dem ich gearbeitet habe, aber ich benutze es nicht selbst.

@Override 
public Activity getActivity(){ 
    return this; 
} 

@Override 
public void setActivityResultCallback(CordovaPlugin plugin) { 
    this.activityResultCallback = plugin; 
} 

public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) { 
    this.activityResultCallback = command; 
    this.activityResultKeepRunning = this.keepRunning; 

// If multitasking turned on, then disable it for activities that return results 
    if (command != null) { 
     this.keepRunning = false; 
    } 

// Start activity 
    super.startActivityForResult(intent, requestCode); 
} 

@Override 
public void cancelLoadUrl(){ 
// no op 
} 

@Override 
public Object onMessage(String id, Object data) { 
     LOG.d("is", "onMessage(" + id + "," + data + ")"); 
     if ("exit".equals(id)) { 
      super.finish(); 
     } 
     return null; 
} 
@Override 
public void onPause() { 
    Method pause = null; // Pauses the webview. 
    try { 
     pause = WebView.class.getMethod("onPause"); 
    } 
    catch (SecurityException e) { } 
    catch (NoSuchMethodException e) { } 
    if (pause != null) { 
     try { pause.invoke(webView); 
     } 
     catch (InvocationTargetException e) { } 
     catch (IllegalAccessException e) { } 
    } 
    else { 
    // No such method. Stores the current URL. 
     suspendUrl = webView.getUrl(); // And loads a URL without any processing. 
     webView.loadUrl("file:///android_asset/nothing.html"); 
    } 
    super.onPause(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    Method resume = null; // Resumes the webview. 
    try { 
     resume = WebView.class.getMethod("onResume"); 
    } 
    catch (SecurityException e) { } 
    catch (NoSuchMethodException e) { } 
    if (resume != null) { 
     try { 
      resume.invoke(webView); 
     } 
     catch (InvocationTargetException e) { } 
     catch (IllegalAccessException e) { } 
    } 
    else if (webView != null) { // No such method. Restores the suspended URL. 
     if (suspendUrl == null) { 
      //this should be wherever you have your page; you can probably copy it from what is there now. 
webView.loadUrl("file:///"+getContext().getFilesDir().toString()+"/index.html"); 
     } 
     else { 
      webView.loadUrl(suspendUrl); 
     } 
    } 
} 

Hoffnung, die Sie weiter bringt; Wenn Sie es nicht bereits verwenden, denken Sie daran, die Versionskontrolle zu verwenden, damit Sie mit Ihren Änderungen unbesonnen handeln können!

gl hf

+0

Ich kenne Java überhaupt nicht, also sind dies meine ersten Schritte nur auf Phonegap und ich weiß nicht, was ich mit dem Code tun soll, den du mir gibst, kannst du das in Details erklären – David

+0

kk, siehe edit =] –