Android中獲取用戶的地理信息的方式有很多種,各有各得優點和缺點。
這裏主要介紹的方法是通過調用百度提供的地圖API獲取用戶的地理位置信息。
首要不可缺少的還是百度提供的標準Application類
public class BMapApiApplication extends Application {
public static BMapApiApplication mDemoApp;
public static float mDensity;
//百度MapAPI的管理類
public BMapManager mBMapMan = null;
// 授權Key
// TODO: 請輸入您的Key,
// 申請地址:http://dev.baidu.com/wiki/static/imap/key/
public String mStrKey = "F9FBF9FAA9BA37C0C6085BD280723A659EC51B20";
public boolean m_bKeyRight = true; // 授權Key正確,驗證通過
// 常用事件監聽,用來處理通常的網絡錯誤,授權驗證錯誤等
public static class MyGeneralListener implements MKGeneralListener {
@Override
public void onGetNetworkState(int iError) {
Toast.makeText(BMapApiApplication.mDemoApp.getApplicationContext(), "您的網絡出錯啦!",
Toast.LENGTH_LONG).show();
}
@Override
public void onGetPermissionState(int iError) {
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
// 授權Key錯誤:
Toast.makeText(BMapApiApplication.mDemoApp.getApplicationContext(),
"請在BMapApiDemoApp.java文件輸入正確的授權Key!",
Toast.LENGTH_LONG).show();
BMapApiApplication.mDemoApp.m_bKeyRight = false;
}
}
}
@Override
public void onCreate() {
mDemoApp = this;
mBMapMan = new BMapManager(this);
mBMapMan.init(this.mStrKey, new MyGeneralListener());
mDensity = getResources().getDisplayMetrics().density;
super.onCreate();
}
@Override
//建議在您app的退出之前調用mapadpi的destroy()函數,避免重複初始化帶來的時間消耗
public void onTerminate() {
// TODO Auto-generated method stub
if (mBMapMan != null) {
mBMapMan.destroy();
mBMapMan = null;
}
super.onTerminate();
}
}
然後是通過註冊百度地圖調用相應的接口獲取經緯度獲取相應的信息
/** Called when the activity is first created. */
/** 上下文 */
private BMapApiApplication mApplication;
/** 定義搜索服務類 */
private MKSearch mMKSearch;
/** 記錄當前經緯度的MAP*/
private HashMap<String, Double> mCurLocation = new HashMap<String, Double>();
//城市名
private String cityName;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mApplication = (BMapApiApplication) this.getApplication();
if (mApplication.mBMapMan == null) {
mApplication.mBMapMan = new BMapManager(getApplication());
mApplication.mBMapMan.init(mApplication.mStrKey,
new BMapApiApplication.MyGeneralListener());
}
/** 初始化MKSearch */
mMKSearch = new MKSearch();
mMKSearch.init(mApplication.mBMapMan, new MySearchListener());
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
this.registerLocationListener();
}
private void registerLocationListener() {
mApplication.mBMapMan.getLocationManager().requestLocationUpdates(
mLocationListener);
if (mApplication.mBMapMan != null) {
/** 開啓百度地圖API */
mApplication.mBMapMan.start();
}
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
this.unRegisterLocationListener();
}
private void unRegisterLocationListener() {
mApplication.mBMapMan.getLocationManager().removeUpdates(
mLocationListener);
if (mApplication.mBMapMan != null) {
/** 終止百度地圖API */
mApplication.mBMapMan.stop();
}
}
@Override
protected void onDestroy() {
if (mApplication.mBMapMan != null) {
/** 程序退出前需調用此方法 */
mApplication.mBMapMan.destroy();
mApplication.mBMapMan = null;
}
super.onDestroy();
}
/** 註冊定位事件 */
private LocationListener mLocationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if (location != null) {
try {
int longitude = (int) (1000000 * location.getLongitude());
int latitude = (int) (1000000 * location.getLatitude());
/** 保存當前經緯度 */
mCurLocation.put("longitude", location.getLongitude());
mCurLocation.put("latitude", location.getLatitude());
GeoPoint point = new GeoPoint(latitude, longitude);
/** 查詢該經緯度值所對應的地址位置信息 */
Weather_WelcomeActivity.this.mMKSearch
.reverseGeocode(new GeoPoint(latitude, longitude));
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
/** 內部類實現MKSearchListener接口,用於實現異步搜索服務 */
private class MySearchListener implements MKSearchListener {
@Override
public void onGetAddrResult(MKAddrInfo result, int iError) {
if( iError != 0 || result == null){
Toast.makeText(Weather_WelcomeActivity.this, "獲取地理信息失敗", Toast.LENGTH_LONG).show();
}else {
Log.info("json", "result= " + result);
cityName =result.addressComponents.city;
Bundle bundle = new Bundle();
bundle.putString("cityName", cityName.substring(0, cityName.lastIndexOf("市")));
Intent intent = new Intent(Weather_WelcomeActivity.this,Weather_MainActivity.class);
intent.putExtras(bundle);
startActivity(intent);
Weather_WelcomeActivity.this.finish();
}
}
@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult result,
int iError) {
}
@Override
public void onGetPoiResult(MKPoiResult result, int type, int iError) {
}
@Override
public void onGetTransitRouteResult(MKTransitRouteResult result,
int iError) {
}
@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult result,
int iError) {
}
}
其他方式獲取當前的城市名:
/**
* 抓取當前的城市信息
*
* @return String 城市名
*/
public String getCurrentCityName(){
String city = "";
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
GsmCellLocation glc = (GsmCellLocation) telManager.getCellLocation();
if (glc != null){
int cid = glc.getCid(); // value 基站ID號
int lac = glc.getLac();// 寫入區域代碼
String strOperator = telManager.getNetworkOperator();
int mcc = Integer.valueOf(strOperator.substring(0, 3));// 寫入當前城市代碼
int mnc = Integer.valueOf(strOperator.substring(3, 5));// 寫入網絡代碼
String getNumber = "";
getNumber += ("cid:" + cid + "\n");
getNumber += ("cid:" + lac + "\n");
getNumber += ("cid:" + mcc + "\n");
getNumber += ("cid:" + mnc + "\n");
DefaultHttpClient client = new DefaultHttpClient();
BasicHttpParams params = new BasicHttpParams();
HttpConnectionParams.setSoTimeout(params, 20000);
HttpPost post = new HttpPost("http://www.google.com/loc/json");
try{
JSONObject jObject = new JSONObject();
jObject.put("version", "1.1.0");
jObject.put("host", "maps.google.com");
jObject.put("request_address", true);
if (mcc == 460)
jObject.put("address_language", "zh_CN");
else
jObject.put("address_language", "en_US");
JSONArray jArray = new JSONArray();
JSONObject jData = new JSONObject();
jData.put("cell_id", cid);
jData.put("location_area_code", lac);
jData.put("mobile_country_code", mcc);
jData.put("mobile_network_code", mnc);
jArray.put(jData);
jObject.put("cell_towers", jArray);
StringEntity se = new StringEntity(jObject.toString());
post.setEntity(se);
HttpResponse resp = client.execute(post);
BufferedReader br = null;
if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
br = new BufferedReader(new InputStreamReader(resp
.getEntity().getContent()));
StringBuffer sb = new StringBuffer();
String result = br.readLine();
while (result != null){
sb.append(getNumber);
sb.append(result);
result = br.readLine();
}
String s = sb.toString();
s = s.substring(s.indexOf("{"));
JSONObject jo = new JSONObject(s);
JSONObject arr = jo.getJSONObject("location");
JSONObject address = arr.getJSONObject("address");
city = address.getString("city");
}
}
catch (JSONException e){
e.printStackTrace();
}
catch (UnsupportedEncodingException e){
e.printStackTrace();
}
catch (ClientProtocolException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
finally{
post.abort();
client = null;
}
}
return city;
}