工程配置方法:詳見
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/buildproject
第一步:在工程app/libs目錄下放入baidumapapi_vX_X_X.jar包,在src/main/目錄下新建jniLibs目錄,工程會自動加載src目錄下的so動態庫,放入libBaiduMapSDK_vX_X_X_X.so如下圖所示,注意jar和so的前3位版本號必須一致,並且保證使用一次下載的文件夾中的兩個文件,不能不同功能組件的jar或so交叉使用。
重點來了啊*******
可以吧一下紅色代碼片直接粘上注意位置
android {
compileSdkVersion 24
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "ks.bawei.com.sun1121"
minSdkVersion 17
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDir 'libs'
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
}
so的配置也可以參考demo給出的目錄結構,如下圖所示,在app工程路徑下,新建libs,並在libs目錄下放入對應不同CPU架構的so文件。這樣工程並不會自動加載libs下的so,需在gradle編譯時,通過加入代碼: jniLibs.srcDir 'libs' 來說明so的路徑爲該libs路徑。
第二步:工程配置還需要把jar包集成到自己的工程中,如圖上圖所示,放入libs目錄下。對於每個jar文件,右鍵-選擇Add As Library,導入到工程中。對應在build.gradle生成工程所依賴的jar文件說明,如圖所示:
jar的配置也可參考eclipse方法,進行以下操作:
菜單欄選擇 File —>Project Structure。
在彈出的Project Structure 對話框中, 選擇module, 然後點擊 Dependencies 選項卡.
點擊綠色的加號選擇File dependency. 然後選擇要添加的jar包即可 完成上邊的操作後在app目錄下的build.gradle文件中,會有引入的類庫,如上圖所示。
Android studio工程配置詳細請參考官方demo。
顯示百度地圖
(1)在application中添加開發密鑰
<application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="開發者 key" /> </application>
2)添加所需權限
<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" />
第三步,在佈局xml文件中添加地圖控件;
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
第四步,在應用程序創建時初始化 SDK引用的Context 全局變量:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); } }
第五步,創建地圖Activity,管理地圖生命週期;
public class MainActivity extends Activity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理 mMapView.onPause(); } }
使用定位
一:
1:配置環境 進入Android定位SDK的開發指南中點擊配置環境
使用AndroidStutio的開發者除了上述操作外,還需要在build.gradle中配置SO文件的使用,如下所示:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
2:
設置AndroidManifest.xml
在Application標籤中聲明SERVICE組件,每個APP擁有自己單獨的定位SERVICE
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>
3:聲明使用權限
<!-- 這個權限用於進行網絡定位-->
<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>
4:
設置AcessKey
Android定位SDK4.2及之後版本需要在Mainfest.xml正確設置Accesskey(AK),如果設置錯誤將會導致定位和地理圍欄服務無法正常使用。
設置AK,在Application標籤中加入
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="AK" /> //key:開發者申請的Key
//-------------------Activity2-------------------複製一下代碼即可-------------代碼來源下載的Demo中src下的baidumapsdk下的demo下的map下的LocationDemo------------------------
package com.example.baidumap.activity;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.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.example.baidumap.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class Activity2 extends Activity{
MapView mMapView = null;
// 定位相關
LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
BaiduMap mBaiduMap;
boolean isFirstLoc = true; // 是否首次定位
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標題欄
setContentView(R.layout.activity_main);
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 開啓定位圖層
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打開gps
option.setCoorType("bd09ll"); // 設置座標類型
option.setScanSpan(1000);
mLocClient.setLocOption(option);
mLocClient.start();
}
/**
* 定位SDK監聽函數
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 銷燬後不在處理新接收的位置
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設置開發者獲取到的方向信息,順時針0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 退出時銷燬定位
mLocClient.stop();
// 關閉定位圖層
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
}
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
mMapView.onPause();
}
}
具體代碼:
public class MainActivity extends AppCompatActivity {
MapView mMapView = null;
private BaiduMap mBaiduMap;
private String path;
private Button bt;
boolean isFirstLoc = true; // 是否首次定位
// 定位相關
LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法之前實現
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
bt=(Button) findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// setResult(12,new Intent(path));
Intent inetne=new Intent(MainActivity.this,RecycleActivity.class);
startActivity(inetne);
finish();
}
});
mBaiduMap = mMapView.getMap();
////定義Maker座標點
// LatLng point = new LatLng(39.963175, 116.400244);
// //構建Marker圖標
// BitmapDescriptor bitmap = BitmapDescriptorFactory
// .fromResource(R.drawable.icon_hidden);
// //構建MarkerOption,用於在地圖上添加Marker
// OverlayOptions option1 = new MarkerOptions()
// .position(point)
// .icon(bitmap);
// //在地圖上添加Marker,並顯示
// mBaiduMap.addOverlay(option1);
//定位
// 開啓定位圖層
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setIsNeedAddress(true);//設置獲得地址位置
option.setIsNeedLocationPoiList(true);//設置獲得poi
option.setOpenGps(true); // 打開gps
option.setCoorType("bd09ll"); // 設置座標類型
option.setScanSpan(1000);
mLocClient.setLocOption(option);
mLocClient.start();
}
/**
* 定位SDK監聽函數
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
String str = "定位的信息:"+location.getAddress().address+",緯度:"
+location.getLatitude();
Toast.makeText(MainActivity.this,",緯度:"+location.getLatitude()+"經度"+location.getLongitude(),Toast.LENGTH_LONG).show();
bt.setText(location.getAddress().address);
List l = location.getPoiList();
str += ",poi數量:"+l.size()+",第一個:"+((Poi)(l.get(0))).getName();
path=location.getAddress().address;
Log.i("TAG", str);
// map view 銷燬後不在處理新接收的位置
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設置開發者獲取到的方向信息,順時針0-360
.direction(5).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
mMapView.onPause();
}
}