package com.example.mylocation;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.BDNotifyListener;//假如用到位置提醒功能,需要import该类
//如果使用地理围栏功能,需要import如下类
import com.baidu.location.BDGeofence;
import com.baidu.location.BDLocationStatusCodes;
import com.baidu.location.GeofenceClient;
import com.baidu.location.GeofenceClient.OnAddBDGeofencesResultListener;
import com.baidu.location.GeofenceClient.OnGeofenceTriggerListener;
import com.baidu.location.GeofenceClient.OnRemoveBDGeofencesResultListener;
import com.baidu.location.LocationClientOption.LocationMode;
/**
*
* 类名称:MainActivity
* 类描述: 使用百度地图组件查询当前应用使用者地理位置,注意,每个应用对应1个key
* 同时,首次使用定位,类中定义的时间是每3秒扫描一次,如果防止第一次没有定位成功,
* 需要把mLocationClient.start()的位置提前,同时注意需要手动关闭以节省资源
* 创建人:zhanglin
* 创建时间:2014-6-11 上午9:44:58
* 修改人:zhanglin
* 修改时间:2014-6-11 上午9:44:58
* 修改备注:
* @version
*
*/
public class MainActivity extends Activity
{
TextView textView;
Button button;
final static String TAG = "MyLocation";
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLocationClient = new LocationClient(MainActivity.this); // 声明LocationClient类
mLocationClient.registerLocationListener(myListener); // 注册监听函数
textView = (TextView) findViewById(R.id.textView);
button = (Button) findViewById(R.id.button);
if (!isConnect(MainActivity.this))
{
Toast.makeText(MainActivity.this, "网络连接未开启", Toast.LENGTH_SHORT)
.show();
}
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Battery_Saving);// 设置定位模式
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);// 设置扫描间隔,单位是毫秒为5000ms
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
mLocationClient.setLocOption(option);
mLocationClient.start();
Log.e(TAG, "mLocationClient = " + mLocationClient + " mLocationClient.isStarted() =" + mLocationClient.isStarted());
if (mLocationClient != null && mLocationClient.isStarted())
{
// 请求定位,异步返回,结果在locationListener中获取.
mLocationClient.requestLocation();
}
else
{
Log.d("LocSDK3", "locClient is null or not started");
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// 判断网络连接
public static boolean isConnect(Context context)
{
// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)
try
{
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
{
// 获取网络连接管理的对象
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (info != null && info.isConnected())
{
// 判断当前网络是否已经连接
if (info.getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
}
}
catch (Exception e)
{
Log.v("error", e.toString());
}
return false;
}
public void logMsg(String str) {
textView.setText(str);
}
/**
* 创建位置监听器
* 类名称:MyLocationListener
* 类描述: 这个类可以参考百度api 中com.baidu.location包下的BDLocation类 地址http://developer.baidu.com/map/loc_refer/index.html
*/
public class MyLocationListener implements BDLocationListener
{
// 接收异步返回的定位结果,参数是BDLocation类型参数
@Override
public void onReceiveLocation(BDLocation location)
{
if (location == null)
return;
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation)//定位结果描述:GPS定位结果
{
sb.append("\nspeed : ");
sb.append(location.getSpeed());
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
}
else if (location.getLocType() == BDLocation.TypeNetWorkLocation)//定位结果描述:网络定位结果
{
sb.append("\nprovince : ");
sb.append(location.getProvince());
sb.append("\ncity : ");
sb.append(location.getCity());
sb.append("\naddr : ");
sb.append(location.getAddrStr());
}
logMsg(sb.toString());
}
// 接收异步返回的POI查询结果,参数是BDLocation类型参数
@Override
public void onReceivePoi(BDLocation poiLocation)
{
if (poiLocation == null)
{
return;
}
StringBuffer sb = new StringBuffer(256);
sb.append("Poi time : ");
sb.append(poiLocation.getTime());
sb.append("\nerror code : ");
sb.append(poiLocation.getLocType());
sb.append("\nlatitude : ");
sb.append(poiLocation.getLatitude());
sb.append("\nlontitude : ");
sb.append(poiLocation.getLongitude());
sb.append("\nradius : ");
sb.append(poiLocation.getRadius());
if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation)
{
sb.append("\naddr : ");
sb.append(poiLocation.getAddrStr());
}
if (poiLocation.hasPoi())
{
sb.append("\nPoi:");
sb.append(poiLocation.getPoi());
}
else
{
sb.append("noPoi information");
}
logMsg(sb.toString());
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mylocation"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<!-- 允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS" >
</uses-permission>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
<activity
android:name="com.example.mylocation.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="B22d0cf58a3a73a414142d213a48ea68"/>
</application>
</manifest>