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
haben Sie die ACCESS_FINE_LOCATION Erlaubnis in Manifest-Datei –
ja natürlich hinzufügen, ich habe Zugang zu Standort des Benutzers, mein Problem ist offen Einstellungen Seite auf Fehler – David
Verwenden Sie ein Plugin wie: https://github.com/romainperruchon/ gpssettings/blob/master/src/android/com/dataforpeople/plugins/GpsSettings.java. –