Android Studio百度地图仿QQ发说说选择位置功能

此功能实现也相对简单,主要是对百度地图的应用,以及Android基础的知识。
百度地图用到了定位功能和附近POI搜索功能。
效果图:
在这里插入图片描述

在这里插入图片描述

实现步骤、思路:
1.新建Android项目
2.创建AK。
打开百度地图开发者平台:http://lbsyun.baidu.com/
如果是新用户,请先注册账号,登录后,进入控制台(http://lbsyun.baidu.com/apiconsole/key/create)
,创建自己的应用,里面有详细的步骤。
在这里插入图片描述
附:Android调试版SHA1值的获取方法

C:\Users\Administrator\.android>keytool -list -v -keystore debug.keystore
密码:android

3.下载所需的jar包
下载jar包需要根据自己的功能,此功能需要定位及附近位置搜索。
jar包下载
在这里插入图片描述

4.Android studio初始化配置百度地图
步骤参考百度开发集成文档

5.贴出关键源码
LocationActivity.java

package com.hbck.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;

import java.util.ArrayList;
import java.util.List;

/**
 * 百度定位
 *
 * @Date 2018-11-06.
 */
public class LocationActivity extends AppCompatActivity {
    public LocationClient mLocationClient = null;
    private MyLocationListener myListener = new MyLocationListener();
    private EditText et_key;
    private ListView listView;
    private String city;
    private LatLng latLng;
    private List<PoiInfo> allPoi = new ArrayList<>();
    private String address;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);

        initView();

        initLocation();
    }


    private void initView() {
        et_key = findViewById(R.id.et_key);
        et_key.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                if (editable.length() != 0 && !"".equals(editable.toString())) {
//                    citySearch(editable.toString());
                    nearbyPoiSearch(editable.toString(), latLng);
                }else {
                    nearbyPoiSearch(address, latLng);
                }
            }
        });
        listView = findViewById(R.id.listView);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String result = "";
                if (i != 0) {
                    result = allPoi.get(i).getName();
                }
                Intent intent = getIntent();
                intent.putExtra("address", result);
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }

    private void initLocation() {
        mLocationClient = new LocationClient(getApplicationContext());
        //声明LocationClient类
        mLocationClient.registerLocationListener(myListener);
        //注册监听函数

        //配置定位SDK参数
        LocationClientOption option = new LocationClientOption();

        //可选,是否需要地址信息,默认为不需要,即参数为false
        //如果开发者需要获得当前点的地址信息,此处必须为true
        option.setIsNeedAddress(true);

        //可选,是否需要周边POI信息,默认为不需要,即参数为false
        //如果开发者需要获得周边POI信息,此处必须为true
        option.setIsNeedLocationPoiList(true);


        //mLocationClient为第二步初始化过的LocationClient对象
        //需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
        //更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明
        mLocationClient.setLocOption(option);
        mLocationClient.start();
    }

    public void finish(View view) {
        finish();
    }

    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取地址相关的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明
            address = location.getBuildingName();
            if (address == null)
                address = location.getAddrStr();    //获取详细地址信息
            String country = location.getCountry();    //获取国家
            String province = location.getProvince();    //获取省份
            city = location.getCity();    //获取城市
            String district = location.getDistrict();    //获取区县
            String street = location.getStreet();    //获取街道信息
            latLng = new LatLng(location.getLatitude(), location.getLongitude());
            nearbyPoiSearch(address, latLng);
        }
    }

    /**
     * 周边poi检索示例
     */
    public void nearbyPoiSearch(String key, LatLng latLng) {
        //创建poi检索实例
        PoiSearch poiSearch = PoiSearch.newInstance();

        //设置poi监听者该方法要先于检索方法searchNearby(PoiNearbySearchOption)前调用,否则会在某些场景出现拿不到回调结果的情况
        poiSearch.setOnGetPoiSearchResultListener(poiListener);
        //设置请求参数
        PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption()
                .keyword(key)//检索关键字
                .location(latLng)//检索位置
                .pageNum(0)//分页编号,默认是0页
                .pageCapacity(30)//设置每页容量,默认10条
                .radius(2000);//附近检索半径
        //发起请求
        poiSearch.searchNearby(nearbySearchOption);
        //释放检索对象
//        poiSearch.destroy();
    }

    /* 城市内搜索
     */
    private void citySearch(String key) {
        // 设置检索参数
        PoiSearch poiSearch = PoiSearch.newInstance();
        // 设置检索监听器
        poiSearch.setOnGetPoiSearchResultListener(poiListener);
        PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
        citySearchOption.city(city);// 城市
        citySearchOption.keyword(key);// 关键字
        citySearchOption.pageCapacity(15);// 默认每页10条
        citySearchOption.pageNum(1);// 分页编号
        // 发起检索请求
        poiSearch.searchInCity(citySearchOption);
    }


    //创建poi监听者
    OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
        @Override
        public void onGetPoiResult(PoiResult poiResult) {
            if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
                Toast.makeText(LocationActivity.this, "未找到结果", Toast.LENGTH_LONG).show();
                allPoi.clear();
                PoiInfo info = new PoiInfo();
                info.setName("不显示");
                info.setAddress("");
                allPoi.add(info);
                listView.setAdapter(new MyAdapter(LocationActivity.this, allPoi));
                return;
            }
            if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
                allPoi.clear();
                PoiInfo info = new PoiInfo();
                info.setName("不显示");
                info.setAddress("");
                allPoi.add(info);
                allPoi.addAll(poiResult.getAllPoi());
                listView.setAdapter(new MyAdapter(LocationActivity.this, allPoi));
            }
        }

        @Override
        public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
            Log.d("LocationActivity", "poiDetailResult:" + poiDetailResult);
        }

        @Override
        public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
            Log.d("LocationActivity", "poiDetailSearchResult:" + poiDetailSearchResult);
        }

        @Override
        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
            Log.d("LocationActivity", "poiIndoorResult:" + poiIndoorResult);
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

