申明:不要使用23以上的API,因为多了一个权限审核,会抛出异常,我今天就是因为Android Studio自动设置成23的API了,导致异常。
开发定位的功能很简单,首先获取LocationManager服务对象:
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE); 然后使用LocationManager对象的getLastKnownLocation方法返回一个Location对象,Location包含了经度、维度、海拔、速度等等信息,对,这就是我们要的。 代码:
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
StringBuffer sb = new StringBuffer();
if(location!=null) {
sb.append("经度:" + location.getLatitude() + " ");
sb.append("纬度:" + location.getLongitude() + " ");
sb.append("速度:" + location.getSpeed() + " ");
sb.append("提供者:" + location.getProvider() + " ");
sb.append("精准度:" + location.getAccuracy() + " ");
sb.append("海拔:" + location.getAltitude() + " ");
sb.append("getBearing:" + location.getBearing() + " ");
sb.append("getElapsedRealtimeNanos:" + location.getElapsedRealtimeNanos() + " ");
}
text.setText( sb);
如果我们需要在特定的时间内更新GPS位置,那么我们需要创建监听器LocationListener,LocationListener可以为我们更新位置信息,使用LocationManager方法:
public void requestLocationUpdates (String provider, long minTime, float minDistance, LocationListenerlistener)
Added in API level 1
Register for location updates using the named provider, and a pending intent.
See requestLocationUpdates(long, float, Criteria, PendingIntent) for more detail on how to use this method.
Parameters
| provider | the name of the provider with which to register |
|---|---|
| minTime | minimum time interval between location updates, in milliseconds |
| minDistance | minimum distance between location updates, in meters |
| listener | a LocationListener whose onLocationChanged(Location) method will be called for each location update |
监听器的代码:
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
double lnt = location.getLatitude() ;
double log = location.getLongitude() ;
//toast("onLocationChanged:lnt[" + lnt + "] log[" + log + "]");
StringBuffer sb = new StringBuffer();
sb.append("经度:" + location.getLatitude() + " ");
sb.append("纬度:" + location.getLongitude() + " ");
sb.append("速度:" + location.getSpeed() + " ");
sb.append("提供者:" + location.getProvider() + " ");
sb.append("精准度:" + location.getAccuracy() + " ");
sb.append("海拔:" + location.getAltitude() + " ");
sb.append("getBearing:" + location.getBearing() + " ");
sb.append("getElapsedRealtimeNanos:" + location.getElapsedRealtimeNanos() + " ");
text.setText(sb.toString());
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
toast("onStatusChanged");
}
@Override
public void onProviderEnabled(String provider) {
toast("onProviderEnabled");
}
@Override
public void onProviderDisabled(String provider) {
toast("onProviderDisabled");
}
};
全部代码:
package com.lanxin.testlocation2;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.lang.ref.SoftReference;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "LocatinLog";
TextView text;
Context mContext;
LocationManager lm;
Geocoder geocoder;
LocationListener ll;
LocationProvider lp;
Location location;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
findid();
init();
}
private void init() {
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
geocoder = new Geocoder(mContext);
location = new Location(LocationManager.GPS_PROVIDER);
ll = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
double lnt = location.getLatitude() ;
double log = location.getLongitude() ;
//toast("onLocationChanged:lnt[" + lnt + "] log[" + log + "]");
StringBuffer sb = new StringBuffer();
sb.append("经度:" + location.getLatitude() + " ");
sb.append("纬度:" + location.getLongitude() + " ");
sb.append("速度:" + location.getSpeed() + " ");
sb.append("提供者:" + location.getProvider() + " ");
sb.append("精准度:" + location.getAccuracy() + " ");
sb.append("海拔:" + location.getAltitude() + " ");
sb.append("getBearing:" + location.getBearing() + " ");
sb.append("getElapsedRealtimeNanos:" + location.getElapsedRealtimeNanos() + " ");
text.setText(sb.toString());
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
toast("onStatusChanged");
}
@Override
public void onProviderEnabled(String provider) {
toast("onProviderEnabled");
}
@Override
public void onProviderDisabled(String provider) {
toast("onProviderDisabled");
}
};
location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
StringBuffer sb = new StringBuffer();
if(location!=null) {
sb.append("经度:" + location.getLatitude() + " ");
sb.append("纬度:" + location.getLongitude() + " ");
sb.append("速度:" + location.getSpeed() + " ");
sb.append("提供者:" + location.getProvider() + " ");
sb.append("精准度:" + location.getAccuracy() + " ");
sb.append("海拔:" + location.getAltitude() + " ");
sb.append("getBearing:" + location.getBearing() + " ");
sb.append("getElapsedRealtimeNanos:" + location.getElapsedRealtimeNanos() + " ");
}
text.setText( sb);
}
private void findid() {
mContext = this;
text = (TextView) findViewById(R.id.text);
Button go = (Button)findViewById(R.id.go);
go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
toast("onLocationChanged:lnt[" + location.getLatitude() + "] log[" + location.getLongitude() + "]");
try {
List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 5);
if(addresses!=null && addresses.size() > 0){
StringBuffer sb = new StringBuffer();
for(int i=0;i<addresses.size();i++){
Address adr = addresses.get(i);
sb.append("lat"+i+":"+adr.getLatitude()+"lnt"+i+":"+adr.getLongitude()+" \n\t ");
}
text.setText(sb.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private void toast(String msg) {
Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
lm.removeUpdates(ll);//程序注销时应该移除监听器,以减少电量的使用
}
protected void onResume() {
super.onResume();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);//程序恢复的时候我们注册监听器
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}


1 Comment
源码下载:http://pan.baidu.com/s/1mipQjJ6