心情:临近年末还要在这瞎折腾。
系统:macmini 10.11.4
一:首先注册 http://lbsyun.baidu.com/apiconsole/key
这个按照对应的填上即可
注意:发布版的SHA1是要你的密钥的SHA1,开发者的SHA1获取方法:在android studio中
Terminal中输入:keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 可以看到SHA1.
提交就可以获取到AK(appkey了)。
二:下载sdk
http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download
选中自己所需的功能下载。
下载回来中的libs文件夹,把其中的文件拷贝到自己对应的项目文件夹中。jniLibs和libs下.在build.gradle中添加:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
三:使用
配置权限,AK等。
<!--百度地图所需权限--><uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.GET_TASKS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_SETTINGS" />
appkey,服务:
<!--百度定位服务--><service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > <intent-filter> <action android:name="com.baidu.location.service_v2.2" > </action> </intent-filter></service><meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="你申请到的AK"/>
在application中配置:
//百度地图sdk配置SDKInitializer.initialize(getApplicationContext());
定位和地图显示:
package ;
//**************************************************************************************************////////////////////////////////////////定位代理和显示地图//////////////////////////////////////////////**************************************************************************************************
import java.sql.Time;
import java.util.ArrayList;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import java.util.Map;
import java.util.Timer;
import java.util.HashMap;
import java.util.TimerTask;
import android.os.Handler;
import android.widget.Button;
import android.widget.TextView;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
//**************************************************************************************************//////////////////////////////////////////定位返回/////////////////////////////////////////////////////**************************************************************************************************
interface BLocation {
public void BLocation(int Info,CPlace Data);
}
//**************************************************************************************************////////////////////////////////////////定位代理和显示地图//////////////////////////////////////////////**************************************************************************************************
class CLocation {
//定位代理状态 public int LM_NUL=0;//空
public int LM_STR=1;//开始
public int LM_END=2;//结束
public int LM_BRK=3;//失败
public int nManaStat=0; //北京
public double nOffLat=39.915352;
public double nOffLon=116.397105;
//定位代理视图
public MapView mMapMana=null;
//地图显示视图
public MapView mMapView=null;
public BaiduMap mBaiduMap;
public BLocation mBLocation=null;
public Context mContext=null; //百度定位
private final String TAG = "CMainView";
private LocationClient mLocationClient;
private BDLocationListener mBDLocationListener;
//请求定位信息(闭包)//////////////////////////////////////////////////////////////////////////////
public void fAskPlace(BLocation AskBack){ /*mLocList.add(AskBack);
if (mLocList.size()==1){fLocation();}*/ }
//复原////////////////////////////////////////////////////////////////////////////////////////// public void fRemove(){
if(mMapMana != null)
{
FV.RemoveView(mMapMana,DCR.CLEAR);
mMapMana = null;
}
}
/** 获得所在位置经纬度及详细地址 */
public void fGetLocation(BLocation Bk){
// 声明LocationClient类
// 注册监听
mLocationClient = new LocationClient(CApplication.getContext()); mBDLocationListener = new CBDLocationListener(); mLocationClient.registerLocationListener(mBDLocationListener); mBLocation=Bk;
// 声明定位参数
LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
// 设置定位模式 高精度
option.setCoorType("bd09ll");// 设置返回定位结果是百度经纬度 默认gcj02//
option.setScanSpan(5000);// 设置发起定位请求的时间间隔 单位ms默认定位一次
option.setOpenGps(true);
option.setIsNeedAddress(true);// 设置定位结果包含地址信息 mLocationClient.setLocOption(option); // 设置定位参数 mLocationClient.start();// 启动定位
}
//百度定位监听
private class CBDLocationListener implements BDLocationListener { @Override
public void onReceiveLocation(BDLocation location) {
// 非空判断
if (location != null) {
// 根据BDLocation 对象获得经纬度以及详细地址信息 double latitude = location.getLatitude();
double longitude = location.getLongitude();
String address = location.getAddrStr();
//address 福建省福州市鼓楼区
System.out.println(TAG+ "address:" + address + " latitude:" + latitude + " longitude:" + longitude + "---"); if (mLocationClient.isStarted()){
// 获得位置之后停止定位
mLocationClient.stop();
}
//获取成功回调
if (address!=""){fLocationBack(longitude,latitude,address);}//有的手机权限没打开,GPS没打开等addres会等于空
else{//不成功返回北京 fLocationBack(nOffLon,nOffLat,address);
} }else{
//不成功返回北京
fLocationBack(nOffLon,nOffLat,"");
}
}
} //取消定位监听
public void fDestroy(){
// 取消监听函数
if (mLocationClient != null) { mLocationClient.unRegisterLocationListener(mBDLocationListener); }
} //显示定位数据//////////////////////////////////////////////////////////////////////////////////// public CLocation(
ViewGroup Vw,int Px,int Py,int Wd,int Hg,BLocation Bk){ mBLocation=Bk;fCreatMap(Vw,Px,Py,Wd,Hg);//
fLocation();
fGetLocation(Bk);
} //在指定视图上显示地图/////////////////////////////////////////////////////////////////////////////
public CLocation(ViewGroup Vw,int Px,int Py,int Wd,int Hg,double Lt,double Ln){ fCreatMap(Vw,Px,Py,Wd,Hg);fShow(Lt,Ln);
}
//在指定视图上显示地图/////////////////////////////////////////////////////////////////////////////
public void fCreatMap(ViewGroup View,int PX,int PY,int WD,int HG){ mMapView = new MapView(CMainView.mActivity); mMapView.setY(PY);mMapView.setX(PX); mMapView.setLayoutParams(new ViewGroup.LayoutParams(WD,HG)); View.addView(mMapView);
mBaiduMap = mMapView.getMap(); mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
} //在指定视图上显示地图/////////////////////////////////////////////////////////////////////////////
public void fShow(double Lat,double Lon){
//定义Maker坐标点
if (Lat==0.0){Lat=nOffLat;Lon=nOffLon;}
LatLng point = new LatLng(Lat, Lon); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.locaton);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions().position(point).icon(bitmap); //在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
MapStatus.Builder builder = new MapStatus.Builder(); builder.target(point).zoom(12.0f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
} //取得定位数据//////////////////////////////////////////////////////////////////////////////////// //弃用此原生获取定位信息,因为此方法无法获取地址信息,改用百度地图定位可以获取到未知的详细信息fGetLocation public void fLocation(){ /*mContext=CApplication.getContext(); nManaStat=LM_STR; // 注册广播 IntentFilter filter = new IntentFilter(); filter.addAction(CPlace.ACTION); mContext.registerReceiver(new LocationBroadcastReceiver(), filter);
// 启动服务 Intent intent = new Intent(); intent.setClass(mContext,locationsv.class); mContext.startService(intent);
//20秒后检查是否代理成功 new Handler(mContext.getMainLooper()).postDelayed(new Runnable() { public void run() { fIsLocation(); } }, 20000);*/ } //检查是否代理成功(不成功则用北京)////////////////////////////////////////////////////////////////// /* public void fIsLocation() { //System.out.println("检查是否代理成功-------fIsLocation"); if (nManaStat == LM_STR) { nManaStat = LM_BRK; //System.out.println("不成功的返回"); fLocationBack(nOffLon, nOffLat);}//北京 }*/ //地图定位代理返回//////////////////////////////////////////////////////////////////////////////// /*
private class LocationBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String Lon="",Lat=""; //System.out.println("地图定位代理返回-------LocationBroadcastReceiver"); if (intent.getAction().equals(CPlace.ACTION) && nManaStat != LM_BRK) { Lon = intent.getStringExtra(CPlace.LOCATL); Lat = intent.getStringExtra(CPlace.LOCATR); //System.out.println("成功的返回"+Lon+Lat); } nManaStat=LM_END; mContext.unregisterReceiver(this);// 不需要时注销 fLocationBack(EST.ToDouble(Lon),EST.ToDouble(Lat)); } }*/ //地图定位代理返回设置///////////////////////////////////////////////////////////////////////////// //增加一个详细地址返回
public void fLocationBack(double Lon,double Lat,String address){ //System.out.println("地图定位代理返回设置------fLocationBack---------------size="+mLocList.size());
if (mMapView != null){
fShow(Lat,Lon);//
fShow(nOffLat,nOffLon);//模拟数据
}
if (mBLocation != null) {
CPlace Plc = new CPlace();
Plc.Lon = Lon;Plc.Lat = Lat;
Plc.AskTime = DAT.GetNowTime();
Plc.address=address; //获取的详细地址 mBLocation.BLocation(LM_END,Plc);
} }}//******************************************End*****************************************************