学习android到现在,终于到了做个小应用的时间,今天我们就从地图做起,地图我们一般使用百度地图,或者高德地图。只需要使用它们的api,进行修改就可以,它们的demon都可以从它们的官网中下载并查看api,这里我们就以百度地图为例,详细来看看如何使用地图吧。、

以百度地图API官网资料为准。

1.环境搭建:


先进入相关下载,下载SDK,根据左侧开发指南操作即可,
这里强调一下需要注意的要点:

  • 申请密钥时:
    在控制台获得安全码时组成,例如:BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:91:AF:A1:66:6E:44:5D:75;com.baidumap.demo,一定不包括SHA1,且前面不要有多余的空格。

  • 配置环境时:
    导入两个包:
    java的jar包,放置到libs文件夹下;【别忘从depence中导入】
    .so库,是c语言写的一些逻辑,需要用到JNI java native interface。
    这些库需要放到jniLibs文件夹下。
    这是仅显示地图时,需要导入这些(2个jar,5个包),在后面如果需要应用同时需要能够实现定位功能,则需要按照下载定位功能的示例包,导入(1个jar,7个so包)【注:这时这7个包中有的so库是与上面5个包中有重复的,只是版本不一样,需要将之前那5个文件夹中5.x的版本的so库删掉,只使用6.x的版本即可】

  • menifest.xml文件中的配置:这里进行权限,service等的配置,根据开发指南指示的做即可。

定位:(LBS)

百度地图SDK从2.0.0版本起,将定位功能进行了分离,要单独下载包

  • 下载包
    到百度api首页>android 开发的定位功能中下载示例包。旁边即为开发指南。

  • 定位步骤:
    虽然开发指南中有介绍,这里我们还是讲一下需要注意的重点和大体的流程哈。
    1)申请密钥(可以和之前的map使用同一个)
    2)menifest中的设置,权限,service,以及Accesskey。
    3)代码中的注意点:
    1>初始化并设置监听事件(start后,会在监听事件中获得位置)
    监听BDLocationListener接口,中只需要实现一个方法,其中可以获得定位的坐标。对坐标的操作可以在这个方法中进行。
    其中:除了获得纬度,经度之外还可以获得很多信息。如果定位失败,就可以打印getLocType ( )来查看错误所在。

location.getLatitude();//获得纬度location.getLongitude();//获得经度

在监听事件中要注意,最后要mLocationClient.stop();停止定位
2>开始定位之前,进行initLocation()方法。【设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型】具体看指南就ok
3>开始定位:mLocationClient.start();

2.某些方法的使用:

1)获得地图上的某个点,

LatLng ptCenter = new LatLng(纬度, 经度);

3.一些Demon的介绍:

可以从Demon的strings.xml中来查看每个demon的实例功能。

  • BMapApiDemonMain.java:可以查到其他class的功能,可以说是个总集。

  • BaseMapDemo.java:基本地图功能,创建一张百度地图并管理地图的生命周期。(演示MapView的基本用法)

  • MapFragmentDemo.java:MapFragment使用->创建一个基于Fragment的地图框架。

  • MultiMapViewDemo:多地图展示->在一个Activity中创建多个地图展示.

  • GeoCodeDemo :地理编码功能->介绍地址信息与坐标之间的相互转换,此demo用来展示如何进行地理编码搜索(用地址检索坐标)、反地理编码搜索(用坐标检索地址)。

利用此功能可以进行搜索:
搜索步骤:
1)地图初始化.getMap()(当然搜索模块,也可去掉地图模块独立使用)
2)初始化搜索模块,注册事件监听OnGetGeoCoderResultListener,其中实现两个方法onGetGeoCodeResult(返回“Geo”搜索的结果)和onGetReverseGeoCodeResult(返回 “反Geo” 搜索的结果)。【发起搜索后,会在监听中获得结果】

demon中可以看到,演示了,如果搜索失败,返回一个Toast,提醒失败,成功了Geo:会返回经纬度,并在相应位置画一个图标;反Geo成功也在相应位置画一个图标:
坐标:

result.getLocation().latitude//纬度result.getLocation().longitude//经度

画图标:

mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation())                .icon(BitmapDescriptorFactory                        .fromResource(R.drawable.icon_marka)));        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result                .getLocation()));

3)发起搜索:
Geo搜索:

mSearch.geocode(new GeoCodeOption().city(                    “”).address(                    “”));

反Geo搜索:

mSearch.reverseGeoCode(new ReverseGeoCodeOption()                    .location(坐标LatLng类型));
  • GeometryDemo:自定义绘制功能->此demo用来展示如何在地图上用GraphicsOverlay添加点、线、多边形、圆 同时展示如何在地图上用TextOverlay添加文字。

范例:

