Android 百度地圖 SDK v3_3_0 (三) ---離線地圖

來源:互聯網
上載者:User

標籤:android   百度地圖   

轉寄請標明出處:http://blog.csdn.net/tanzuai/article/details/43793455

本篇部落格要實現的功能

                  先上:

                                                  

     下面我們來介紹怎麼一一實現

   1、功能介紹

           對於官方開發指南對於離線地圖的教程,提供了兩種方案:

           第一,手動匯入,先將從官網下載的離線包解壓,把vmp檔案夾拷入SD卡根目錄下的BaiduMapSDK檔案夾內。

           第二,介面下載方法如下:mOffline.start(cityid);還比較靠譜,我相信這是大家最喜歡的。


     

     2、百度地圖離線相關API介紹

a 、類 MKOfflineMap 提供地圖的下載,離線地圖列表的擷取,已下載地圖的查詢等

java.util.ArrayList<MKOLUpdateElement> getAllUpdateInfo() 返回各城市離線地圖更新資訊

java.util.ArrayList<MKOLSearchRecord> getHotCityList() 返回熱門城市列表

java.util.ArrayList<MKOLSearchRecord> getOfflineCityList() 返回支援離線地圖城市列表

MKOLUpdateElement getUpdateInfo(int cityID) 返回指定城市ID離線地圖更新資訊

java.util.ArrayList<MKOLSearchRecord> searchCity(java.lang.String cityName) 根據城市名搜尋該城市離線地圖記錄

boolean init(MKOfflineMapListener listener) 初使化

boolean pause(int cityID) 暫停下載指定城市ID的離線地圖

boolean remove(int cityID) 刪除指定城市ID的離線地圖

boolean start(int cityID) 啟動下載指定城市ID的離線地圖

void destroy()  銷毀離線地圖管理模組,不用時調用 

介面 MKOfflineMapListener 離線地圖事件通知介面。

void onGetOfflineMapState(int type, int state)


類 MKOLUpdateElement 和 類 MKOLSearchRecord

基本就是包含一些cityName , cityId, size 等等

     3.執行個體介紹

         3.1 初始化布局控制項

        /**  * 初始化布局控制項  */private void initOfflinelayout() {cidView = (TextView) findViewById(R.id.cityid);//城市idcityNameView = (EditText) findViewById(R.id.city);//城市名稱stateView = (TextView) findViewById(R.id.state);//下載狀態hotCityList = (ListView) findViewById(R.id.hotcitylist);//熱門城市allCityList = (ListView) findViewById(R.id.allcitylist);//全國城市allcity = (LinearLayout) findViewById(R.id.citylist_layout);//全國城市總布局localcity = (LinearLayout) findViewById(R.id.localmap_layout);//已下載城市布局localMapListView = (ListView) findViewById(R.id.localmaplist);//已下載城市}

        3.2 初始化離線地圖

     /**       * 初始化離線地圖       */ private void initOfflineMap() {  mOffline = new MKOfflineMap();  mOffline.init(this);// 擷取熱鬧城市  records1 = mOffline.getHotCityList();   if (records1 != null) {for (MKOLSearchRecord r : records1) {hotCities.add(r.cityName + "(" + r.cityID + ")" + "   --"+ this.formatDataSize(r.size));}    }  hAdapter = (ListAdapter) new ArrayAdapter<String>(this,     android.R.layout.simple_list_item_1, hotCities);  hotCityList.setAdapter(hAdapter);  // 擷取所有支援離線地圖的城市  allCities = new ArrayList<String>();  records2 = mOffline.getOfflineCityList();  if (records1 != null) {for (MKOLSearchRecord r : records2) {allCities.add(r.cityName + "(" + r.cityID + ")" + "   --"+ this.formatDataSize(r.size));}  }  allAdapter = (ListAdapter) new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, allCities);  allCityList.setAdapter(allAdapter);  allcity.setVisibility(View.GONE);  localcity.setVisibility(View.VISIBLE);  // 擷取已下過的離線地圖資訊  localMapList = mOffline.getAllUpdateInfo();  if (localMapList == null) {localMapList = new ArrayList<MKOLUpdateElement>();  }  ListView localMapListView = (ListView) findViewById(R.id.localmaplist);  lAdapter = new LocalMapAdapter();  localMapListView.setAdapter(lAdapter);}
     3.3.初始化監聽器

    @Override   public void onGetOfflineMapState(int type, int state) {    switch (type) {    case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: {  MKOLUpdateElement update = mOffline.getUpdateInfo(state);  // 處理下載進度更新提示  if (update != null) {stateView.setText(String.format("%s : %d%%", update.cityName,update.ratio));updateView();  }    } break;    case MKOfflineMap.TYPE_NEW_OFFLINE: // 有新離線地圖安裝 Log.d("OfflineDemo", String.format("add offlinemap num:%d", state)); break;    case MKOfflineMap.TYPE_VER_UPDATE: // 版本更新提示 // MKOLUpdateElement e = mOffline.getUpdateInfo(state); break;    }   }

         3.4配置適配器

    /** * 離線地圖管理列表適配器 */   public class LocalMapAdapter extends BaseAdapter {  @Override  public int getCount() {return localMapList.size();  }  @Override  public Object getItem(int index) {  return localMapList.get(index);  }  @Override  public long getItemId(int index) {return index;  }  @Override  public View getView(int index, View view, ViewGroup arg2) {MKOLUpdateElement e = (MKOLUpdateElement) getItem(index);view = View.inflate(OfflineActivity.this,R.layout.offline_localmap_list, null);initViewItem(view, e);return view;  }  void initViewItem(View view, final MKOLUpdateElement e) {Button display = (Button) view.findViewById(R.id.display);Button remove = (Button) view.findViewById(R.id.remove);TextView title = (TextView) view.findViewById(R.id.title);TextView update = (TextView) view.findViewById(R.id.update);TextView ratio = (TextView) view.findViewById(R.id.ratio);ratio.setText(e.ratio + "%");title.setText(e.cityName);if (e.update) {update.setText("可更新");} else {update.setText("最新");}if (e.ratio != 100) {display.setEnabled(false);} else {display.setEnabled(true);}remove.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {mOffline.remove(e.cityID);updateView();}});display.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.putExtra("x", e.geoPt.longitude);intent.putExtra("y", e.geoPt.latitude);intent.setClass(OfflineActivity.this, MainActivity.class);startActivity(intent);}});}}
          3.5下面就來實現每個功能的點擊事件

