国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

關于開發百度地圖的定位以及導航的代碼記錄

2019-11-09 15:24:26
字體:
來源:轉載
供稿:網友

因為年前的工作中用到了百度地圖的定位 導航功能,然后又去翻閱了百度sdk相關的api后進行開發,現在對其進行一些整理,方便后面遇到相關開發時使用。

開發之前,先進行準備工作,在百度地圖的開發者網站上下載相關的sdk,導入AS中的libs文件中,然后創建jniLibs的文件夾,將其相關的文件復制進去后,引用即可,然后申請百度地圖相關的key秘鑰,導入相關的權限,根據百度官方的流程進行即可。

首先先在xml文件中引入百度的圖view

<RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.l.mapdemo.MainActivity">    <com.baidu.mapapi.map.MapView        android:id="@+id/mv"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:clickable="true" /></RelativeLayout>其進行開發之前 必須先初始化sdk的個組件,如果是多次引用的話,也可以將其抽取成base類進行使用

//在使用SDK各組件之前初始化context信息,傳入applicationContext        //注意該方法要再setContentView方法之前實現        SDKInitializer.initialize(getApplicationContext());        setContentView(R.layout.activity_main);

將百度地圖生命周期與activity的進行綁定

 @Override    PRotected void onDestroy() {        super.onDestroy();        mMapView.onDestroy();    }    @Override    protected void onResume() {        super.onResume();        mMapView.onResume();    }    @Override    protected void onPause() {        super.onPause();        mMapView.onPause();    }    @Override    protected void onStart() {        super.onStart();        mBaiduMap.setMyLocationEnabled(true);        if (!mLocationClient.isStarted()) {            mLocationClient.start();        }    }    @Override    protected void onStop() {        super.onStop();        mLocationClient.stop();    }

首先進行定位的開發

定位相關的公共類

//定位相關    private LocationClient mLocationClient = null;    private boolean isFristLocation = true;根據百度sdk提供的官方文檔可以看到 其定位相關的類如下

