編輯:關於Android編程
1. 獲取密鑰
通過開放平台進行應用注冊獲取百度提供的appkey值,這個值用於進行定位時的認證。選擇android端app勾選所有權限進行app的注冊。注冊成功後會得到相應的appkey值。
2.環境配置<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjxiciAvPg0Kz8LU2DxhIGhyZWY9"http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download">定位sdk文件後,將下載後的文件解壓到工程libs目錄下。在工程配置文件的application標簽下進行各類權限以及定位service的聲明,並通過申請的appkey值進行accesskey的設置。
//key:開發者申請的key
3.獲取位置
配置好環境後即可通過java代碼進行位置的獲取。
在主線程中對LocationClient進行聲明。
public LocationClient mLocationClient = null; public BDLocationListener myListener = new MyLocationListener(); public void onCreate() { mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類 mLocationClient.registerLocationListener( myListener ); //注冊監聽函數 }
根據需要配置相關的定位參數。
private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setLocationMode(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); }
實現監聽定位的接口,在接口中通過BDLocation實體對象進行定位消息的獲取與相應處理。
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號和大體定位時間到[email protected],會有人追查原因"); } 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());// 位置語義化信息 Listlist = 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()); } }
接口示例:
http://api.map.baidu.com/telematics/v3/weather?location=%E5%8C%97%E4%BA%AC&output=json&ak=E4805d16520de693a3fe707cdc962045
這裡的location為城市地址或經緯度,output參數為輸出內容的格式,ak為平台分配的appkey,但是申請的移動端appkey在這裡不適用,可以再申請一個浏覽器端應用,使用浏覽器端appkey進行接口的訪問。獲取接口後進行相關解析得到實體對象存入集合並返回。
進入應用後首先彈出進度框,與此同時進行數據的獲取,並將數據通過listView與adapter配合進行顯示,當數據加載完畢後,對話框消失。
/** * 獲取數據並顯示前顯示一個進度框 */ private void initDialog() { mDialog = new ProgressDialog(this, ProgressDialog.THEME_HOLO_LIGHT); mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mDialog.setTitle("請稍後"); mDialog.setMessage("正在獲取天氣數據"); mDialog.show(); }
生成對話框時開啟定位,在定位監聽器中的方法內獲取當地位置信息並通過handler進行消息的發送與處理。
@Override public void onReceiveLocation(BDLocation location) { // Log.i("czl", sb.toString()); // 當區為null時顯示市 String district = location.getDistrict(); if (null == district || "null".equals(district)) { tvToday.setText(location.getCity() + " "); } else { tvToday.setText(district + " "); } String param = location.getLongitude() + "," + location.getLatitude(); Log.i("czl", param); Message msg = Message.obtain(); msg.obj = param; if (isNetworkConnected()) { mHandler.sendMessage(msg); } else { Toast.makeText(MainActivity.this, "請檢查網絡連接", 1).show(); mLocationClient.stop(); mDialog.dismiss(); } }
在handler中進行數據的獲取與顯示。
public void handleMessage(android.os.Message msg) { mLocationClient.stop(); String param = (String) msg.obj; mUtil.getWeatherData(param, new VolleyCallBack() { @Override public void onSuccess(Listres) { mWeather.clear(); tvToday.append(res.get(0).getDate()); mWeather.addAll(res); listView.setAdapter(mAdapter); chooseBackground(res.get(0).getWeather()); mDialog.dismiss(); Log.i("czl", res.toString()); } }); };
新建工具類對相關數據進行處理與返回,在Volley的onResponse方法中通過接口回調返回數據。
/** * 獲得DayWeather的集合 */ public ListgetWeatherList(String res) throws JSONException { List list = new ArrayList (); // Log.i("czl", res); JSONObject object = new JSONObject(res); JSONArray results = object.getJSONArray("results"); JSONObject result = results.getJSONObject(0); String pm25 = result.getString("pm25"); JSONArray weathers = result.getJSONArray("weather_data"); Gson gson = new Gson(); for (int i = 0; i < weathers.length(); i++) { list.add(gson.fromJson(weathers.get(i).toString(), DayWeather.class)); } list.get(0).setPm25(pm25); return list; }
/** * 請求數據 * 通過增加接口的參數,可以在調用方法時,獲取返回值。 */ public void getWeatherData(String name, final VolleyCallBack mCallBack) { StringRequest mRequest = new StringRequest(getWeatherUrl(name), new Listener() { @Override public void onResponse(String result) { try { mCallBack.onSuccess(getWeatherList(result)); } catch (JSONException e) { e.printStackTrace(); } } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError arg0) { Toast.makeText(context, "獲取天氣數據異常", 1).show(); } }); mQueue.add(mRequest); }
// 獲取接口地址 public static String getWeatherUrl(String param) { String url = null; url = "http://api.map.baidu.com/telematics/v3/weather?location=" + param + "&output=json&ak=" + APPKEY; return url; }
在ListView中顯示兩種布局可以參考上一篇文章。
這裡使用的橫向ListView是復制網上的那個HorizentalListView。
最終的實現結果如下。
由於框架開發更新頻繁的原因一直都沒有時間寫出框架的基本架構讓大家雲裡霧裡的,現在框架已基本穩定和完善,我就抽出時間寫寫關於apkplug框架的基本架構和原理,同時也跟大家
monkeyrunner腳本錄制1.在窗口輸入 monkeyrunner monkey_recorder.py 調用錄制腳本工具2.在窗口輸入 monkeyr
和MVC框架模式一樣,Model模型處理數據代碼不變在Android的App開發中,很多人經常會頭疼於App的架構如何設計:我的App需要應用這些設計架構嗎?MVC,MV
Swift 中的錯誤處理從 O-C 沿襲而來,但 Swift 1.0 之後逐漸發生了巨大改變。重要的改變發生在 Swift 2,它率先使用了“處理非異常的狀態