安卓學習-百度地圖

image

image

image

image

Android Studio工程配置方法

第一步:在工程app/libs目錄下放入baidumapapi_vX_X_X.jar包,在src/main/目錄下新建jniLibs目錄,工程會自動加載src目錄下的so動態庫,放入libBaiduMapSDK_vX_X_X_X.so以下圖所示,注意jar和so的前3位版本號必須一致,而且保證使用一次下載的文件夾中的兩個文件,不能不一樣功能組件的jar或so交叉使用。 java

Androidstudio1.png

so的配置也能夠參考demo給出的目錄結構,以下圖所示,在app工程路徑下,新建libs,並在libs目錄下放入對應不一樣CPU架構的so文件。這樣工程並不會自動加載libs下的so,需在gradle編譯時,經過加入代碼: jniLibs.srcDir 'libs' 來講明so的路徑爲該libs路徑。 android

Androidstudio2.png

第二步:工程配置還須要把jar包集成到本身的工程中,如圖上圖所示,放入libs目錄下。對於每一個jar文件,右鍵-選擇Add As Library,導入到工程中。對應在build.gradle生成工程所依賴的jar文件說明,如圖所示: git

Androidstudio3.png

jar的配置也可參考eclipse方法,進行如下操做: api

菜單欄選擇 File —>Project Structure。 網絡

在彈出的Project Structure 對話框中, 選擇module, 而後點擊 Dependencies 選項卡. 架構

點擊綠色的加號選擇File dependency. 而後選擇要添加的jar包便可 完成上邊的操做後在app目錄下的build.gradle文件中,會有引入的類庫,如上圖所示。 app

應用混淆

集成地圖SDK的應用,在打包混淆的時候,須要注意與地圖SDK相關的方法不可被混淆。混淆方法以下:框架

-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}    
-dontwarn com.baidu.**

保證百度類不能被混淆,不然會出現網絡不可用等運行時異常 eclipse

Hello BaiduMapAndroid SDK 異步

開發工具

Android開發工具備不少。在此,咱們推薦開發者使用Eclipse做爲本身的開發工具,本套開發指南也是針對Eclipse開發環境下進行編寫的。

顯示百度地圖

百度地圖SDK爲開發者提供了便捷的顯示百度地圖數據的接口,經過如下幾步操做,便可在您的應用中使用百度地圖數據:

第一步:建立並配置工程(具體方法參見工程配置部分的介紹);

第二步:在AndroidManifest中添加開發密鑰、所需權限等信息;

(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);  
    }  
}

注意:在SDK各功能組件使用以前都須要調用

SDKInitializer.initialize(getApplicationContext());,所以咱們建議該方法放在Application的初始化方法中

第五步,建立地圖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();  
        }  
    }

完成以上步驟後,運行程序,便可在您的應用中顯示以下地圖:

android_dev2.jpg

以上的例子爲你們介紹瞭如何構建一個基礎的地圖頁面。地圖控件自v2.3.5版本起,支持多實例,即開發者能夠在一個頁面中創建多個地圖對象,而且針對這些對象分別操做且不會產生相互干擾。具體使用方法請參考MutiMapViewDemo中的相關介紹。

此外,自v2.3.5版本開始。MapView控件還增長了對Fragment框架的支持。用戶可使用SupportMapFragment控件完成相應框架內的開發工做(詳見MapFragmentDemo)。

image

image

image

image

imageimage

image

imageimageimage

image

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.baidumap">


<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

<!-- 這個權限用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 這個權限用於訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 獲取運營商信息,用於支持提供運營商信息相關的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 用於讀取手機當前的狀態-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 訪問網絡,網絡定位須要上網-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取權限,用戶寫入離線定位數據-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="onOhaXWOvV7RnacLgLTAbiEX1QrPpMtl" />

<activity android:name=".MainActivity">
<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>

</application>

</manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.baidumap.MainActivity">

<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/button_poi" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="poi檢索"
android:onClick="poiClick"
android:id="@+id/button_poi"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="個人位置"
android:onClick="mylocationClick"
android:id="@+id/mylocation"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button_poi"
android:layout_toEndOf="@+id/button_poi" />

</RelativeLayout>

MainActivity.java

