Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 百度定位與車聯網API實現天氣預報

百度定位與車聯網API實現天氣預報

編輯:關於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());// 位置語義化信息
                List 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());
        }
}

百度車聯網API天氣預報接口的使用

接口示例:
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(List res) {
                    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 List getWeatherList(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。
最終的實現結果如下。
這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved