本人小菜,百度地图api写的很清楚了http://developer.baidu.com/map/geosdk-android-developv4.1.htm
但是还是出了点问题,现将详细的使用方法一一写下
1.申请程序的key ,地址 http://developer.baidu.com/map/geosdk-android-key.htm
2.下载 4.1版本开发包下载
3..参照将api使用方法,一步步配置 http://developer.baidu.com/map/geosdk-android-developv4.1.htm
我的AndroidManifest.xml如下
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="1" /> <!-- 这个权限用于进行网络定位 --> <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" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.test.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> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="这个地方是你申请的key,name不用改" /> </application> </manifest>
4.写一个实现BDLocationListener的类package com.example.test; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; public class MyLocationListener implements BDLocationListener { private String result_locationinfo; public String getResult_locationinfo() { return result_locationinfo; } public void setResult_locationinfo(String result_locationinfo) { this.result_locationinfo = result_locationinfo; } @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){ sb.append("\nspeed : "); sb.append(location.getSpeed()); sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){ sb.append("\naddr : "); sb.append(location.getAddrStr()); } setResult_locationinfo(sb.toString()); } @Override public void onReceivePoi(BDLocation poiLocation) { //这个方面可以不去实现,因为将在下个版本删除 } }
5.在activity中定位package com.example.test; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.LocationClientOption.LocationMode; public class MainActivity extends Activity { TextView tv = null; public LocationClient mLocationClient = null; private MyLocationListener myLocationListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().detectLeakedClosableObjects() .penaltyLog().penaltyDeath().build()); myLocationListener = new MyLocationListener(); mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类 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.registerLocationListener(myLocationListener); // 注册监听函数 tv = (TextView) findViewById(R.id.textView1); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub mLocationClient.start(); if (mLocationClient != null && mLocationClient.isStarted()) { mLocationClient.requestLocation(); tv.setText(myLocationListener.getResult_locationinfo()); } 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; } @Override public void onDestroy() { if (mLocationClient != null && mLocationClient.isStarted()) { mLocationClient.stop(); mLocationClient = null; } super.onDestroy(); } }
注意问题,由于粗心,liblocSDK4b.so文件未放到armeabi文件夹下,没法定位。
armeabi文件夹是保存c或者C++编译产生的库,通过jni调用。
运行结果