Android初级教程获取手机位置信息GPS与动态获取最佳方式

时间:2023-01-12 10:55:53

简单介绍一下gps定位的操作。

主要是靠locationmanger这个api完成的一些操作;通过获取这个实例,然后调用它的requestLocationUpdates方法进行注册。传入的参数分别有以下含义:

             * 1、provider:哪种定位方式
             * 2、minTime:定位的时间差
             * 3、minDistance:定位距离差
             * 4、定位监听回调

然后第四个参数是一个监听器,要回调这个方法,监听位置的变化情况。实时更新所在位置

程序代码如下:

package com.example.gps;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv_show_location;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tv_show_location = (TextView) findViewById(R.id.tv_show_location);
        
        //获取定位管理器
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        //设置定位信息
        //坐标位置改变,回调此监听方法
        LocationListener listener = new LocationListener() {
        	
        	@Override
        	public void onStatusChanged(String provider, int status, Bundle extras) {
        		// TODO Auto-generated method stub
        		
        	}
        	
        	@Override
        	public void onProviderEnabled(String provider) {
        		// TODO Auto-generated method stub
        		
        	}
        	
        	@Override
        	public void onProviderDisabled(String provider) {
        		// TODO Auto-generated method stub
        		
        	}
        	
        	//位置改变的时候调用,这个方法用于返回一些位置信息
        	@Override
        	public void onLocationChanged(Location location) {
        		//获取位置变化结果
        		float accuracy = location.getAccuracy();//精确度,以密为单位
        		double altitude = location.getAltitude();//获取海拔高度
        		double longitude = location.getLongitude();//经度
        		double latitude = location.getLatitude();//纬度
        		float speed = location.getSpeed();//速度
        		
        		//显示位置信息
        		tv_show_location.append("accuracy:"+accuracy+"\n");
        		tv_show_location.append("altitude:"+altitude+"\n");
        		tv_show_location.append("longitude:"+longitude+"\n");
        		tv_show_location.append("latitude:"+latitude+"\n");
        		tv_show_location.append("speed:"+speed+"\n");
        	}
        };
        locationManager.requestLocationUpdates("gps", 0, 0, listener);//Register for location updates
    }
}



而如果想自动获取最佳定位方式的话,加入以下代码即可:

 //动态获取所有的定位方式
	        List<String> allProviders = locationManager.getAllProviders();
	        for (String string : allProviders) {
				System.out.println("所有定位方式:>>>"+string);
			}
	        
	        Criteria criteria = new Criteria();
	        criteria.setCostAllowed(true);//设置产生费用,收费的一般比较精确
	        criteria.setAccuracy(Criteria.ACCURACY_FINE);//精确度设为最佳
	        
	        //动态获取最佳定位方式
	        String bestProvider = locationManager.getBestProvider(criteria, true);
	        /**
	         * 1、provider:那种定位方式
	         * 2、minTime:定位的时间差
	         * 3、minDistance:定位距离差
	         * 4、定位监听回调
	         * 
	         */
	        //Register for location updates 
	        locationManager.requestLocationUpdates(bestProvider, 0, 0, listener);
用模拟器的话。需要配置三个权限:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

第二个专门针对模拟器的权限,真机则不需要。

运行程序,用DDMS的Maual下的Decimal发送变化的位置信息,则可以在手机上显示坐标的变化。


对于基于位置的操作,建议在真机上测试。