NullPointerException异常而获取当前的GPS [英] NullPointerException while fetching current GPS

查看:216
本文介绍了NullPointerException异常而获取当前的GPS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个测试屏幕,有一个按钮 - 它是pressed它调用服务。我试图实现一种方式来获得当前用户的当前GPS位置,当它试图调用它崩溃。谁能告诉是什么问题?

 包com.example.whereyouapp;进口java.util.Arrays中;进口android.app.AlarmManager;
进口android.app.PendingIntent;
进口android.app.Service;
进口android.content.ContentValues​​;
进口android.content.Context;
进口android.content.Intent;
进口android.location.Location;
进口android.location.LocationListener;
进口android.location.LocationManager;
进口android.net.Uri;
进口android.os.Bundle;
进口android.os.IBinder;
进口android.telephony.SmsManager;
进口android.widget.Toast;公共类控制器扩展服务{私有静态最终诠释POLL_INTERVAL = 1000 * 3;静态NUMBER_OF_TIMES INT = 0;地点位置;
//获取对系统的位置管理的参考
的LocationManager的LocationManager =(的LocationManager)this.getSystemService(Context.LOCATION_SERVICE);//定义,响应位置更新的监听器
LocationListener的LocationListener的=新LocationListener的(){
    公共无效onLocationChanged(地点){
      //当一个新的位置由网络位置提供商发现调用。
      makeUseOfNewLocation(位置);
    }    公共无效onStatusChanged(字符串提供商,INT地位,捆绑演员){}    公共无效onProviderEnabled(字符串提供商){}    公共无效onProviderDisabled(字符串提供商){}
  };公共无效makeUseOfNewLocation(地点){
    this.location =位置;
}公共静态双coordinatesDistance(双LAT1,双lon1,双LAT2,双lon2)二coordiantes之间公里{//返回距离
    双deltaLat = Math.toRadians(LAT2-LAT1);
    双deltaLong = Math.toRadians(lon2 - lon1);
    LAT1 = Math.toRadians(LAT1);
    LAT2 = Math.toRadians(LAT2);
    双一= Math.sin(deltaLat / 2)* Math.sin(deltaLat / 2)+ Math.sin(deltaLong / 2)* Math.sin(deltaLong / 2)* Math.cos(LAT1)* Math.cos( LAT2);
    双C = 2 * Math.asin(的Math.sqrt(一));
    返回6371 * C;
}公众诠释onStartCommand(意向意图,诠释标志诠释startId){
    Toast.makeText(这一点,yololo-服务类作品,Toast.LENGTH_SHORT).show();
    // sendSMS(5613500110,如果你收到此短信则WhereYouApp服务类的工作);            //注册监听器与位置管理器来接收位置更新
                 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1,0,LocationListener的);            如果(位置!= NULL){
            双distance=coordinatesDistance(location.getLatitude(),location.getLatitude(),location.getLatitude()+2,location.getLatitude()+2);            Toast.makeText(这一点,+距离,Toast.LENGTH_SHORT).show();
            }    如果(== NUM​​BER_OF_TIMES 5){
        setServiceAlarm(getBaseContext(),FALSE);
        NUMBER_OF_TIMES = -1;
    }
    ++ NUMBER_OF_TIMES;
    返回START_STICKY;
}公共无效的onDestroy(){
    super.onDestroy();
    Toast.makeText(这一点,yolo-服务已停止工作,Toast.LENGTH_LONG).show();
}公共无效sendSMS(字符串phoneNumber的,字符串消息){
    SmsManager短信= SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber的,空的消息,NULL,NULL);
    ContentValues​​值=新ContentValues​​();
    values​​.put(地址,phoneNumber的);
    values​​.put(身体,消息);
    。getContentResolver()插入(Uri.parse(内容://短信/派),价值);
}公共静态无效setServiceAlarm(上下文的背景下,布尔ISON){        意图I =新意图(背景下,Controller.class);
        的PendingIntent圆周率= PendingIntent.getService(上下文,0,I,0);
        AlarmManager alarmManager =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        如果(ISON){
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis的(),POLL_INTERVAL,PI);
        }其他{
            alarmManager.cancel(PI);
            pi.cancel();
        }
}@覆盖
公众的IBinder onBind(意向意图){
    // TODO自动生成方法存根
    返回null;
}
 }

