Fehler invoke-virtual-Methode " doppelter android.Lage.Lage.getLatitude()' auf ein null-Objekt Verweis
Alles was ich versuche zu tun ist, damit der Benutzer erhalten Sie eine Liste der Orte, der Arten, die er mag. Zum Beispiel, wenn der Eingang " Krankenhaus meine Anwendung öffnen Sie google maps mit dem Suchbegriff "Krankenhaus". Aber wie vorgeschlagen in der Dokumentation über die geocode-wie geo:0,0?q=hospital
uri zeigt alle Krankenhäuser in der Nähe von den Koordinaten 0 latitude & 0 Längengrad. Also, wenn ich habe versucht, um das Benutzer-Koordinaten zunächst durch den folgenden code.
Orte Decoder.java
package com.kkze.Mappy;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
public class PlacesDecoder extends Activity {
Intent intentThatCalled;
public double latitude;
public double longitude;
public LocationManager locationManager;
public Criteria criteria;
public String bestProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
intentThatCalled = getIntent();
String voice2text = intentThatCalled.getStringExtra("v2txt");
getLocation(voice2text);
}
public static boolean isLocationEnabled(Context context)
{
int locationMode = 0;
String locationProviders;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
try
{
locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
return locationMode != Settings.Secure.LOCATION_MODE_OFF;
}
else
{
locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
return !TextUtils.isEmpty(locationProviders);
}
}
public void getLocation(String voice2txt) {
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
criteria = new Criteria();
bestProvider = String.valueOf(locationManager.getBestProvider(criteria, true)).toString();
Location location = locationManager.getLastKnownLocation(bestProvider);
if (isLocationEnabled(PlacesDecoder.this)) {
Log.e("TAG", "GPS is on");
latitude = location.getLatitude();
longitude = location.getLongitude();
Toast.makeText(PlacesDecoder.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show();
searchNearestPlace(voice2txt);
}
else
{
AlertDialog.Builder notifyLocationServices = new AlertDialog.Builder(PlacesDecoder.this);
notifyLocationServices.setTitle("Switch on Location Services");
notifyLocationServices.setMessage("Location Services must be turned on to complete this action. Also please take note that if on a very weak network connection, such as 'E' Mobile Data or 'Very weak Wifi-Connections' it may take even 15 mins to load. If on a very weak network connection as stated above, location returned to application may be null or nothing and cause the application to crash.");
notifyLocationServices.setPositiveButton("Ok, Open Settings", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent openLocationSettings = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
PlacesDecoder.this.startActivity(openLocationSettings);
finish();
}
});
notifyLocationServices.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
notifyLocationServices.show();
}
}
public void searchNearestPlace(String v2txt) {
Log.e("TAG", "Started");
v2txt = v2txt.toLowerCase();
String[] placesS = {"accounting", "airport", "aquarium", "atm", "attraction", "bakery", "bakeries", "bank", "bar", "cafe", "campground", "casino", "cemetery", "cemeteries", "church", "courthouse", "dentist", "doctor", "electrician", "embassy", "embassies", "establishment", "finance", "florist", "food", "grocery", "groceries", "supermarket", "gym", "health", "hospital", "laundry", "laundries", "lawyer", "library", "libraries", "locksmith", "lodging", "mosque", "museum", "painter", "park", "parking", "pharmacy", "pharmacies", "physiotherapist", "plumber", "police", "restaurant", "school", "spa", "stadium", "storage", "store", "synagog", "synagogue", "university", "universities", "zoo"};
String[] placesM = {"amusement park", "animal care", "animal care", "animal hospital", "art gallery", "art galleries", "beauty salon", "bicycle store", "book store", "bowling alley", "bus station", "car dealer", "car rental", "car repair", "car wash", "city hall", "clothing store", "convenience store", "department store", "electronics store", "electronic store", "fire station", "funeral home", "furniture store", "gas station", "general contractor", "hair care", "hardware store", "hindu temple", "home good store", "homes good store", "home goods store", "homes goods store", "insurance agency", "insurance agencies", "jewelry store", "liquor store", "local government office", "meal delivery", "meal deliveries", "meal takeaway", "movie rental", "movie theater", "moving company", "moving companies", "night club", "pet store", "place of worship", "places of worship", "post office", "real estate agency", "real estate agencies", "roofing contractor", "rv park", "shoe store", "shopping mall", "subway station", "taxi stand", "train station", "travel agency", "travel agencies", "veterinary care"};
int index;
for (int i = 0; i <= placesM.length - 1; i++) {
Log.e("TAG", "forM");
if (v2txt.contains(placesM[i])) {
Log.e("TAG", "sensedM?!");
index = i;
Uri gmmIntentUri = Uri.parse("geo:" + latitude + "," + longitude + "?q=" + placesM[index]);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
finish();
}
}
for (int i = 0; i <= placesS.length - 1; i++) {
Log.e("TAG", "forS");
if (v2txt.contains(placesS[i])) {
Log.e("TAG", "sensedS?!");
index = i;
Uri gmmIntentUri = Uri.parse("geo:" + latitude + "," + longitude + "?q=" + placesS[index]);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
finish();
}
}
}
}
Das problem ist, dass immer und immer der Lage den Wert null zurück. Und ich weiß, für eine Tatsache, dass eine andere Anwendung Jarvis leicht hat die Aufgabe, so lange als Standort aktiviert ist, wenn nicht einfach fordert den Benutzer auf. Aber unter den gleichen Bedingungen meine Anwendung immer abstürzt.
Was ich getan habe:
- Verbrachte Tag und Nacht versucht, dieses problem zu lösen.
- Durchsucht zahlreiche Seiten über das Thema.
- Versucht, verschiedene codes, die von meiner eigenen.
Und es passiert immer noch. Ich bin ein Anfänger in Android.
Und bitte, bitte helfen Sie mir. Gibt es keine Möglichkeit mein problem zu lösen? dachte sogar, dass andere Anwendung, die es irgendwie schafft, es zu tun.
Diesem mein LogCat.
Process: com.kkze.Mappy, PID: 6742
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kkze.Mappy/com.kkze.Mappy.PlacesDecoder}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2658)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)
at android.app.ActivityThread.access$900(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
at com.kkze.Mappy.PlacesDecoder.getLocation(PlacesDecoder.java:62)
at com.kkze.Mappy.PlacesDecoder.onCreate(PlacesDecoder.java:32)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2611)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)
at android.app.ActivityThread.access$900(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Auch die überprüfung für die location!=null erfordert ACCESS_FINE_LOCATION Berechtigung, die vermasselt mir die app verursacht immer wieder als null.
- So
getLastKnownLocation
wird null zurückgeben, die es dokumentiert, geschehen kann: "Wenn der provider ist derzeit deaktiviert ist, wird null zurückgegeben." Sollte Ihr code überprüfen und behandeln es entsprechend. Sie sagen, "unter denselben Bedingungen" sind solche Bedingungen, die Lage ist derzeit deaktiviert? Denn wenn dem so ist, gibt es nichts anderes zu erklären, wirklich. - Wie soll ich das machen? Unter den gleichen Bedingungen der anderen app funktioniert. Oder könnte es ein Weg sein, um mein problem zu lösen, ohne dabei die Position des Benutzers. Bitte helfen.
- Ich bin sorry, wenn ich Druck Sie oder etwas, aber ich bin wirklich frustriert, dass ich nicht selbst lösen, etwas das einfach auch nach scheuern im Web für die besten, die ich kann. Sorry. Es ist schon über Mitternacht hier und ich kann immer noch nicht aufhören, dieses Problem auftreten.
- Skeet Keine Stelle eingeschaltet. Meine app stürzt ab. Gelingt es. Wenn die Lage ist aus unseren beiden apps leiten den Benutzer auf die Seite "Einstellungen" einschalten.
- Rechts, so dass die API verhält sich genau wie beschrieben. Sie sollten prüfen, ob
location
istnull
vor dem aufrufen von Methoden auf:if (location == null) { /* take appropriate action */ } else { /* use location */ }
- Bitte finden Sie unter meinem oben Bearbeiten. Gibt es eine Möglichkeit, dies zu tun, ohne immer den Benutzer lastKnownLocation.
- Die überprüfung einer Referenz benötigt keine Besondere Genehmigung. Die Suche nach einer feinkörnigen Lage könnte, aber das ist nicht das gleiche. Und ich weiß nicht was du meinst mit "Mach das"... man sollte sich Mühe in die Herstellung Ihrer Frage klar. (Ich würde vorschlagen, entfernen Sie alle Bezug zu einer NullPointerException - wir wissen, was nichtig und warum, also die Ausnahme ist, ziemlich unerheblich.)
- Es tut mir Leid Alles was ich versuche zu tun ist, damit der Benutzer erhalten Sie eine Liste der Orte, der Arten, die er mag. Zum Beispiel, wenn der Eingang " Krankenhaus meine Anwendung öffnen Sie google maps mit dem Suchbegriff "Krankenhaus". Aber wie vorgeschlagen in der Dokumentation über die geocode-wie geo:0,0?q=Krankenhaus uri zeigt alle Krankenhäuser in der Nähe von den Koordinaten 0 latitude & 0 Längengrad.
- Ich vermute, dass die andere Anwendung sollte auch immer ein null-Zeiger-Ausnahme aus, wenn Sie versuchen, um den Nutzer Ort. So gibt es einen anderen Weg? Es wurde dokumentiert in der Google maps api, Google maps, suchen die Nähe, wenn Sie Breite 0 und Längengrad 0, aber das funktioniert nicht
- Nein, ich vermute, dass die andere Anwendung ist zu prüfen, ob er den Empfang eines null-Lage in eine normale Art und Weise.
- Skeet 08-30 01:54:42.735 11831 11831 E SELinux [DEBUG] get_category: variable seinfo: Standard-Empfindlichkeit: NULL, cateogry: NULL 08-30 01:54:43.335 11831 11831 E AndroidRuntime FATAL EXCEPTION: main 08-30 01:54:43.335 11831 11831 E AndroidRuntime-Prozess: com.MeineFirma.myapp4, PID: 11831 08-30 01:54:43.335 11831 11831 E AndroidRuntime java.lang.RuntimeException: Unable to start activity ComponentInfo{com.MeineFirma.myapp4/com.MeineFirma.myapp4.MainActivity}:
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Jon Skeet erwähnt in den Kommentaren, die
getLastKnownLocation()
Methode kann und wird null zurückgegeben. Das Hauptproblem ist, dass es nicht prompt eine Anfrage an das OS für einen neuen Ort sperren, sondern es prüft nur, wenn es eine der letzten bekannten Position von einigen anderen Apps die Standort-Anfrage. Wenn keine andere app hatte vor kurzem ein Standort anfordern, dann bekommen Sie eine null-Lage zurück.Nur so kann gewährleistet werden, dass Sie wirklich bekommen, eine location zu verlangen, und dies erfolgt mit einem Aufruf zu
requestLocationUpdates()
.Den Ort ging in die
onLocationChanged()
callback-Methode wird nicht null sein, da der Rückruf erfolgt nur auf eine erfolgreiche Position lock.Nur der Hinweis, die ganze Zeit Ihre app ist registriert für Standort-updates, es wird verursacht zusätzliche Batterie, so sicher sein, zu un-register für Standort-updates so bald wie möglich. Hier sieht es aus wie Sie können un-melde mich, sobald die erste Lage kommt in.
Auch, möchten Sie vielleicht zu prüfen, zeigt ein Dialogfeld mit dem Fortschritt in diese Aktivität, während es darauf wartet, dass eine Position lock, damit der Benutzer ein feedback, dass die app wartet auf etwas.
Hier ist die Allgemeine Struktur dessen, was Ihr code sollte wie folgt Aussehen:
Progress Dialog
und seine arbeiten nun perfekt. Wieder einmal, vielen Dank Daniel.location
mitnull
, das ist, was dieser code macht...location!=null
. Daniel Nugent sagte, es sei nicht wirklich erforderlich. Und es funktioniert wie ein Charme. Es ist, weil ich nur noch einschalten Ort-Service und sofort Fragen für die Stelle, an der es abstürzt. Es erfordert Zeit, um es zu suchen. Vor allem auf die schwachen verbindungen. Daniel Nugent, der die Lösung immer warten für den Standort gesetzt werden und dann der job nicht. Macht es, wie ich hoffe, völlig Fehler-Beweis. Auch seine Idee, ein warten-Bildschirm,d.h., meine Fortschrittsanzeige, die Art der füllt die Wartezeit, so dass es ein bisschen glatt. Trotzdem Jungs vielen Dank für Eure Bemühungen, ich Schätze es wirklich.if (location!=null)
. Im Grunde, verwenden Sie entweder die Lage sofort, wenn es nicht null ist, anderenfalls wird die Anfrage einer location.Ändern Sie diese in Ihrem
getLocation
MethodeSie schrieb codes, erhalten Sie Ihre aktuelle Position (latlng) und dieser Fehler ist aufgrund deiner gps(Standort), auf Ihre eigentliche android-Gerät ist nicht eingeschaltet.
Ich drehte ihn auf und es funktioniert für mich. hoffe, nützlich zu sein
Null-Zeiger-Ausnahme tritt auf, weil Ihre app nicht Anfrage für den aktuellen Standort, sondern es ist vielmehr nutzt es die Letzte Fundstelle und prüft nur Sie haben sich Ihre Position auf und führen Sie jede andere app, die verwendet Ihren aktuellen Standort. Nach, die gerade versuchen, führen Sie das Projekt erneut. Hoffe, dies löst dein problem.
hier ist ein weiterer Weg, dies zu tun, eine, die Ihre Sicherung Standort-Konzept, das ich verwendet habe und diese erfolgreich war, um mir
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
ist Erklärung verschmolzen Lage