天天看點

android 實作百度地圖app

以百度api為基礎

複制

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

要定義的變量

private BaiduMap mBaiduMap;
    private MapView mMapView;
    private LocationClient mLocationClient;
    private boolean isFirstIn = true;
           

初始化

mMapView= (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
           

各部分實作的功能

1.

//在使用SDK各元件之前初始化context資訊,傳入ApplicationContext  
        //注意該方法要再setContentView方法之前實作  
        SDKInitializer.initialize(getApplicationContext());  
           

把地圖的生命周期和activity的生命周期綁定起來

@Override
    protected void onStart() {
        super.onStart();
        mBaiduMap.setMyLocationEnabled(true);
        if(!mLocationClient.isStarted())
        mLocationClient.start();
    }
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.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();  
        }  
           

實作option點選轉換地圖模式

@Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // TODO Auto-generated method stub
            menu.add(, , , "普通地圖");
            menu.add(, , , "衛星地圖");
            menu.add(, , , "實時交通(off)");
            return super.onCreateOptionsMenu(menu);         
        }
           

設定option的點選事件

@Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case :
                //普通地圖  
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);  
                break;
            case :
                 //衛星地圖  
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
                break;
            case :             
                if(mBaiduMap.isTrafficEnabled()){
                    mBaiduMap.setTrafficEnabled(false);
                    item.setTitle("實時交通(off)");
                }else{
                    mBaiduMap.setTrafficEnabled(true);
                    item.setTitle("實時交通(on)");
                }
                break;
            }           
            return super.onOptionsItemSelected(item);       
        }
           

在地圖上添加辨別物

//定義Maker坐标點  
        LatLng point = new LatLng(, );  
        //建構Marker圖示  
        BitmapDescriptor bitmap = BitmapDescriptorFactory  
            .fromResource(R.drawable.ic_launcher);  
        //建構MarkerOption,用于在地圖上添加Marker  
        OverlayOptions option = new MarkerOptions()  
            .position(point)  
            .icon(bitmap);  
        //在地圖上添加Marker,并顯示  
        mBaiduMap.addOverlay(option);         
           

設定gps定位

要用到的類

LocationClient

BDLocationListener

(1)

MyLocationListener myLocationListener = new MyLocationListener();       
mLocationClient = new LocationClient(getApplicationContext());     //聲明LocationClient類
        mLocationClient.registerLocationListener(myLocationListener);    //注冊監聽函數  
           

(2)利用LocationClientOption 設定定位的屬性

LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);//設定定位模式
        option.setCoorType("bd09ll");//傳回的定位結果是百度經緯度,預設值gcj02
        option.setScanSpan();//設定發起定位請求的間隔時間為5000ms
        option.setIsNeedAddress(true);//傳回的定位結果包含位址資訊
        option.setNeedDeviceDirect(true);//傳回的定位結果包含手機機頭的方向
        mLocationClient.setLocOption(option);
           

(3)監聽器的實作

private class MyLocationListener implements BDLocationListener{

            @Override
            public void onReceiveLocation(BDLocation location) {
                // TODO Auto-generated method stub
                MyLocationData data = new MyLocationData.Builder()
                //設定經緯度
                .accuracy(location.getRadius())
                .latitude(location.getLatitude())
                .longitude(location.getLongitude())
                .build();
                mBaiduMap.setMyLocationData(data);
            //判斷第一次進入,定位到目前所在位置
            if(isFirstIn){
                LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
                MapStatusUpdate msu =MapStatusUpdateFactory.newLatLng(latLng);
                mBaiduMap.animateMapStatus(msu);
                Toast.makeText(getApplicationContext(), location.getAddrStr(),).show();
                isFirstIn = false;
            }           
            }  
        }
           

所要加的權限

<!-- 這個權限用于進行網絡定位-->
<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>
<!--允許應用讀取低級别的系統日志檔案 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
    <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.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_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.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
           

所要在application聲明的

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="OSzBVaOV08hT2o7yNBIq4NFS" />
        <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
    </service>