此类将被用于测试控制器的功能,它将由一个屏幕的与做各种功能的按钮

 包com.example.whereyouapp;进口android.net.Uri;
进口android.os.Bundle;
进口android.app.Activity;
进口android.telephony.SmsManager;
进口android.view.Menu;
进口android.view.View.OnClickListener;
进口android.widget.TextView;
进口android.content.ContentValues​​;
进口android.content.Intent;
进口android.graphics.PorterDuff;
进口android.view.View;
进口android.widget.Button;公共类ControllerTestingScreen延伸活动{
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_controller_test_screen);
    //设置按钮颜色以红,绿,蓝,红三色,分别
    Button按钮=(按钮)findViewById(R.id.testbutton);
    button.getBackground()setColorFilter(0xFFFF0000地址,PorterDuff.Mode.MULTIPLY)。
    OnClickListener buttonListener =新View.OnClickListener(){
        公共无效的onClick(查看为arg0){            Controller.setServiceAlarm(getBaseContext(),TRUE);
        }
    };
    button.setOnClickListener(buttonListener);
}
}

logcat的:

  02-26 22:04:38.317:D / AndroidRuntime(1427):关闭VM
02-26 22:04:38.317:W / dalvikvm(1427):主题ID = 1:螺纹未捕获的异常(组= 0xb1a91ba8)退出
02-26 22:04:38.457:D / dalvikvm(1427):GC_FOR_ALLOC释放115K,6%免费3270K / 3460K,暂停87ms,总103ms
02-26 22:04:38.497:E / AndroidRuntime(1427):致命异常:主要
02-26 22:04:38.497:E / AndroidRuntime(1427):工艺:com.example.whereyouapp,PID:1427
02-26 22:04:38.497:E / AndroidRuntime(1427):了java.lang.RuntimeException:无法实例化服务com.example.whereyouapp.Controller:显示java.lang.NullPointerException
02-26 22:04:38.497:E / AndroidRuntime(1427):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2556)
02-26 22:04:38.497:E / AndroidRuntime(1427):在android.app.ActivityThread.access $ 1800(ActivityThread.java:135)
02-26 22:04:38.497:E / AndroidRuntime(1427):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1278)
02-26 22:04:38.497:E / AndroidRuntime(1427):在android.os.Handler.dispatchMessage(Handler.java:102)
02-26 22:04:38.497:E / AndroidRuntime(1427):在android.os.Looper.loop(Looper.java:136)
02-26 22:04:38.497:E / AndroidRuntime(1427):在android.app.ActivityThread.main(ActivityThread.java:5017)
02-26 22:04:38.497:E / AndroidRuntime(1427):在java.lang.reflect.Method.invokeNative(本机方法)
02-26 22:04:38.497:E / AndroidRuntime(1427):在java.lang.reflect.Method.invoke(Method.java:515)
02-26 22:04:38.497:E / AndroidRuntime(1427):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
02-26 22:04:38.497:E / AndroidRuntime(1427):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-26 22:04:38.497:E / AndroidRuntime(1427):在dalvik.system.NativeStart.main(本机方法)
02-26 22:04:38.497:E / AndroidRuntime(1427):因:显示java.lang.NullPointerException
02-26 22:04:38.497:E / AndroidRuntime(1427):在android.content.ContextWrapper.getSystemService(ContextWrapper.java:540)
02-26 22:04:38.497:E / AndroidRuntime(1427):在com.example.whereyouapp.Controller<&初始化GT;(Controller.java:30)
02-26 22:04:38.497:E / AndroidRuntime(1427):在java.lang.Class.newInstanceImpl(本机方法)
02-26 22:04:38.497:E / AndroidRuntime(1427):在java.lang.Class.newInstance(Class.java:1208)
02-26 22:04:38.497:E / AndroidRuntime(1427):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2553)
02-26 22:04:38.497:E / AndroidRuntime(1427):10 ...更多
02-26 22:04:45.187:I /流程(1427):发送信号。 PID:1427 SIG:9
02-26 22:04:47.507:D / AndroidRuntime(1469):关闭VM
02-26 22:04:47.507:W / dalvikvm(1469):主题ID = 1:螺纹未捕获的异常(组= 0xb1a91ba8)退出
02-26 22:04:47.517:E / AndroidRuntime(1469):致命异常:主要
02-26 22:04:47.517:E / AndroidRuntime(1469):工艺:com.example.whereyouapp,PID:1469
02-26 22:04:47.517:E / AndroidRuntime(1469):了java.lang.RuntimeException:无法实例化服务com.example.whereyouapp.Controller:显示java.lang.NullPointerException
02-26 22:04:47.517:E / AndroidRuntime(1469):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2556)
02-26 22:04:47.517:E / AndroidRuntime(1469):在android.app.ActivityThread.access $ 1800(ActivityThread.java:135)
02-26 22:04:47.517:E / AndroidRuntime(1469):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1278)
02-26 22:04:47.517:E / AndroidRuntime(1469):在android.os.Handler.dispatchMessage(Handler.java:102)
02-26 22:04:47.517:E / AndroidRuntime(1469):在android.os.Looper.loop(Looper.java:136)
02-26 22:04:47.517:E / AndroidRuntime(1469):在android.app.ActivityThread.main(ActivityThread.java:5017)
02-26 22:04:47.517:E / AndroidRuntime(1469):在java.lang.reflect.Method.invokeNative(本机方法)
02-26 22:04:47.517:E / AndroidRuntime(1469):在java.lang.reflect.Method.invoke(Method.java:515)
02-26 22:04:47.517:E / AndroidRuntime(1469):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
02-26 22:04:47.517:E / AndroidRuntime(1469):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-26 22:04:47.517:E / AndroidRuntime(1469):在dalvik.system.NativeStart.main(本机方法)
02-26 22:04:47.517:E / AndroidRuntime(1469):因:显示java.lang.NullPointerException
02-26 22:04:47.517:E / AndroidRuntime(1469):在android.content.ContextWrapper.getSystemService(ContextWrapper.java:540)
02-26 22:04:47.517:E / AndroidRuntime(1469):在com.example.whereyouapp.Controller<&初始化GT;(Controller.java:30)
02-26 22:04:47.517:E / AndroidRuntime(1469):在java.lang.Class.newInstanceImpl(本机方法)
02-26 22:04:47.517:E / AndroidRuntime(1469):在java.lang.Class.newInstance(Class.java:1208)
02-26 22:04:47.517:E / AndroidRuntime(1469):在android.app.ActivityThread.handleCreateService(ActivityThread.java:2553)
02-26 22:04:47.517:E / AndroidRuntime(1469):10 ...更多


