安卓学习-百度地图

image

image

image

image

Android Studio工程配置方法

第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,工程会自动加载src目录下的so动态库,放入libBaiduMapSDK_vX_X_X_X.so以下图所示,注意jar和so的前3位版本号必须一致,而且保证使用一次下载的文件夹中的两个文件,不能不一样功能组件的jar或so交叉使用。 java

Androidstudio1.png

so的配置也能够参考demo给出的目录结构,以下图所示,在app工程路径下,新建libs,并在libs目录下放入对应不一样CPU架构的so文件。这样工程并不会自动加载libs下的so,需在gradle编译时,经过加入代码: jniLibs.srcDir 'libs' 来讲明so的路径为该libs路径。 android

Androidstudio2.png

第二步:工程配置还须要把jar包集成到本身的工程中,如图上图所示,放入libs目录下。对于每一个jar文件,右键-选择Add As Library,导入到工程中。对应在build.gradle生成工程所依赖的jar文件说明,如图所示: git

Androidstudio3.png

jar的配置也可参考eclipse方法,进行如下操做: api

菜单栏选择 File —>Project Structure。 网络

在弹出的Project Structure 对话框中, 选择module, 而后点击 Dependencies 选项卡. 架构

点击绿色的加号选择File dependency. 而后选择要添加的jar包便可 完成上边的操做后在app目录下的build.gradle文件中,会有引入的类库,如上图所示。 app

应用混淆

集成地图SDK的应用,在打包混淆的时候,须要注意与地图SDK相关的方法不可被混淆。混淆方法以下:框架

-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}    
-dontwarn com.baidu.**

保证百度类不能被混淆,不然会出现网络不可用等运行时异常 eclipse

Hello BaiduMapAndroid SDK 异步

开发工具

Android开发工具备不少。在此,咱们推荐开发者使用Eclipse做为本身的开发工具,本套开发指南也是针对Eclipse开发环境下进行编写的。

显示百度地图

百度地图SDK为开发者提供了便捷的显示百度地图数据的接口,经过如下几步操做,便可在您的应用中使用百度地图数据:

第一步:建立并配置工程(具体方法参见工程配置部分的介绍);

第二步:在AndroidManifest中添加开发密钥、所需权限等信息;

(1)在application中添加开发密钥

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="开发者 key" />  
</application>

2)添加所需权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

第三步,在布局xml文件中添加地图控件;

<com.baidu.mapapi.map.MapView  
    android:id="@+id/bmapView"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:clickable="true" />

第四步,在应用程序建立时初始化 SDK引用的Context 全局变量:

public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);   
        //在使用SDK各组件以前初始化context信息,传入ApplicationContext  
        //注意该方法要再setContentView方法以前实现  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
    }  
}

注意:在SDK各功能组件使用以前都须要调用

SDKInitializer.initialize(getApplicationContext());,所以咱们建议该方法放在Application的初始化方法中

第五步,建立地图Activity,管理地图生命周期;

public class MainActivity extends Activity {  
    MapView mMapView = null;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);   
        //在使用SDK各组件以前初始化context信息,传入ApplicationContext  
        //注意该方法要再setContentView方法以前实现  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
        //获取地图控件引用  
        mMapView = (MapView) findViewById(R.id.bmapView);  
    }  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
        mMapView.onDestroy();  
    }  
    @Override  
    protected void onResume() {  
        super.onResume();  
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
        mMapView.onResume();  
        }  
    @Override  
    protected void onPause() {  
        super.onPause();  
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
        mMapView.onPause();  
        }  
    }

完成以上步骤后,运行程序,便可在您的应用中显示以下地图:

android_dev2.jpg

以上的例子为你们介绍了如何构建一个基础的地图页面。地图控件自v2.3.5版本起,支持多实例,即开发者能够在一个页面中创建多个地图对象,而且针对这些对象分别操做且不会产生相互干扰。具体使用方法请参考MutiMapViewDemo中的相关介绍。

此外,自v2.3.5版本开始。MapView控件还增长了对Fragment框架的支持。用户可使用SupportMapFragment控件完成相应框架内的开发工做(详见MapFragmentDemo)。

