我需要使用GPS获取myLocation,如何获得它?我尝试下一个代码,但它永远不会工作。当我重新启动手机并运行应用程序时,它无效。
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
public class GPSTraker 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
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 3000; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;
public GPSTraker(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(GPSTraker.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();
}
@Override
public void onLocationChanged(Location location) {
}
@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;
}
}
并使用它:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
v = inflater.inflate(R.layout.fragment_near_new, null);
elvMain = (ExpandableListView) v.findViewById(R.id.elvMain);
GPSTraker gps = new GPSTraker(getActivity());
if (gps.canGetLocation()) {
myLat = gps.getLatitude();
myLong = gps.getLongitude();
Log.d("myDebug", "new get Location +" + myLat);
// \n is for new line
} else {
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
Log.d("myDebug", "Can not get location");
gps.showSettingsAlert();
}
return v;
}
这是错的?也许有人有一些想法如何解决这个问题?重新启动手机后this program 也不能得到我的位置。
答案 0 :(得分:1)
您想要连续的位置更新还是只需要一个位置?
通过“GPS,无网络”我假设您想要获得一个位置,即使网络不可用,也不应该永远不要使用网络位置。
LocationManager
上的一些基础知识:
启动时,您需要请求LocationManager
的实例,然后调用RequestLocationUpdates()
,并将接收位置更新的类作为参数传递。当新位置可用时,LocationManager
将调用onLocationChanged()
,并将当前位置作为参数传递。
查看你的代码,你可以在那里找到它,但是在错误的地方:
getLocation()
方法中的大多数代码都应该进入onCreate()
。requestLocationUpdates()
的调用应该采用您服务的onStartCommand()
方法。您应该通过removeUpdates()
方法中的stopSelf()
取消注册,以便在您的服务停止时释放GPS。 (对于活动,分别在onResume()
和onPause()
中执行此操作。否则,即使服务停止/用户离开活动,它也会保持GPS唤醒并耗尽电量,直到系统终止应用程序。)onCreateView()
中处理位置更新的代码应该进入onLocationChanged()
。我看到你也在呼叫LocationManager.getLastKnownLocation()
。这将获得LocationManager
之前获得的最后位置,但不会启动GPS。如果之前没有其他应用请求过位置更新(使用requestLocationUpdates()
),则无法报告位置,如果设备自上次获得位置后移动,您将获得过期位置。< / p>
如果您需要以可靠的方式更新单个位置信息并获取最新信息,请按照上述说明操作,并在removeUpdates()
方法中拨打onLocationChanged()
。这将在第一次位置更新后释放GPS。请注意,您可能需要等待一段时间才能进行位置更新,因为GPS可能需要一些时间才能启动。