Android使用高德地图实现导航效果

 博主介绍:本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮助到您;

🍅希望文章对您有帮助🍅

一、功能演示

 

二、实现方式

因为客户端显示的位置数据都是调用api获取的;所以我只说明一下导航的逻辑就可以了

1:导入高德配置文件

说明:这块需要导航的jar文件以及定位jar文件

2:配置AndroidManifest.xml
<!-- 设置talkingdata应用的appkey -->
<service android:name="com.amap.api.location.APSService" >
</service>

<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="您的key文件" >
</meta-data>
3:进行导航
LatLng startInfor = new LatLng(Double.valueOf(mAmapLocation.getLatitude()), mAmapLocation.getLongitude());//起始地址
LatLng endInfor = new LatLng(Double.valueOf(mallModel.getMallLat()), Double.valueOf(mallModel.getMallLon()));//终到地址
AmapNaviParams params = new AmapNaviParams(new Poi(mAmapLocation.getAddress(),startInfor, ""), null, new Poi(mallModel.getMallName(), endInfor, ""), AmapNaviType.DRIVER);
params.setUseInnerVoice(true);
AmapNaviPage.getInstance().showRouteActivity(this, params, this);

说明:这块的代码是高德的api提供的;主要是调起导航的功能,只需要提供这几个参数信息就可以了;

完整的代码如下:

public class OrderLookActivity extends BaseActivity implements INaviInfoCallback, AMapLocationListener {

    // 标题
    private TextView mTvTitle;
    // 返回
    private ImageView mIvBack;
    private TextView mIvStu;
    private TextView userName;
    private TextView userPhone;

    private Button naviInfor;

    private ListView mListMessage;

    AMapLocation mAmapLocation;