image

image

image

image

imageimage

image

imageimageimage

image

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.baidumap">


<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 访问网络,网络定位须要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="onOhaXWOvV7RnacLgLTAbiEX1QrPpMtl" />

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"></service>

</application>

</manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.baidumap.MainActivity">

<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/button_poi" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="poi检索"
android:onClick="poiClick"
android:id="@+id/button_poi"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="个人位置"
android:onClick="mylocationClick"
android:id="@+id/mylocation"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button_poi"
android:layout_toEndOf="@+id/button_poi" />

</RelativeLayout>

MainActivity.java

package com.example.administrator.baidumap;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;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.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.search.core.PoiInfo;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.PoiResult;import com.baidu.mapapi.search.poi.PoiSearch;import java.util.List;public class MainActivity extends AppCompatActivity {    MapView mMapView = null;    private BaiduMap baiduMap;    private PoiSearch poiSearch;    public LocationClient mLocationClient = null;    public BDLocationListener myListener = new MyLocationListener();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //在使用SDK各组件以前初始化context信息,传入ApplicationContext        //注意该方法要再setContentView方法以前实现        SDKInitializer.initialize(getApplicationContext());        setContentView(R.layout.activity_main);        mMapView = (MapView) findViewById(R.id.bmapView);        baiduMap = mMapView.getMap();        baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//设置为普通地图        //卫星地图        //  baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);        baiduMap.setTrafficEnabled(true);//实时交通图        mLocationClient = new LocationClient(getApplicationContext());//声明LocationClient类        mLocationClient.registerLocationListener( myListener );    //注册位置监听函数        //添加一个标注覆盖物        LatLng latLng = new LatLng(39.963175, 116.400244);//经纬度        BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);        //建立一个图层选项        OverlayOptions options = new MarkerOptions().position(latLng).icon(bitmapDescriptor);        //把图层选项添加到地图上        baiduMap.addOverlay(options);        //实例化POI检索工具        poiSearch = PoiSearch.newInstance();        //POI检索的结果监听事件        OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {            @Override            public void onGetPoiResult(PoiResult poiResult) {                //获取POI检索结果                List<PoiInfo> poiInfos = poiResult.getAllPoi();                for (PoiInfo p : poiInfos) {                    System.out.println(p.address);                    System.out.println(p.city);                    System.out.println(p.phoneNum);                    BitmapDescriptor bd = BitmapDescriptorFactory.fromResource(R.mipmap.biapji);                    //建立一个图层选项                    OverlayOptions options = new MarkerOptions().position(p.location).icon(bd);                    baiduMap.addOverlay(options);                }            }            @Override            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {                //获取Place详情页检索结果            }        };        //设置POI检索监听者        poiSearch.setOnGetPoiSearchResultListener(poiListener);    }    public void poiClick(View view) {        //发起一个检索请求,异步的过程        poiSearch.searchInCity((new PoiCitySearchOption())                .city("北京")                .keyword("美食")                .pageNum(10));    }//请求个人位置信息    public void mylocationClick(View view)    {        initLocation();        mLocationClient.start();        mLocationClient.requestLocation();//发送请求    }    @Override    protected void onDestroy() {        super.onDestroy();        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理        mMapView.onDestroy();        poiSearch.destroy();    }    @Override    protected void onResume() {        super.onResume();        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理        mMapView.onResume();    }    @Override    protected void onPause() {        super.onPause();        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理        mMapView.onPause();    }    /*设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。    LocationClientOption类,该类用来设置定位SDK的定位方式,e.g.:*/    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);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集        option.setEnableSimulateGps(false);//可选,默认false,设置是否须要过滤gps仿真结果,默认须要        mLocationClient.setLocOption(option);    }    //位置监听器    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号和大致定位时间到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());            System.out.println(sb);            BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromResource(R.mipmap.biapji);            //纬度 经度            LatLng latLng=new LatLng(location.getLatitude(),location.getLongitude());            OverlayOptions options=new MarkerOptions().position(latLng).icon(bitmapDescriptor);       baiduMap.addOverlay(options);        }    }}
相关文章
相关标签/搜索