解决方案

我没有在你的code一些变化,终于得到了一个工作code。

 公共类控制器扩展服务
{
    私有静态最终诠释POLL_INTERVAL = 1000 * 3;
    静态NUMBER_OF_TIMES INT = 0;    位置currentLocation;
    静态的LocationManager的LocationManager;
    //定义,响应位置更新的监听器    LocationListener的locationListenerGps =新LocationListener的()
    {
        公共无效onLocationChanged(地点)
        {
            currentLocation =位置;
        }
        公共无效onProviderDisabled(字符串提供商){}
        公共无效onProviderEnabled(字符串提供商){}
        公共无效onStatusChanged(字符串提供商,INT地位,捆绑演员){}
    };
    公共静态双coordinatesDistance(双LAT1,双lon1,双LAT2,双lon2)
    {
        2 coordiantes之间公里//返回距离
        双deltaLat = Math.toRadians(LAT2-LAT1);
        双deltaLong = Math.toRadians(lon2 - lon1);
        LAT1 = Math.toRadians(LAT1);
        LAT2 = Math.toRadians(LAT2);
        双一= Math.sin(deltaLat / 2)* Math.sin(deltaLat / 2)+ Math.sin(deltaLong / 2)* Math.sin(deltaLong / 2)* Math.cos(LAT1)* Math.cos( LAT2);
        双C = 2 * Math.asin(的Math.sqrt(一));
        返回6371 * C;
    }    公众诠释onStartCommand(意向意图,诠释旗帜,INT startId)
    {
        Toast.makeText(这一点,yololo-服务类作品,Toast.LENGTH_SHORT).show();
        // sendSMS(5613500110,如果你收到此短信则WhereYouApp服务类的工作);        如果(的LocationManager!= NULL)
        {
            的System.out.println(不为空);
            //注册监听器与位置管理器来接收位置更新
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0,0,locationListenerGps);
        }        如果(currentLocation!= NULL)
        {
            双distance=coordinatesDistance(currentLocation.getLatitude(),currentLocation.getLatitude(),currentLocation.getLatitude()+2,currentLocation.getLatitude()+2);
            Toast.makeText(这一点,+距离,Toast.LENGTH_SHORT).show();
        }
        其他
        {
            的System.out.println(找不到位置);
        }        如果(== NUM​​BER_OF_TIMES 5)
        {
            setServiceAlarm(getBaseContext(),FALSE);
            NUMBER_OF_TIMES = -1;
        }
        ++ NUMBER_OF_TIMES;
        返回START_NOT_STICKY;
    }    公共无效的onDestroy()
    {
        super.onDestroy();
        Toast.makeText(这一点,yolo-服务已停止工作,Toast.LENGTH_LONG).show();
    }    公共无效sendSMS(字符串phoneNumber的,字符串消息)
    {
        SmsManager短信= SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber的,空的消息,NULL,NULL);
        ContentValues​​值=新ContentValues​​();
        values​​.put(地址,phoneNumber的);
        values​​.put(身体,消息);
        。getContentResolver()插入(Uri.parse(内容://短信/派),价值);
    }    公共静态无效setServiceAlarm(上下文的背景下,布尔ISON)
    {
        //获取对系统的位置管理的参考
        的LocationManager =(的LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        意图I =新意图(背景下,Controller.class);
        的PendingIntent圆周率= PendingIntent.getService(上下文,0,I,0);
        AlarmManager alarmManager =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        如果(ISON)
        {
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis的(),POLL_INTERVAL,PI);
        }
        其他
        {
            alarmManager.cancel(PI);
            pi.cancel();
        }
    }    @覆盖
    公众的IBinder onBind(意向意图)
    {
        返回null;
    }
}

