在开发 Android 位置相关应用时,可以从 GPS(全球定位系统)、passive、network 获取用户位置。通过 GPS 能获得最精确的信息。
LocationProvider 是位置源的意思,用来提供定位信息。
常用的 LocationProvider
LocationManager:该类提供系统定位服务访问功能。
LocationManager 提供的常用的方法
LocationProvider:定位组件的抽象表示,通过该类可以获取该定位组件的相关信息。
LocationProvider 提供的常用方法
Location:该类表示特定时间地理位置信息,位置由经度、纬度、UTC时间戳以及可选的高度、速度、方向等组成。
Location 提供的常用方法
举例说明:获取所有可用的 Location Provider
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //获取显示 LocationProvider 名称的 TextView 组件 TextView textView = findViewById(R.id.text2); //获取 location 服务 LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); //获取系统所有的 LocationProvider 名称 ListproviderNames = locationManager.getAllProviders(); //使用 StringBuilder 保存数据 StringBuilder stringBuilder = new StringBuilder(); //遍历获取到的全部 Locationprovider 名称 for(Iterator iterator = providerNames.iterator(); iterator.hasNext(); ) { stringBuilder.append(iterator.next() + "n"); } //显示 LocationProvider 名称 textView.setText(stringBuilder.toString()); } }
结果
举例说明:获取动态定位信息
public class MainActivity extends Activity { //获取系统的 LocationManager 对象 private LocationManager locationManager; //定义显示 LocationProvider 的 TextView 组件 private TextView provider; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); provider = findViewById(R.id.provider); //检测用户是否打开GPS if (!isGpsAble(locationManager)) { Toast.makeText(MainActivity.this, "请打开GPS", Toast.LENGTH_SHORT).show(); openGPS2(); } //检测用户是否允许定位 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //提供开启定位的指导界面 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 200); } else { //获取GPS信息 startLocation(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //用户同意权限 if (requestCode == 200) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) startLocation(); else //用户拒绝之后,当然我们也可以d出一个窗口,直接跳转到系统设置页面 Toast.makeText(MainActivity.this, "请手动开启权限", Toast.LENGTH_LONG).show(); } } //禁止权限检查 @SuppressLint("MissingPermission") private void startLocation(){ //从GPS获取最近的定位信息 Location lc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); //更新信息 updateShow(lc); //2秒获取一次、位置间隔1米 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, new LocationListener() { //GPS信息变化则更新 @Override public void onLocationChanged(Location location) { updateShow(location); } //位置状态发生改变时更新 @Override public void onStatusChanged(String provider, int status, Bundle extras) { } //定位提供者启动时触发 @Override public void onProviderEnabled(String provider) { } //定位提供者关闭时触发 @Override public void onProviderDisabled(String provider) { } }); } //更新GPS数据 @SuppressLint("SetTextI18n") private void updateShow(Location location) { if (location != null) { String string = "当前的位置信息:" + "n经度:" + location.getLongitude() + "n纬度:" + location.getLatitude() + "n高度:" + location.getAltitude() + "n速度:" + location.getSpeed() + "n方向:" + location.getBearing() + "n定位精度:" + location.getAccuracy(); provider.setText(string); } else provider.setText("没有获取GPS信息"); } //返回 GPS 状态 private boolean isGpsAble(LocationManager lm) { return lm.isProviderEnabled(LocationManager.GPS_PROVIDER); } //打开设置页面 private void openGPS2() { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivityForResult(intent, 0); } }
结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)