我写了一个服务,提供GPS位置和位置更改我想比较位置信息与我的共享prefrence的值,并显示一个toast或alart对话但共享prefrence和tost dosnt工作因为上下文为null。这是我的代码和我的错误。请帮助我。谢谢
public class Broadcastreceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
Intent service1=new Intent(context,GPSTracker.class);
context.startService(service1);
Log.i("service", "service");
}
}
和
public class GPSTracker extends Service implements LocationListener
{
SharedPreferences pref;
@Override
public void onCreate()
{
pref=this.getSharedPreferences("mypref",0);
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId)
{
pref=this.getSharedPreferences("mypref",0);
super.onStart(intent, startId);
}
private final Context mContext;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
// flag for GPS status
boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;
public GPSTracker(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation()
{
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled)
{
// no network provider is enabled
}
else
{
this.canGetLocation = true;
if (isNetworkEnabled)
{
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled)
{
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
/**
* Stop using GPS listener
* Calling this function will stop using GPS in your app
* */
public void stopUsingGPS(){
if(locationManager != null){
locationManager.removeUpdates(GPSTracker.this);
}
}
/**
* Function to get latitude
* */
public double getLatitude(){
if(location != null){
latitude = location.getLatitude();
}
// return latitude
return latitude;
}
/**
* Function to get longitude
* */
public double getLongitude(){
if(location != null){
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
/**
* Function to check GPS/wifi enabled
* @return boolean
* */
public boolean canGetLocation() {
return this.canGetLocation;
}
/**
* Function to show settings alert dialog
* On pressing Settings button will lauch Settings Options
* */
public void showSettingsAlert(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing Settings button
alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
});
// on pressing cancel button
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
public void onLocationChanged(Location location)
{
Log.i("servise",Boolean.toString(pref.getBoolean("default", false)));
if(pref.getBoolean("default", false)==true)
{
String defaultcity=pref.getString("defaultcity", null);
double defaultlat=Double.parseDouble(pref.getString("defaultlat", null));
double defaultlng=Double.parseDouble(pref.getString("defaultlng", null));
Geocoder go=new Geocoder(GPSTracker.this);
try
{
List<Address> address=go.getFromLocation(latitude, latitude, 1);
if(address.get(0).getAdminArea().equals(defaultcity))
{
}
else
{
if(latitude==defaultlat && longitude==defaultlng)
{
}
else
{
String s="Your current location has changed.It's better to change default place of praytimes application.";
Toast.makeText(this, s, Toast.LENGTH_LONG).show();
String TAG="locationchange";
Log.i(TAG,"Locationchanged");
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
我的错误日志
答案 0 :(得分:0)
您的错误日志清楚地显示错误发生在GPSTracker
方法中GPSTracker.onLocationChanged(...)
的第214行。我们无法分辨出哪一行,但你可以,因此检查该行,查看该行上的对象引用,并解释为什么其中一行为空。
答案 1 :(得分:0)
请尝试以下代码了解背景
context.getSystemService(LAYOUT_INFLATER_SERVICE)
getApplicationContext().getSharedPreferences(name, mode);