一 确定自己的位置
步骤:
<1>获取LocationManager的实例
LocationManager locationManager = (LocationManager )getSystemService(Context.LOCATION_SERVICE);
<2>选择一个位置选择器:
GPS_PROVIDER, NETWORK_PROVIDER , PASSIVE_PROVIDER.
GPS定位 , 网络定位 , 不自己实例化去获取地理位置,而是通过getProvider获取其他的服务或者activity更新位置,被动的获取更新。
String provider = LocationManager.NETWORK_PROVIDER .
Location location = locationManager.getLastKnowLocation(provider);
<3>假如想让定位的精度高一些,又不确定GPS开没开,这个时候可以判断有哪些提供器可以使用。
List《String》 providerList = locationManager.getProviders(true);
传入true表示只有启用位置提供器才被返回。
<4>当用户是移动时,获取最新位置的方法。
locationManager.requestLocationUpdates(provider , 5000 , 1 ,locationListener);
//内容提供器的类型 , 监听变化的时间间隔 , 监听位置变化的距离间隔 , LocationListener监听器
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//更新当前设备的位置信息
showLocation(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
实例:
package com.example.locationmanager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView posiotionTextView;
private LocationManager locationManager;
private String provider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
posiotionTextView =(TextView) findViewById(R.id.position_text_view);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//获取所有可用的位置提供器
List<String> providerList = locationManager.getProviders(true);
if(providerList.contains(LocationManager.GPS_PROVIDER)){
provider = LocationManager.GPS_PROVIDER;
System.out.println(provider);
}else if(providerList.contains(LocationManager.NETWORK_PROVIDER)){
provider = LocationManager.NETWORK_PROVIDER;
System.out.println(provider);
}else {
//当没有可用的位置提供器时,弹出Toast提示用户
Toast.makeText(this , " No Location provider to use",Toast.LENGTH_SHORT).show();
return;
}
if ( Build.VERSION.SDK_INT >= 23 &&
ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return ;
}
Location location = locationManager.getLastKnownLocation(provider);
if (location!=null){
showLocation(location);
}
locationManager.requestLocationUpdates(provider , 5000 , 1 ,locationListener);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (locationManager!=null){
//关闭程序将监听器移除
locationManager.removeUpdates(locationListener);
}
}
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//更新当前设备的位置信息
showLocation(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
private void showLocation(Location location){
String currentPosition = "latitude is " +location.getLatitude()+"\n"+"longitude is"+ location.getLongitude();
System.out.println(currentPosition);
posiotionTextView.setText(currentPosition);
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.locationmanager">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
</manifest>
注意:权限的添加,和权限的判断在大于等于api23时。