Android 如何获取手机经纬度和地理位置信息

        转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/41114827  

        最近做项目需要用到地理位置,场景实现附近人和附近群功能,需要每个客户端吧自己地理位置经纬度传到服务器端,然后经过服务器计算返回给你一个附近人的列表信息。以前没做过,所以现学如何获取手机地理位置,在网上搜许多资料用Android自带的LocationManager和Location获取位置的时候,经常会有获取的location为null的情况(在室外能获取到位置信息,但在室内获取不到,如果你在室内或取不到位置信息,可以移动到室外试试,亲身实践),并且操作起来也不是很方便。最后发现用百度地图api获取位置还是非常快捷准确的,关键是不管是在哪室内或室外都可以一次性获取当前位置经纬度以及详细地址信息,还可以获取周边POI信息,同时可以设定位置通知点,到达某一位置时,发出通知信息等方式来告知用户。现在有一个小例子和大家分享一下。下面是果图:



package BD.map;

import android.app.Activity;
import android.location.Location;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.LocationListener;
import com.baidu.mapapi.MKAddrInfo;
import com.baidu.mapapi.MKBusLineResult;
import com.baidu.mapapi.MKDrivingRouteResult;
import com.baidu.mapapi.MKEvent;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MKLocationManager;
import com.baidu.mapapi.MKPoiResult;
import com.baidu.mapapi.MKSearch;
import com.baidu.mapapi.MKSearchListener;
import com.baidu.mapapi.MKSuggestionResult;
import com.baidu.mapapi.MKTransitRouteResult;
import com.baidu.mapapi.MKWalkingRouteResult;

public class BaiduMapLocation extends Activity {
	private TextView tv1, tv2;
	private BMapManager mapManager;
	private MKLocationManager locationManager;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tv1 = (TextView) findViewById(R.id.result1);
		tv2 = (TextView) this.findViewById(R.id.result2);

		mapManager = new BMapManager(this);
		locationManager = mapManager.getLocationManager();

		mapManager.init("53351EE4BDE7BD870F41A0B4AF1480F1CA97DAF9",
				new MyMKGeneralListener());

		locationManager.setNotifyInternal(20, 5);

		// 注册位置更新事件
		locationManager.requestLocationUpdates(new MyLocationListener());

		mapManager.start();

	}

	// 定位自己的位置,只定位一次
	class MyLocationListener implements LocationListener {

		@Override
		public void onLocationChanged(Location arg0) {

			double jingdu1 = arg0.getLatitude();
			double weidu1 = arg0.getLongitude();

			int jingdu = (int) (arg0.getLatitude() * 1000000);
			int weidu = (int) (arg0.getLongitude() * 1000000);
			tv1.setText("经度:" + jingdu1 + ",纬度:" + weidu1);
			System.out.println("经度:" + jingdu1 + ",纬度:" + weidu1);
			MKSearch search = new MKSearch();
			search.init(mapManager, new MyMKSearchListener());
			search.reverseGeocode(new GeoPoint(jingdu, weidu));
		}

	}

	class MyMKSearchListener implements MKSearchListener {

		@Override
		public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
			if (arg0 == null) {
				tv2.setText("没有获取想要的位置");
			} else {
				GeoPoint point = arg0.geoPt;
				tv2.setText("地址:" + arg0.strAddr + ",坐标:"
						+ point.getLatitudeE6() + "," + point.getLongitudeE6());
			}
		}

		@Override
		public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
			// TODO Auto-generated method stub

		}

	}

	// 常用事件监听,用来处理通常的网络错误,授权验证错误等
	class MyMKGeneralListener implements MKGeneralListener {

		@Override
		public void onGetNetworkState(int arg0) {
			if (arg0 == MKEvent.ERROR_NETWORK_CONNECT)
				Toast.makeText(BaiduMapLocation.this, "您的网络出错啦!",
						Toast.LENGTH_LONG).show();
		}

		@Override
		public void onGetPermissionState(int arg0) {

			if (arg0 == MKEvent.ERROR_PERMISSION_DENIED) {
				Toast.makeText(BaiduMapLocation.this, "API KEY 错误,请检查!",
						Toast.LENGTH_LONG).show();
			}
		}

	}

	public void onDestroy() {
		super.onDestroy();
		if (mapManager != null) {
			mapManager.destroy();

		}
	}
}



下面是Manifest.xm内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="BD.map"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <!-- 添加屏幕支持 -->
    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:resizeable="true"
         />

    <!-- 访问网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 访问精确位置的权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 访问网络状态的权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 访问WIFI网络状态的权限 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 改变WIFI网络状态的权限 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 读写存储卡的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 读取电话状态的权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".BaiduMapLocation"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

                                   欢迎光临源码下载地址..........................

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值