package com.example.administrator.baidumap;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.Poi;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.search.core.PoiInfo;import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;import com.baidu.mapapi.search.poi.PoiCitySearchOption;import com.baidu.mapapi.search.poi.PoiDetailResult;import com.baidu.mapapi.search.poi.PoiResult;import com.baidu.mapapi.search.poi.PoiSearch;import java.util.List;public class MainActivity extends AppCompatActivity {    MapView mMapView = null;    private BaiduMap baiduMap;    private PoiSearch poiSearch;    public LocationClient mLocationClient = null;    public BDLocationListener myListener = new MyLocationListener();    @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);        baiduMap = mMapView.getMap();        baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//設置爲普通地圖        //衛星地圖        //  baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);        baiduMap.setTrafficEnabled(true);//實時交通圖        mLocationClient = new LocationClient(getApplicationContext());//聲明LocationClient類        mLocationClient.registerLocationListener( myListener );    //註冊位置監聽函數        //添加一個標註覆蓋物        LatLng latLng = new LatLng(39.963175, 116.400244);//經緯度        BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);        //建立一個圖層選項        OverlayOptions options = new MarkerOptions().position(latLng).icon(bitmapDescriptor);        //把圖層選項添加到地圖上        baiduMap.addOverlay(options);        //實例化POI檢索工具        poiSearch = PoiSearch.newInstance();        //POI檢索的結果監聽事件        OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {            @Override            public void onGetPoiResult(PoiResult poiResult) {                //獲取POI檢索結果                List<PoiInfo> poiInfos = poiResult.getAllPoi();                for (PoiInfo p : poiInfos) {                    System.out.println(p.address);                    System.out.println(p.city);                    System.out.println(p.phoneNum);                    BitmapDescriptor bd = BitmapDescriptorFactory.fromResource(R.mipmap.biapji);                    //建立一個圖層選項                    OverlayOptions options = new MarkerOptions().position(p.location).icon(bd);                    baiduMap.addOverlay(options);                }            }            @Override            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {                //獲取Place詳情頁檢索結果            }        };        //設置POI檢索監聽者        poiSearch.setOnGetPoiSearchResultListener(poiListener);    }    public void poiClick(View view) {        //發起一個檢索請求,異步的過程        poiSearch.searchInCity((new PoiCitySearchOption())                .city("北京")                .keyword("美食")                .pageNum(10));    }//請求個人位置信息    public void mylocationClick(View view)    {        initLocation();        mLocationClient.start();        mLocationClient.requestLocation();//發送請求    }    @Override    protected void onDestroy() {        super.onDestroy();        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理        mMapView.onDestroy();        poiSearch.destroy();    }    @Override    protected void onResume() {        super.onResume();        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理        mMapView.onResume();    }    @Override    protected void onPause() {        super.onPause();        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理        mMapView.onPause();    }    /*設置定位參數包括:定位模式(高精度定位模式,低功耗定位模式和僅用設備定位模式),返回座標類型,是否打開GPS,是否返回地址信息、位置語義化信息、POI信息等等。    LocationClientOption類,該類用來設置定位SDK的定位方式,e.g.:*/    private void initLocation(){        LocationClientOption option = new LocationClientOption();        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy        );//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備        option.setCoorType("bd09ll");//可選,默認gcj02,設置返回的定位結果座標系        int span=1000;        option.setScanSpan(span);//可選,默認0,即僅定位一次,設置發起定位請求的間隔須要大於等於1000ms纔是有效的        option.setIsNeedAddress(true);//可選,設置是否須要地址信息,默認不須要        option.setOpenGps(true);//可選,默認false,設置是否使用gps        option.setLocationNotify(true);//可選,默認false,設置是否當gps有效時按照1S1次頻率輸出GPS結果        option.setIsNeedLocationDescribe(true);//可選,默認false,設置是否須要位置語義化結果,能夠在BDLocation.getLocationDescribe裏獲得,結果相似於「在北京天安門附近」        option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否須要POI結果,能夠在BDLocation.getPoiList裏獲得        option.setIgnoreKillProcess(false);//可選,默認true,定位SDK內部是一個SERVICE,並放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死        option.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集        option.setEnableSimulateGps(false);//可選,默認false,設置是否須要過濾gps仿真結果,默認須要        mLocationClient.setLocOption(option);    }    //位置監聽器    public class MyLocationListener implements BDLocationListener {        @Override        public void onReceiveLocation(BDLocation location) {//接收位置信息的回調方法            //Receive Location            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());                sb.append("\nheight : ");                sb.append(location.getAltitude());// 單位:米                sb.append("\ndirection : ");                sb.append(location.getDirection());// 單位度                sb.append("\naddr : ");                sb.append(location.getAddrStr());                sb.append("\ndescribe : ");                sb.append("gps定位成功");            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 網絡定位結果                sb.append("\naddr : ");                sb.append(location.getAddrStr());                //運營商信息                sb.append("\noperationers : ");                sb.append(location.getOperators());                sb.append("\ndescribe : ");                sb.append("網絡定位成功");            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線定位結果                sb.append("\ndescribe : ");                sb.append("離線定位成功,離線定位結果也是有效的");            } else if (location.getLocType() == BDLocation.TypeServerError) {                sb.append("\ndescribe : ");                sb.append("服務端網絡定位失敗,能夠反饋IMEI號和大致定位時間到loc-bugs@baidu.com,會有人追查緣由");            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {                sb.append("\ndescribe : ");                sb.append("網絡不一樣致使定位失敗,請檢查網絡是否通暢");            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {                sb.append("\ndescribe : ");                sb.append("沒法獲取有效定位依據致使定位失敗,通常是因爲手機的緣由,處於飛行模式下通常會形成這種結果,能夠試着重啓手機");            }            sb.append("\nlocationdescribe : ");            sb.append(location.getLocationDescribe());// 位置語義化信息            List<Poi> list = location.getPoiList();// POI數據            if (list != null) {                sb.append("\npoilist size = : ");                sb.append(list.size());                for (Poi p : list) {                    sb.append("\npoi= : ");                    sb.append(p.getId() + " " + p.getName() + " " + p.getRank());                }            }            Log.i("BaiduLocationApiDem", sb.toString());            System.out.println(sb);            BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromResource(R.mipmap.biapji);            //緯度 經度            LatLng latLng=new LatLng(location.getLatitude(),location.getLongitude());            OverlayOptions options=new MarkerOptions().position(latLng).icon(bitmapDescriptor);       baiduMap.addOverlay(options);        }    }}
相關文章
相關標籤/搜索