1、写好数据显示的界面
<TextView
android:id="@+id/tv_location1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/tv_location0"
android:text="数据"
android:textColor="#00bbff"
android:textSize="20dp" />
2、获取系统的位置服务,可以用LocationManager类来访问系统的位置(服务)。 这些服务允许应用程序获得设备地理位置的周期性更新,或者在设备进入给定地理位置附近时触发指定的应用程序。我们可以通过getSystemService来实例化。
3、使用requestLocationUpdates方法来开启定位功能,最后当销毁界面时一定要关闭位置更新。
public class MainActivity extends Activity {
private LocationManager mLM;
private MyListener myListener;
private TextView textLocation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textLocation = (TextView) findViewById(R.id.tv_location1);
myListener = new MyListener();
mLM = (LocationManager) getSystemService(LOCATION_SERVICE);//LocationManager类提供对系统位置服务的访问
List<String> allProviders = mLM.getAllProviders();// 获取位置提供者,GPS、网络等等
System.out.println(allProviders);// 打印的结果:[passive,gps,network] passive:指的是一种特殊的位置提供者(PASSIVE_PROVIDER),直接使用第三方应用获得的地理位置信息,如浏览器获得的位置信息(缺点:位置信息没有及时更新,优点:不用调用GPS定位,省电,获得位置数据速度快) gps:GPS定位提供者(GPS_PROVIDER),代表要调用GPS模块定位 network:网络定位提供者(NETWORK_PROVIDER),代表通过基站和WIFI的访问点确定位置
/**
* 使用LocationManager中的方法开启定位功能。requestLocationUpdates方法的作用:使用指定的位置提供者注册位置更新,设置更新规则。
* LocationManager.requestLocationUpdates(String provider, long minTime,float minDistance, LocationListener listener)
* 参数:(指定位置提供者,最小更新的时间间隔,最短更新的距离,位置变化监听者)
*/
mLM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myListener);
}
class MyListener implements LocationListener {
private long elapsedRealtimeNanos;
private double latitude;
private double altitude;
private double longitude;
private float speed;
private float bearing;
private long time;
/**
* 当位置发生变化时调用
*/
@SuppressLint("NewApi")
@Override
public void onLocationChanged(Location location) {
latitude = location.getLatitude();//火星坐标
longitude = location.getLongitude();
altitude = location.getAltitude();
elapsedRealtimeNanos = location.getElapsedRealtimeNanos();
speed = location.getSpeed();
bearing = location.getBearing();
time = location.getTime();
System.out.println("经度:"+ longitude+ "°\n纬度:"+ atitude+ "°\n海拔(World Geodetic System GPS所采用的坐标系是美国国防部1984世界坐标系,简称WGS-84。):" + altitude + "米\n地表速度:" + speed + "m/s\n本地区时间(地理时间):" + elapsedRealtimeNanos);
textLocation.setText("经度:" + longitude + "°\n纬度:" + latitude + "°\n海拔(World Geodetic System GPS所采用的坐标系是美国国防部1984世界坐标系,简称WGS-84。):"+ altitude + "米\n地表速度:" + speed + "m/s\n本地区时间(地理时间):" + elapsedRealtimeNanos+"\n角度:"+bearing+"°\n时间(UTC):"+time);
}
/**
* 当提供者状态发生变化时调用。当提供者无法获取位置信息时,或者提供者在无效后变成有效的状态,调用此方法。
*/
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Toast.makeText(getApplicationContext(), "位置提供者发生变化onStatusChanged",1000).show();
}
/**
* 当用户启用位置提供者时调用,即GPS开关打开。
*/
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(getApplicationContext(), "GPS开关打开onProviderEnabled",1000).show();
}
/**
* 当用户禁用位置提供者时调用,即GPS开关关闭。如果调用requestlocationupdates时,已经禁用位置提供者时,调用此方法。
*/
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(getApplicationContext(), "GPS开关关闭onProviderDisabled", 1000).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 当界面销毁时,应该停止监听位置更新功能,否则该应用会执行更新位置。
mLM.removeUpdates(myListener);
}
}
3、在清单文件AndroidManifest.xml中添加权限。
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
4、运行结果