我是android新手。我可以从模拟器中获取GPS坐标,但在我的设备中获得0.0,0.0作为纬度和经度。 这是我的代码。对不起它太长了..
班级GPSTracker.java
package com.example.spotter;
public class GPSTracker extends Service implements LocationListener {
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
double accuracy;
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; // 1 meter
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 6 * 1; // 1 sec
// 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 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();
Log.d("GPS Enabled", String.valueOf(latitude));
}
}
}
else{
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();
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
public void stopUsingGPS(){
if(locationManager != null){
locationManager.removeUpdates(GPSTracker.this);
}
}
public double getLatitude(){
if(location != null){
latitude = location.getLatitude();
}
// return latitude
return latitude;
}
public double getLongitude(){
if(location != null){
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
public double getAccuracy(){
if(location != null){
accuracy = location.getAccuracy();
}
return accuracy;
}
public boolean canGetLocation() {
return this.canGetLocation;
}
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();
}
@Override
public void onLocationChanged(Location location) {
Log.d("spt", "in loc changed");
/*if (MainService.loststatus > 0) {
HttpPost httpPost = new HttpPost(
"http://spotter.orgfree.com/writegps.php?value="
+ String.valueOf(this.getLatitude()) + ","
+ String.valueOf(this.getLongitude()));
// output is the variable you used in your program
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.execute(httpPost);
Log.d("spt", "writing coord to file");
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Toast.makeText(this, String.valueOf(gps.getLatitude()) + String.valueOf(gps.getLatitude()),
// Toast.LENGTH_SHORT).show();
}*/
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
和MainService.java
package com.example.spotter;
public class MainService extends Service implements Runnable {
String str;
Intent i1;
static double loststatus = 0;
Thread t;
//double longi,lati;
String provider;
Location location;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
Intent i = new Intent();
i.setClass(getApplicationContext(), Locked.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
Log.d("spt", "in handler");
}
};
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
Toast.makeText(this, "Service Stopped", Toast.LENGTH_SHORT).show();
super.onDestroy();
stopService(new Intent(getBaseContext(), MainService.class));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Spotter tracking service has been activated.", Toast.LENGTH_SHORT).show();
Notification note=new Notification(R.drawable.ic_launcher,
"",
System.currentTimeMillis());
Intent i=new Intent(this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pi=PendingIntent.getActivity(this, 0,
i, 0);
note.setLatestEventInfo(this, "",
"",
pi);
note.flags|=Notification.FLAG_NO_CLEAR;
t = new Thread(this);
t.start();
startForeground(1337, note);
return START_STICKY;
}
public void run() {
Looper.prepare();
while (isMyServiceRunning()) {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Log.d("spt", "read status started");
if ((Connectivity.isConnected(getApplicationContext()))) {
URL urlreadstatus = new URL("http://abc.xyz.com/status.txt");
// Log.d("spt",String.valueOf(URLUtil.isValidUrl("http://abc.xyz.com/status.txt")));
BufferedReader in = new BufferedReader( new InputStreamReader(urlreadstatus.openStream()));
str = in.readLine();
if(!str.equals(null)){
Log.d("spt", str);
}
in.close();
Log.d("spt", "read status complete");
} else {
Log.d("spt", "not connected");
break;
}
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (IOException e) {
Log.d("spt", "IO exception");
str = "11";
e.printStackTrace();
} catch(NullPointerException e){
str="11";
}
if (str.equals(null)) {
str = "11";
}
if (str.length() == 1) {
loststatus++;
if(loststatus %10 ==0){
SendSms s= new SendSms();
Log.d("spt", "ghus gaye");
TelephonyManager telemamanger = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String getSimSerialNumber = telemamanger.getSimSerialNumber();
String getSimNumber = telemamanger.getLine1Number();
String no="15555215557";
if (getSimNumber != no)
{
//Log.d("spt", getSimNumber);
Log.d("spt", "ghus gaye dobara");
sendSMS();
}
}
GPSTracker gps=new GPSTracker(MainService.this);
Log.d("spt", "lost status1 requesting location updates");
Toast.makeText(this, String.valueOf(gps.getLatitude()) + String.valueOf(gps.getLatitude()),
Toast.LENGTH_SHORT).show();
if(loststatus==1){
handler.sendEmptyMessage(0);
}
if (loststatus > 0) {
HttpPost httpPost = new HttpPost(
"http://abc.xyz.com/writegps.php?value="
+ String.valueOf(gps.getLatitude()) + ","
+ String.valueOf(gps.getLongitude()));
HttpPost httpPost2 = new HttpPost(
"http://abc.xyz.com/writeaccuracy.php?value="
+ String.valueOf(gps.getAccuracy()));
// output is the variable you used in your program
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.execute(httpPost);
httpClient.execute(httpPost2);
Log.d("spt", "writing coord to file");
//gps.stopUsingGPS();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
loststatus = 0;
}
}
}
private boolean isMyServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager
.getRunningServices(Integer.MAX_VALUE)) {
if ("com.example.spotter.MainService".equals(service.service
.getClassName())) {
return true;
}
}
return false;
}
public void sendSMS() {
String phoneNumber = "15555215556";
GPSTracker gps=new GPSTracker(MainService.this);
String message =String.valueOf(gps.getLatitude())+","+String.valueOf(gps.getLongitude());
Log.d("spt", "in send sms");
// SmsManager smsManager = SmsManager.getDefault();
//smsManager.sendTextMessage(phoneNumber, null, message, null, null);
}
}
请帮忙。
答案 0 :(得分:3)
您的代码中存在多个逻辑问题
if (isGPSEnabled)
中,您首先要求提供当前位置,然后检查是否存在任何旧位置。 if (isNetworkEnabled)
中的情况也是如此。onLocationChanged()
中完成,而你已经空了。更新: - 据OP透露,这个问题不是一个明确的细胞接收。一旦在晴朗的天空下,他得到了正确的GPS读数。