功能:实现按钮1:搜索位置,按钮2:定位,按钮3:将两个位置连接
这里只显示mainactivity:(代码不再做详细解释)

package com.example.mymap;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.baidu.android.pushservice.PushConstants;import com.baidu.android.pushservice.PushManager;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.location.Poi;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.map.PolylineOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.search.core.SearchResult;import com.baidu.mapapi.search.geocode.GeoCodeOption;import com.baidu.mapapi.search.geocode.GeoCodeResult;import com.baidu.mapapi.search.geocode.GeoCoder;import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity {    MapView mMapView = null;    private GeoCoder mSearch;    private BaiduMap mBaiduMap;    public double weidu;    public double jingdu;    private Button mButtonStartLocation;    private Button mButtonDingwei;    private Button mButtonLine;    public LocationClient mLocationClient = null;//1.定位所用    public BDLocationListener myListener = new MyLocationListener();    List<LatLng> points = new ArrayList<LatLng>();//3.用于连线    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        SDKInitializer.initialize(getApplicationContext());//必须在加载布局之前        PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, "api_key");//推送        setContentView(R.layout.activity_main);        mMapView = (MapView) findViewById(R.id.bmapView);        mBaiduMap = mMapView.getMap();        //2.定位        mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类        mLocationClient.registerLocationListener(myListener); //注册监听函数        mButtonStartLocation = (Button) findViewById(R.id.buttonStartLocation);        mButtonDingwei = (Button) findViewById(R.id.buttondingwei);        mButtonLine = (Button) findViewById(R.id.buttonLine);        //search:        mSearch = GeoCoder.newInstance();        mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {            @Override            public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {                if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)                            .show();                    return;                }                mBaiduMap.clear();                mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())                        .icon(BitmapDescriptorFactory                                .fromResource(R.mipmap.ic_launcher)));                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult                        .getLocation()));                //将search得到的点加入集合中                points.add(geoCodeResult.getLocation());                String strInfo = String.format("纬度:%f 经度:%f",                        geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);                Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();                weidu = geoCodeResult.getLocation().latitude;                jingdu = geoCodeResult.getLocation().longitude;            }            @Override            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)                            .show();                    return;                }                mBaiduMap.clear();                mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation())                        .icon(BitmapDescriptorFactory                                .fromResource(R.mipmap.ic_launcher)));                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result                        .getLocation()));                Toast.makeText(MainActivity.this, result.getAddress(),                        Toast.LENGTH_LONG).show();            }        });        mButtonStartLocation.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                mSearch.geocode(new GeoCodeOption().city("北京").address("中关村海龙大厦"));            }        });        //点击定位按钮        mButtonDingwei.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                initLocation();                mLocationClient.start();//开启后,在监听中获得定位位置,将其设置上一个小图片            }        });        //点击划线按钮        mButtonLine.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                OverlayOptions ooPolyline = new PolylineOptions().width(10)                        .color(0xAAFF0000).points(points);                mBaiduMap.addOverlay(ooPolyline);            }        });    }  /* 注:位置与onCreate并列,且调用时在start之前调用 设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。 */    private void initLocation() {        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有效时按照1S1次频率输出GPS结果        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到        option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要        mLocationClient.setLocOption(option);    }//实现BDLocationListener接口    class MyLocationListener implements BDLocationListener {        @Override        public void onReceiveLocation(BDLocation location) {            //Receive Location            LatLng point1 = new LatLng(location.getLatitude(), location.getLongitude());            mBaiduMap.addOverlay(new MarkerOptions().position(point1)                    .icon(BitmapDescriptorFactory                            .fromResource(R.mipmap.ic_launcher)));            mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point1));            //将点加入到points集合中            points.add(point1);            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号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");            } 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<Poi> 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());            mLocationClient.stop();        }    }}

问题

只想实现定位,没有执行lisener:

在manifest中添加这一句。

更多相关文章

  1. Android基于开源项目的WheelView的时间、地址联动选择对话框
  2. android开发-使用Dialog AlertDialog
  3. Android(安卓)客服端集成高德定位功能(Android(安卓)studio图文详
  4. ExpandableListView用法和实例
  5. Android(安卓)Launcher分析和修改2——Icon修改、界面布局调整、
  6. css margin属性理解与使用
  7. 关于Android中的Parcel机制
  8. 高德地图 android api 实现自动定位
  9. Android之上下文菜单(ContextMenu)

随机推荐

  1. Android(安卓)Adapter
  2. android 博客精选
  3. android中使用iconfont
  4. Android(安卓)UI 设置ProgressBar的颜色
  5. Android:实现定时器 Handler的postDelaye
  6. Android中判断是否有声音在播放
  7. android 横屏竖屏设置
  8. Android(安卓)Studio 使用中遇到的问题和
  9. 禁止横竖屏自动切换
  10. 中国Android应用商店汇总