Android百度基礎地圖的集成、定位

工程配置方法:詳見

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')
    }
}


Androidstudio1.png

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

Androidstudio2.png

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

Androidstudio3.png

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

}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章