Próbuję uruchomić usługę w tle, która wysyła sms-y o lokalizacji telefonu. W serwisie korzystam z Timera. Kod, który wysyła wiadomości działa poprawnie, ale kiedy próbuję wstawić kod, aby znaleźć lokalizację użytkownika, zawsze napotykam błędy.
Próbowałem wywołać nowy wątek i użyłem loopera, ale teraz otrzymuję wyjątek nullpointer, który wskazuje na te dwie linie kodu:
sendSmsMessage();
I w ramach tej metody:
if (coordinates.equals(null) || coordinates.equals("") || coordinates == null || coordinates == ""){
coordinates = "Could Not Receive Location";
}
Więc pytanie, które zadaję, brzmi: dlaczego występuje ten błąd? Jeśli mógłbyś mi pomóc, byłoby to bardzo mile widziane. A jeśli po prostu przeoczam coś bardzo prostego, zwróć na to uwagę. Dziękuję!
Oto kod:
public class MessageService extends Service{
int counter = 0;
private Timer timer = new Timer();
public String textTime, phoneNumber;
public int updateInterval;
int lat, lng;
String coordinates, latitude, longitude;
LocationManager locationManager;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
//receives the intent extras from the calling intent
textTime = intent.getStringExtra("textTime");
phoneNumber = intent.getStringExtra("phone");
phoneNumber = "5556";
//the following if statement has to do with transferring the string textTime into a number that can be used
if (textTime.equals("15 Minutes")) {
updateInterval = (15 * (60000));
}else if (textTime.equals("30 Minutes")) {
updateInterval = (30 * (60000));
}else if (textTime.equals("1 Hour")){
updateInterval = (60 * (60000));
}else {
updateInterval = (15 * (60000));
}
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
new Thread(){
public void run(){
Looper.prepare();
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
//makeUseOfNewLocation(location);
lat = (int) (location.getLatitude() * 1E6);
lng = (int) (location.getLongitude() * 1E6);
latitude = Integer.toString(lat);
longitude = Integer.toString(lng);
coordinates = "Coordinates: " + latitude + ", " + longitude + ". Latitude: " + latitude + " Longitude: " + longitude + ". Respond 'END' to stop texts.";
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
Looper.loop();
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}else{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}
}
}.start();
//the following method should use a timer to send a sms message in a timed interval. It also should implement using a different thread
doSomethingRepeatedly();
return START_STICKY;
}
public void doSomethingRepeatedly(){
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
//the following code should be what is done repeatedly
//Log.d("MessageService", String.valueOf(++counter));
sendSmsMessage();
}
}, 0, updateInterval);
}
//the following code handles sending the text message
public void sendSmsMessage(){
SmsManager sms = SmsManager.getDefault();
if (coordinates.equals(null) || coordinates.equals("") || coordinates == null || coordinates == ""){
coordinates = "Could Not Receive Location";
}
sms.sendTextMessage(phoneNumber, null, "test" , null, null);
}
public void onDestroy() {
super.onDestroy();
if (timer != null) {
timer.cancel();
}
}
}//end of service
A oto wynik logcata:
10-19 20:23:28.096: E/AndroidRuntime(944): FATAL EXCEPTION: Timer-0
10-19 20:23:28.096: E/AndroidRuntime(944): java.lang.NullPointerException
10-19 20:23:28.096: E/AndroidRuntime(944): at com.app.MessageService.sendSmsMessage(MessageService.java:113)
10-19 20:23:28.096: E/AndroidRuntime(944): at com.app.MessageService$2.run(MessageService.java:105)
10-19 20:23:28.096: E/AndroidRuntime(944): at java.util.Timer$TimerImpl.run(Timer.java:284)
2 odpowiedzi
Musisz wymienić
coordinates.equals(null)
Z
coordinates == null
Ponieważ pierwszy nigdy nie będzie oceniał true
, wyrzuci NullPointerException()
za każdym razem, gdy coordinates
będzie null
.
Jeśli coordinates
ma wartość null, pierwszy warunek oordinates.equals(null)
spowoduje NullPointerException
.
Dodatkowo mam jeszcze jedną obserwację. Porównanie coordinates == ""
jest bezużyteczne, ponieważ używasz go już we właściwy sposób, tj. Współrzędne.equals("").
Zmień if
z
if (coordinates.equals(null) || coordinates.equals("") ||
coordinates == null || coordinates == ""){
coordinates = "Could Not Receive Location";
}
Do
if (coordinates == null || coordinates.equals("")){
coordinates = "Could Not Receive Location";
}
Podobne pytania
Powiązane pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].