private void initLocation() {        mLocationClient = new LocationClient(getApplicationContext());     //聲明LocationClient類        initLocationOps();        //注冊監聽函數        mLocationClient.registerLocationListener(new BDLocationListener() {            @Override            public void onReceiveLocation(BDLocation location) {                //mapview 銷毀后不再處理新的接收位置                if (location == null || mMapView == null)                    return;                //構造定位數據                MyLocationData locData = new MyLocationData.Builder()                        .accuracy(location.getRadius())                        //此處設置開發者獲取到的方向信息                        .latitude(location.getLatitude())                        .longitude(location.getLongitude()).build();                //設置定位數據                mBaiduMap.setMyLocationData(locData);                //第一次定位時,將地圖位置移動到當前位置                LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());                mLastLocationData = ll;                if (isFristLocation) {                    isFristLocation = false;                    MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);                    mBaiduMap.animateMapStatus(u);                }            }        });    }
private void initLocationOps() {        LocationClientOption option = new LocationClientOption();        option.setLocationMode(LocationClientOption.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有效時按照1S/1次頻率輸出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);    }定位相關基本完成。

導航相關代碼:在百度提供的官方demo中找到BNDemoGuideActivity類,這是導航相關的類,將其復制進自己的工程,改掉一些報紅的類即可

然后在自己的MainnActivity中百度提供的Demo中的

 private MapView mMapView;    private BaiduMap mBaiduMap;    private Button mBtmine;    private String mSDCardPath = null;    private static final String APP_FOLDER_NAME = "BNSDKSimpleDemo";    private final static String authBaseArr[] =            {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.access_FINE_LOCATION};    private final static String authComArr[] = {Manifest.permission.READ_PHONE_STATE};    private final static int authBaseRequestCode = 1;    private final static int authComRequestCode = 2;    private boolean hasInitSuccess = false;    private boolean hasRequestComAuth = false;    public static final String ROUTE_PLAN_NODE = "routePlanNode";    public static List<Activity> activityList = new LinkedList<Activity>();    public static final String RESET_END_NODE = "resetEndNode";
 //更新地圖的設置        mBaiduMap = mMapView.getMap();        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(18.0f);        mBaiduMap.setMapStatus(msu);if (initDirs()) {            initNavi();        }
private boolean initDirs() {        mSDCardPath = getSdcardDir();        if (mSDCardPath == null) {            return false;        }        File f = new File(mSDCardPath, APP_FOLDER_NAME);        if (!f.exists()) {            try {                f.mkdir();            } catch (Exception e) {                e.printStackTrace();                return false;            }        }        return true;    }    String authinfo = null;    /**     * 內部TTS播報狀態回傳handler     */    private Handler ttsHandler = new Handler() {        public void handleMessage(Message msg) {            int type = msg.what;            switch (type) {                case BaiduNaviManager.TTSPlayMsgType.PLAY_START_MSG: {                    // showToastMsg("Handler : TTS play start");                    break;                }                case BaiduNaviManager.TTSPlayMsgType.PLAY_END_MSG: {                    // showToastMsg("Handler : TTS play end");                    break;                }                default:                    break;            }        }    };    /**     * 內部TTS播報狀態回調接口     */    private BaiduNaviManager.TTSPlayStateListener ttsPlayStateListener = new BaiduNaviManager.TTSPlayStateListener() {        @Override        public void playEnd() {            // showToastMsg("TTSPlayStateListener : TTS play end");        }        @Override        public void playStart() {            // showToastMsg("TTSPlayStateListener : TTS play start");        }    };    public void showToastMsg(final String msg) {        MainActivity.this.runOnUiThread(new Runnable() {            @Override            public void run() {                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();            }        });    }    private boolean hasBasePhoneAuth() {        // TODO Auto-generated method stub        PackageManager pm = this.getPackageManager();        for (String auth : authBaseArr) {            if (pm.checkPermission(auth, this.getPackageName()) != PackageManager.PERMISSION_GRANTED) {                return false;            }        }        return true;    }    private boolean hasCompletePhoneAuth() {        // TODO Auto-generated method stub        PackageManager pm = this.getPackageManager();        for (String auth : authComArr) {            if (pm.checkPermission(auth, this.getPackageName()) != PackageManager.PERMISSION_GRANTED) {                return false;            }        }        return true;    }    private void initNavi() {        BNOuterTTSPlayerCallback ttsCallback = null;        // 申請權限        if (android.os.Build.VERSION.SDK_INT >= 23) {            if (!hasBasePhoneAuth()) {                this.requestPermissions(authBaseArr, authBaseRequestCode);                return;            }        }        BaiduNaviManager.getInstance().init(this, mSDCardPath, APP_FOLDER_NAME, new BaiduNaviManager.NaviInitListener() {            @Override            public void onAuthResult(int status, String msg) {                if (0 == status) {                    authinfo = "key校驗成功!";                } else {                    authinfo = "key校驗失敗, " + msg;                }                MainActivity.this.runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Toast.makeText(MainActivity.this, authinfo, Toast.LENGTH_LONG).show();                    }                });            }            public void initSuccess() {                Toast.makeText(MainActivity.this, "百度導航引擎初始化成功", Toast.LENGTH_SHORT).show();                hasInitSuccess = true;                initSetting();            }            public void initStart() {                Toast.makeText(MainActivity.this, "百度導航引擎初始化開始", Toast.LENGTH_SHORT).show();            }            public void initFailed() {                Toast.makeText(MainActivity.this, "百度導航引擎初始化失敗", Toast.LENGTH_SHORT).show();            }        }, null, ttsHandler, ttsPlayStateListener);    }    private void initSetting() {        // BNaviSettingManager.setDayNightMode(BNaviSettingManager.DayNightMode.DAY_NIGHT_MODE_DAY);        BNaviSettingManager                .setShowTotalRoadConditionBar(BNaviSettingManager.PreViewRoadCondition.ROAD_CONDITION_BAR_SHOW_ON);        BNaviSettingManager.setVoiceMode(BNaviSettingManager.VoiceMode.Veteran);        // BNaviSettingManager.setPowerSaveMode(BNaviSettingManager.PowerSaveMode.DISABLE_MODE);        BNaviSettingManager.setRealRoadCondition(BNaviSettingManager.RealRoadCondition.NAVI_ITS_ON);    }    private String getSdcardDir() {        if (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {            return Environment.getExternalStorageDirectory().toString();        }        return null;    }    private void addDestInfoOverlay(LatLng latLng) {        mBaiduMap.clear();        OverlayOptions options = new MarkerOptions().position(latLng)                .icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo))                .zIndex(5);        mBaiduMap.addOverlay(options);    }設置目的地以及導航相關的方法
 @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == 66) {            String result = data.getExtras().getString("result");//得到新Activity 關閉后返回的數據            jd = Double.parseDouble(result);            String result2 = data.getExtras().getString("result2");            wd = Double.parseDouble(result2);            LatLng latLng = new LatLng(wd, jd);            mDestLocationData = latLng;            addDestInfoOverlay(latLng);            Toast.makeText(MainActivity.this, "設置目的地成功", Toast.LENGTH_SHORT).show();        } else if (resultCode == 33) {            String result3 = data.getExtras().getString("result");            Toast.makeText(this, "點擊取消", Toast.LENGTH_SHORT).show();        }    }    private void routeplanToNavi(boolean mock) {        BNRoutePlanNode.CoordinateType coType = BNRoutePlanNode.CoordinateType.GCJ02;        if (!hasInitSuccess) {            Toast.makeText(MainActivity.this, "還未初始化!", Toast.LENGTH_SHORT).show();        }        // 權限申請        if (android.os.Build.VERSION.SDK_INT >= 23) {            // 保證導航功能完備            if (!hasCompletePhoneAuth()) {                if (!hasRequestComAuth) {                    hasRequestComAuth = true;                    this.requestPermissions(authComArr, authComRequestCode);                    return;                } else {                    Toast.makeText(MainActivity.this, "沒有完備的權限!", Toast.LENGTH_SHORT).show();                }            }        }        BNRoutePlanNode sNode = null;        BNRoutePlanNode eNode = null;        coType = BNRoutePlanNode.CoordinateType.BD09LL;        //mLastLocationData        //mDestLocationData//                sNode = new BNRoutePlanNode(116.30142, 40.05087, "百度大廈", null, coType);//                eNode = new BNRoutePlanNode(116.39750, 39.90882, "北京天安門", null, coType);        sNode = new BNRoutePlanNode(mLastLocationData.longitude, mLastLocationData.latitude, "我的位置", null, coType);        eNode = new BNRoutePlanNode(jd, wd, "目標地點", null, coType);//        Toast.makeText(this, "目標地點確定", Toast.LENGTH_SHORT).show();        eNode = new BNRoutePlanNode(mDestLocationData.longitude, mDestLocationData.latitude, "目的地位置", null, coType);        if (sNode != null && eNode != null) {            List<BNRoutePlanNode> list = new ArrayList<BNRoutePlanNode>();            list.add(sNode);            list.add(eNode);            BaiduNaviManager.getInstance().launchNavigator(this, list, 1, mock, new DemoRoutePlanListener(sNode));        }    }        public class DemoRoutePlanListener implements BaiduNaviManager.RoutePlanListener {            private BNRoutePlanNode mBNRoutePlanNode = null;            public DemoRoutePlanListener(BNRoutePlanNode node) {                mBNRoutePlanNode = node;            }            @Override            public void onJumpToNavigator() {                /*                 * 設置途徑點以及resetEndNode會回調該接口                 */                for (Activity ac : activityList) {                    if (ac.getClass().getName().endsWith("BNDemoGuideActivity")) {                        return;                    }                }                Intent intent = new Intent(MainActivity.this, BNDemoGuideActivity.class);                Bundle bundle = new Bundle();                bundle.putSerializable(ROUTE_PLAN_NODE, (BNRoutePlanNode) mBNRoutePlanNode);                intent.putExtras(bundle);                startActivity(intent);            }        @Override        public void onRoutePlanFailed() {            // TODO Auto-generated method stub            Toast.makeText(MainActivity.this, "算路失敗", Toast.LENGTH_SHORT).show();        }    }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁都县| 吕梁市| 通河县| 平陆县| 萝北县| 兴山县| 潼关县| 宜君县| 日土县| 高平市| 洪洞县| 宜丰县| 务川| 福鼎市| 高密市| 武穴市| 会同县| 定襄县| 芜湖县| 邵阳县| 合江县| 康保县| 中宁县| 汕尾市| 大关县| 揭阳市| 晋宁县| 南乐县| 繁峙县| 吉水县| 开阳县| 神木县| 赣榆县| 济宁市| 南宫市| 根河市| 原平市| 集贤县| 工布江达县| 濮阳市| 台南县|