ListView Adapter:MyAdapter.java
package com.hbck.myapplication;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.baidu.mapapi.search.core.PoiInfo;

import java.util.List;

/**
 * @Date 2018-11-06.
 */
public class MyAdapter extends BaseAdapter {
    private Context mContext;
    private List<PoiInfo> list;

    public MyAdapter(Context mContext, List<PoiInfo> list) {
        this.mContext = mContext;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder = null;
        if (view == null) {
            view = View.inflate(mContext, R.layout.item_address, null);
            holder = new ViewHolder(view);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        holder.tv_name.setText(list.get(i).name);
        holder.tv_address.setText(list.get(i).address);
        return view;
    }

    static class ViewHolder {
        public TextView tv_name;
        public TextView tv_address;

        public ViewHolder(View view) {
            tv_name = view.findViewById(R.id.tv_name);
            tv_address = view.findViewById(R.id.tv_address);
        }
    }
}

界面布局:activity_location.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F0F1F3"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#3CA7FD">

        <Button
            android:onClick="finish"
            android:id="@+id/btn_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@null"
            android:text="取消"
            android:textColor="#fff"
            android:textSize="16sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="地点"
            android:textColor="#fff"
            android:textSize="18sp" />

    </RelativeLayout>


    <EditText
        android:id="@+id/et_key"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:background="#fff"
        android:drawableLeft="@mipmap/ic_search_40dp"
        android:hint="搜索其他位置"
        android:padding="5dp"
        android:textColor="#000"
        android:textColorHint="#A6A6A6"
        android:textSize="14sp" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FAFAFA"
        android:dividerHeight="1dp">

    </ListView>

</LinearLayout>

主要代码就这些,完整代码就不列了,都是些基础的功能,如有问题,欢迎骚扰,乐意解答技术问题。

如有代码代写需求或需要源码的或软件定制的,请加QQ:2103752102,

Android、IOS、javaweb,c#等
小强程序设计工作室:淘宝店

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值