NullPointerException异常而获取当前的GPS [英] NullPointerException while fetching current GPS
本文介绍了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();
} 如果(== NUMBER_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(找不到位置);
} 如果(== NUMBER_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屋!
查看全文