package com.yeetrack.android.mygps;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
import android.content.Context;
public class MainActivity extends Activity
{
private TextView locationView;
private LocationManager locationManager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用Geocoder实现地址位置和经纬度之间的转化
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
locationView = (TextView)findViewById(R.id.locationId);
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
StringBuilder stringBuilder = new StringBuilder("可利用的provider");
//providers有gps,network和passive。gps最精确,network是通过网络定位,不太精确,passive是被动接受推送
List<String> providers = locationManager.getProviders(true);
//位置变化监听接口
LocationListener locationListener = 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)
{
/**
* 这里进行位置变化的一些操作
*/
System.out.println("位置改变了");
}
};
for(String provider : providers)
{
locationManager.requestLocationUpdates(provider, 0, 1000, locationListener);
stringBuilder.append("\n"+provider).append(":");
Location location = locationManager.getLastKnownLocation(provider);
if(location != null)
{
//经度
double lat = location.getLatitude();
//纬度
double lng = location.getLongitude();
double altitute = location.getAltitude();
stringBuilder.append("(");
stringBuilder.append(lat);
stringBuilder.append(",");
stringBuilder.append(lng);
stringBuilder.append(",高度"+altitute);
stringBuilder.append(",速度"+location.getSpeed());
stringBuilder.append(",方向"+location.getBearing());
stringBuilder.append(")");
//再将经纬度转化为地名
try
{
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
Address add = addresses.get(0);
for(int i=0;i<=add.getMaxAddressLineIndex();i++)
System.out.println(add.getAddressLine(i));
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
stringBuilder.append("null");
}
//设置过滤条件
Criteria criteria = new Criteria();
//设置精确度
criteria.setAccuracy(Criteria.ACCURACY_FINE);
//设置耗电度
criteria.setPowerRequirement(Criteria.POWER_HIGH);
//是否需要高度信息
criteria.setAltitudeRequired(true);
//是否需要方位信息
criteria.setBearingRequired(true);
//方位经度
criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH);
//是否需要速度信息
criteria.setSpeedRequired(true);
//速度经度
criteria.setSpeedAccuracy(Criteria.ACCURACY_HIGH);
//是否产生费用
criteria.setCostAllowed(true);
//获取符合条件的location provider
String bestProvider = locationManager.getBestProvider(criteria, true);
System.out.println(bestProvider);
List<String> matchProviders = locationManager.getProviders(false);
for(String index : matchProviders)
System.out.println(index);
//已知地名,获取该点的坐标等信息
String address = "北京天安门";
try
{
List<Address> addresses = geocoder.getFromLocationName(address, 5);
if(addresses.size()!=0)
{
for(Address index : addresses)
{
System.out.println("+++");
System.out.println(index.getLatitude());
System.out.println(index.getLongitude());
}
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
locationView.setText(stringBuilder);
}
}
Android的gps服务,主要有两个类LocationManager和LocationProvider。LocationManager与android底层交互,提供系统位置的访问方法,LocationProvider定义位置服务的提供方法,gps、network或者passive。下面是个简单的例子:
转载于:https://my.oschina.net/u/147181/blog/164965