这code运行完全我的三星设备上。

I have a test screen where there is a button - where it is pressed it calls the service. I'm trying to implement a way to get the current gps location of the current user and it is crashing when it tries to call. Can anyone tell what the problem is?

package com.example.whereyouapp;

import java.util.Arrays;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.SmsManager;
import android.widget.Toast;

public class Controller extends Service{

private static final int POLL_INTERVAL = 1000 *3;

static int number_of_times=0;

Location location;
// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

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

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

public void makeUseOfNewLocation(Location location){
    this.location=location;
}

public static double coordinatesDistance(double lat1, double lon1, double lat2, double lon2){//returns distance in kilometers between two coordiantes
    double deltaLat = Math.toRadians(lat2-lat1);
    double deltaLong = Math.toRadians(lon2 - lon1);
    lat1 = Math.toRadians(lat1);
    lat2 = Math.toRadians(lat2);
    double a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.sin(deltaLong / 2) * Math.sin(deltaLong / 2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.asin(Math.sqrt(a));
    return 6371 * c; 
}

public int onStartCommand(Intent intent,int flags, int startId){
    Toast.makeText(this, "yololo- the service class works", Toast.LENGTH_SHORT).show();
    //sendSMS("5613500110","If you received this text message then the Service class for WhereYouApp works");

            // Register the listener with the Location Manager to receive location updates
                 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1, 0, locationListener);

            if(location!=null){
            double distance=coordinatesDistance(location.getLatitude(),location.getLatitude(),location.getLatitude()+2,location.getLatitude()+2);

            Toast.makeText(this, ""+distance, Toast.LENGTH_SHORT).show();
            }

    if(number_of_times==5){
        setServiceAlarm(getBaseContext(),false);
        number_of_times=-1;
    }
    number_of_times++;
    return START_STICKY;
}

public void onDestroy(){
    super.onDestroy();
    Toast.makeText(this, "yolo- the service has stopped working", Toast.LENGTH_LONG).show();
}

public void sendSMS(String phoneNumber, String message) {
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, null, null);
    ContentValues values = new ContentValues(); 
    values.put("address", phoneNumber); 
    values.put("body", message); 
    getContentResolver().insert(Uri.parse("content://sms/sent"), values);
}