    // 声明mlocationClient对象
    public AMapLocationClient mlocationClient;
    // 声明mLocationOption对象
    public AMapLocationClientOption mLocationOption = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_look);
        initWidget();
        initData();
        initAddress();
    }



    private void initAddress() {

        try {
            mlocationClient = new AMapLocationClient(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 初始化定位参数
        mLocationOption = new AMapLocationClientOption();
        // 设置定位监听
        mlocationClient.setLocationListener(this);
        // 设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
        // 设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(10000);
        mLocationOption.setOnceLocation(false);
        //设置是否返回地址信息(默认返回地址信息)
        mLocationOption.setNeedAddress(true);
        // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
        // 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求
        // 在定位结束后,在合适的生命周期调用onDestroy()方法
        // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
        // 启动定位
        mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.Sport);

        mlocationClient.setLocationOption(mLocationOption);
        //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效
        mlocationClient.stopLocation();
        mlocationClient.startLocation();
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.mIvBack:
                OrderLookActivity.this.finish();
                break;

            case R.id.naviInfor:

                LatLng startInfor = new LatLng(Double.valueOf(mAmapLocation.getLatitude()), mAmapLocation.getLongitude());//故宫博物院
                LatLng endInfor = new LatLng(Double.valueOf(mallModel.getMallLat()), Double.valueOf(mallModel.getMallLon()));//北京站
                AmapNaviParams params = new AmapNaviParams(new Poi(mAmapLocation.getAddress(),startInfor, ""), null, new Poi(mallModel.getMallName(), endInfor, ""), AmapNaviType.DRIVER);
                params.setUseInnerVoice(true);
                AmapNaviPage.getInstance().showRouteActivity(this, params, this);
                break;


        }
    }

    @Override
    public void initWidget() {


        mListMessage = (ListView) findViewById(R.id.mListMessage);
        userName = (TextView) findViewById(R.id.userName);
        userPhone = (TextView) findViewById(R.id.userPhone);



        mIvBack = (ImageView) findViewById(R.id.mIvBack);
        mTvTitle = (TextView) findViewById(R.id.mTvTitle);
        mIvStu = (TextView) findViewById(R.id.mIvStu);
        mTvTitle.setText("商场公告");
        mIvBack.setVisibility(View.VISIBLE);
        mIvBack.setOnClickListener(this);
        mIvStu.setOnClickListener(this);
        mIvStu.setVisibility(View.GONE);
        naviInfor = (Button) findViewById(R.id.naviInfor);
        naviInfor.setOnClickListener(this);


    }

    MallModel mallModel;

    @Override
    public void initData() {


        mallModel = (MallModel) this.getIntent().getSerializableExtra("msg");
        userName.setText(mallModel.getMallName());
        userPhone.setText("地址:"+mallModel.getMallAddress() + "");
        listMessageNews(false);


        mListMessage.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(OrderLookActivity.this, NoticeMessageActivity.class);
                intent.putExtra("msg", list_result.get(position));
                OrderLookActivity.this.startActivity(intent);
            }
        });



    }


    private void listMessageNews(boolean isShow) {
        AjaxParams params = new AjaxParams();
        params.put("action_flag", "listMessageNews");
        params.put("newsMallId",mallModel.getMallId()+"");
        httpPost(Consts.URL + Consts.APP.MessageAction, params, Consts.actionId.resultFlag, isShow, "正在加载...");
    }

    private List<NewsModel> list_result = new ArrayList<NewsModel>();

    @Override
    protected void callBackSuccess(ResponseEntry entry, int actionId) {
        super.callBackSuccess(entry, actionId);

        switch (actionId) {
            case Consts.actionId.resultFlag:
                if (null != entry.getData() && !TextUtils.isEmpty(entry.getData())) {

                    String jsonMsg = entry.getData().substring(1, entry.getData().length() - 1);
                    if (null != jsonMsg && !TextUtils.isEmpty(jsonMsg)) {
                        list_result.clear();
                        list_result = mGson.fromJson(entry.getData(), new TypeToken<List<NewsModel>>() {
                        }.getType());
                        NoticeAdapter noticeAdapter= new NoticeAdapter(this, list_result);
                        mListMessage.setAdapter(noticeAdapter);
                    } else {
                    }
                }
                break;

        }

    }


    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        if (amapLocation != null) {
            if (amapLocation.getErrorCode() == 0) {

                mAmapLocation = amapLocation;
                // 定位成功回调信息,设置相关消息
                amapLocation.getLocationType();// 获取当前定位结果来源,如网络定位结果,详见定位类型表
                amapLocation.getAccuracy();// 获取精度信息
                Log.i("pony_log", "获取定位数据:" + amapLocation.getAddress());

            } else {
                Log.e("AmapError", "location Error, ErrCode:" + amapLocation.getErrorCode() + ", errInfo:" + amapLocation.getErrorInfo());
            }
        }
    }


    @Override
    public void onInitNaviFailure() {

    }

    @Override
    public void onGetNavigationText(String s) {

    }

    @Override
    public void onLocationChange(AMapNaviLocation aMapNaviLocation) {

    }

    @Override
    public void onArriveDestination(boolean b) {

    }

    @Override
    public void onStartNavi(int i) {

    }

    @Override
    public void onCalculateRouteSuccess(int[] ints) {

    }

    @Override
    public void onCalculateRouteFailure(int i) {

    }

    @Override
    public void onStopSpeaking() {

    }

    @Override
    public void onReCalculateRoute(int i) {

    }

    @Override
    public void onExitPage(int i) {

    }

    @Override
    public void onStrategyChanged(int i) {

    }

    @Override
    public void onArrivedWayPoint(int i) {

    }

    @Override
    public void onMapTypeChanged(int i) {

    }

    @Override
    public void onNaviDirectionChanged(int i) {

    }

    @Override
    public void onDayAndNightModeChanged(int i) {

    }

    @Override
    public void onBroadcastModeChanged(int i) {

    }

    @Override
    public void onScaleAutoChanged(boolean b) {

    }

    @Override
    public View getCustomMiddleView() {
        return null;
    }

    @Override
    public View getCustomNaviView() {
        return null;
    }

    @Override
    public View getCustomNaviBottomView() {
        return null;
    }


}

具体逻辑是:

1:首先获取定位数据拿到当前坐标和当前的地址信息

2:通过上个页面传递的值传递到需要导航的方法里面去

3:进行导航

三、留个脚印吧

大家要是感觉此篇文章有意义;那就给个关注、点赞,收藏吧;

🍅也可以关注文档末尾公众号🍅

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android毕业设计源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值