/** * 切換至城市列表 *  * @param view */public void clickCityListButton(View view) {allcity = (LinearLayout) findViewById(R.id.citylist_layout);localcity = (LinearLayout) findViewById(R.id.localmap_layout);allcity.setVisibility(View.GONE);localcity.setVisibility(View.VISIBLE);}/** * 開始下載 *  * @param view */public void start(View view) {int cityid = Integer.parseInt(cidView.getText().toString());mOffline.start(cityid);clickLocalMapListButton(null);Toast.makeText(this, "開始下載離線地圖. cityid: " + cityid, Toast.LENGTH_SHORT).show();updateView();}/** * 切換至下載管理列表 *  * @param view */public void clickLocalMapListButton(View view) {allcity = (LinearLayout) findViewById(R.id.citylist_layout);localcity = (LinearLayout) findViewById(R.id.localmap_layout);allcity.setVisibility(View.VISIBLE);localcity.setVisibility(View.GONE);}/** * 暫停下載 *  * @param view */public void stop(View view) {int cityid = Integer.parseInt(cidView.getText().toString());mOffline.pause(cityid);Toast.makeText(this, "暫停下載離線地圖. cityid: " + cityid, Toast.LENGTH_SHORT).show();updateView();}/** * 刪除離線地圖 *  * @param view */public void remove(View view) {int cityid = Integer.parseInt(cidView.getText().toString());mOffline.remove(cityid);Toast.makeText(this, "刪除離線地圖. cityid: " + cityid, Toast.LENGTH_SHORT).show();updateView();}/** * 搜尋離線需市 *  * @param view */public void search(View view) {ArrayList<MKOLSearchRecord> records = mOffline.searchCity(cityNameView.getText().toString());if (records == null || records.size() != 1)return;cidView.setText(String.valueOf(records.get(0).cityID));}/** * 從SD卡匯入離線地圖安裝包 *  * @param view */public void importFromSDCard(View view) {int num = mOffline.importOfflineData();String msg = "";if (num == 0) {msg = "沒有匯入離線包,這可能是離線包置放位置不正確,或離線包已經匯入過";} else {msg = String.format("成功匯入 %d 個離線包,可以在下載管理查看", num);}Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();updateView();}

          3.6為了給手機省電,下面我們就把該起的起,該關的關

@Overrideprotected void onPause() {int cityid = Integer.parseInt(cidView.getText().toString());MKOLUpdateElement temp = mOffline.getUpdateInfo(cityid);if (temp != null && temp.status == MKOLUpdateElement.DOWNLOADING) {mOffline.pause(cityid);}super.onPause();}@Overrideprotected void onResume() {super.onResume();}@Overrideprotected void onDestroy() {/** * 退出時,銷毀離線地圖模組 */mOffline.destroy();super.onDestroy();}

          3.7還有就是之前顯示地圖頁面要修改過來(可以參考 Android 百度地圖 SDK v3_3_0 (一) --- 基本地圖)

   Intent intent = getIntent(); if (intent.hasExtra("x") && intent.hasExtra("y")) { // 當用intent參數時,設定中心點為指定點 Bundle b = intent.getExtras(); LatLng p = new LatLng(b.getDouble("y"), b.getDouble("x")); mMapView = new MapView(this,new BaiduMapOptions().mapStatus(new MapStatus.Builder().target(p).build())); } else {mMapView = new MapView(this, new BaiduMapOptions()); }         setContentView(mMapView);

          因為在離線下載頁面改變了座標位置(可以查看上面  3.4配置適配器的代碼)

         好了!其實也是蠻簡單的!看完這篇部落格相信大家已經知道離線地圖怎麼實現了!還有更好的實現方法,大家可以到評論欄發表各自的評論!

         

         下面為源碼:

                 源碼

        

                  




Android 百度地圖 SDK v3_3_0 (三) ---離線地圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.