public static void setServiceAlarm(Context context, boolean isOn){

        Intent i = new Intent(context, Controller.class);
        PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
        AlarmManager alarmManager =        (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        if (isOn) {
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis(), POLL_INTERVAL, pi);
        } else {
            alarmManager.cancel(pi);
            pi.cancel();
        }
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
 }

This class will be used to test controller functions, it will consist of a screen with buttons that do various functions

package com.example.whereyouapp;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.content.ContentValues;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.view.View;
import android.widget.Button;

public class ControllerTestingScreen extends Activity{
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_controller_test_screen);
    //Set button colors to red, green, blue, and red, respectively
    Button button = (Button) findViewById(R.id.testbutton);
    button.getBackground().setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
    OnClickListener buttonListener = new View.OnClickListener(){
        public void onClick(View arg0) {

            Controller.setServiceAlarm(getBaseContext(), true);
        }
    };
    button.setOnClickListener(buttonListener);
}
}

Logcat:

    02-26 22:04:38.317: D/AndroidRuntime(1427): Shutting down VM
02-26 22:04:38.317: W/dalvikvm(1427): threadid=1: thread exiting with uncaught exception (group=0xb1a91ba8)
02-26 22:04:38.457: D/dalvikvm(1427): GC_FOR_ALLOC freed 115K, 6% free 3270K/3460K, paused 87ms, total 103ms
02-26 22:04:38.497: E/AndroidRuntime(1427): FATAL EXCEPTION: main
02-26 22:04:38.497: E/AndroidRuntime(1427): Process: com.example.whereyouapp, PID: 1427
02-26 22:04:38.497: E/AndroidRuntime(1427): java.lang.RuntimeException: Unable to instantiate service com.example.whereyouapp.Controller: java.lang.NullPointerException
02-26 22:04:38.497: E/AndroidRuntime(1427):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2556)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at android.app.ActivityThread.access$1800(ActivityThread.java:135)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at android.os.Handler.dispatchMessage(Handler.java:102)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at android.os.Looper.loop(Looper.java:136)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at android.app.ActivityThread.main(ActivityThread.java:5017)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at java.lang.reflect.Method.invokeNative(Native Method)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at java.lang.reflect.Method.invoke(Method.java:515)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at dalvik.system.NativeStart.main(Native Method)
02-26 22:04:38.497: E/AndroidRuntime(1427): Caused by: java.lang.NullPointerException
02-26 22:04:38.497: E/AndroidRuntime(1427):     at android.content.ContextWrapper.getSystemService(ContextWrapper.java:540)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at com.example.whereyouapp.Controller.<init>(Controller.java:30)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at java.lang.Class.newInstanceImpl(Native Method)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at java.lang.Class.newInstance(Class.java:1208)
02-26 22:04:38.497: E/AndroidRuntime(1427):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2553)
02-26 22:04:38.497: E/AndroidRuntime(1427):     ... 10 more
02-26 22:04:45.187: I/Process(1427): Sending signal. PID: 1427 SIG: 9
02-26 22:04:47.507: D/AndroidRuntime(1469): Shutting down VM
02-26 22:04:47.507: W/dalvikvm(1469): threadid=1: thread exiting with uncaught exception (group=0xb1a91ba8)
02-26 22:04:47.517: E/AndroidRuntime(1469): FATAL EXCEPTION: main
02-26 22:04:47.517: E/AndroidRuntime(1469): Process: com.example.whereyouapp, PID: 1469
02-26 22:04:47.517: E/AndroidRuntime(1469): java.lang.RuntimeException: Unable to instantiate service com.example.whereyouapp.Controller: java.lang.NullPointerException
02-26 22:04:47.517: E/AndroidRuntime(1469):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2556)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at android.app.ActivityThread.access$1800(ActivityThread.java:135)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at android.os.Handler.dispatchMessage(Handler.java:102)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at android.os.Looper.loop(Looper.java:136)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at android.app.ActivityThread.main(ActivityThread.java:5017)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at java.lang.reflect.Method.invokeNative(Native Method)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at java.lang.reflect.Method.invoke(Method.java:515)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at dalvik.system.NativeStart.main(Native Method)
02-26 22:04:47.517: E/AndroidRuntime(1469): Caused by: java.lang.NullPointerException
02-26 22:04:47.517: E/AndroidRuntime(1469):     at android.content.ContextWrapper.getSystemService(ContextWrapper.java:540)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at com.example.whereyouapp.Controller.<init>(Controller.java:30)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at java.lang.Class.newInstanceImpl(Native Method)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at java.lang.Class.newInstance(Class.java:1208)
02-26 22:04:47.517: E/AndroidRuntime(1469):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2553)
02-26 22:04:47.517: E/AndroidRuntime(1469):     ... 10 more

解决方案

I did some changes in your code and finally got a working code.

public class Controller extends Service 
{
    private static final int POLL_INTERVAL = 1000 *3;
    static int number_of_times=0;

    Location currentLocation;
    static LocationManager locationManager;
    // Define a listener that responds to location updates

    LocationListener locationListenerGps = new LocationListener() 
    {
        public void onLocationChanged(Location location) 
        {
            currentLocation = location;
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };


    public static double coordinatesDistance(double lat1, double lon1, double lat2, double lon2)
    {
        //returns distance in kilometers between two coordiantes
        double deltaLat = Math.toRadians(lat2-lat1);
        double deltaLong = Math.toRadians(lon2 - lon1);
        lat1 = Math.toRadians(lat1);
        lat2 = Math.toRadians(lat2);
        double a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.sin(deltaLong / 2) * Math.sin(deltaLong / 2) * Math.cos(lat1) * Math.cos(lat2);
        double c = 2 * Math.asin(Math.sqrt(a));
        return 6371 * c; 
    }

    public int onStartCommand(Intent intent,int flags, int startId)
    {
        Toast.makeText(this, "yololo- the service class works", Toast.LENGTH_SHORT).show();
        //sendSMS("5613500110","If you received this text message then the Service class for WhereYouApp works");

        if ( locationManager != null )
        {
            System.out.println ( "not null" );
            // Register the listener with the Location Manager to receive location updates
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerGps);
        }

        if( currentLocation != null )
        {
            double distance=coordinatesDistance(currentLocation.getLatitude(),currentLocation.getLatitude(),currentLocation.getLatitude()+2,currentLocation.getLatitude()+2);
            Toast.makeText(this, ""+distance, Toast.LENGTH_SHORT).show();
        }
        else
        {
            System.out.println  ( "location not found" );
        }

        if(number_of_times==5)
        {
            setServiceAlarm(getBaseContext(),false);
            number_of_times=-1;
        }
        number_of_times++;
        return START_NOT_STICKY;
    }

    public void onDestroy()
    {
        super.onDestroy();
        Toast.makeText(this, "yolo- the service has stopped working", Toast.LENGTH_LONG).show();
    }

    public void sendSMS(String phoneNumber, String message) 
    {
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, null, null);
        ContentValues values = new ContentValues(); 
        values.put("address", phoneNumber); 
        values.put("body", message); 
        getContentResolver().insert(Uri.parse("content://sms/sent"), values);
    }

    public static void setServiceAlarm(Context context, boolean isOn)
    {
        // Acquire a reference to the system Location Manager
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        Intent i = new Intent(context, Controller.class);
        PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        if (isOn) 
        {
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), POLL_INTERVAL, pi);
        } 
        else 
        {
            alarmManager.cancel(pi);
            pi.cancel();
        }
    }

    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }
}

This code perfectly runs on my Samsung device.

这篇关于NullPointerException异常而获取当前的GPS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