pAdPt_-6 LearnBdMapBasic[(百度)地图(Android SDK)基础]

2015.12.02 -

挑简单的抄,以对(百度)地图来一个基础的认知。

平台。
Windows 10
Android Studio 1.5
百度地图AndroidSDK(开发指南): http://developer.baidu.com/map/index.php?title=androidsdk
Android类参考:http://developer.android.com/reference/packages.html

2015.12.02

1. 创建Android工程

打开AS –> Start a new Android Studio Project
- Application name:LearnBdMapBasic
- Company Domain:xndx
–> Next
- Phone and Tablet,Minimum SDK - API 15: Android 4.0.3(IceCreamSandwich)
–> Next
- Empty Activity
–> Next
- Activity Name: BdMapMainActivity
- Layout Name: activity_bdmap_main
–> Finish

通过AS将LearnBdMapBasic程序下载(pAdPt-0 Android平台(jdk + AS)搭建 - 真机调试)到Android手机上运行,程序显示“Hello World!”。

2. 在AS中搭建百度地图AndroidSDK环境

2.1 申请密钥

需要申请密钥后,才可使用百度地图Android SDK。在百度地图AndroidSDK官网申请密钥需要SHA1和应用程序包名,提交二者得到的访问应用(AK)值即为密钥。

(1) 获取数字签名(SHA1)

将.LearnBdMapBasic\app\build\outputs\apk目录下的app-debug.apk文件的后缀更改为.zip,然后对app-debug.zip文件解压。打开cmd,进入.app-debug\META-INF目录,使用“keytool -printcert -file CERT.RSA”命令得到SHA1。

(2) 应用程序包名

.LearnBdMapBasic\app\src\main\AndroidManifest.xml中的package值即为应用程序报名。

2.2 百度地图Android SDK环境

(1) 下载需要的百度地图Android SDK

可在百度地图Android SDK的下载页面下载到最新版的地图SDK。[ 根据我的习惯,在此页面中点击自定义下载 ,下载基础地图的“开发包”、“示例代码”以及“类参考”]。

解压下载的BaiduLBS_AndroidSDK_Lib.zip,根据readme.txt得知基础地图的版本为v.3.6.1。

(2) 导入.jar和.so包到AS的Android工程中

  • 导入.jar包。将.BaiduLBS_AndroidSDK_Lib\libs\BaiduLBS_Android.jar拷贝到.LearnBdMapBasic\app\libs目录下。并在AS中,菜单栏选择File->Project Structor->Modules->Dependencies,点击+号,选择File dependency,选择BaiduLBS_Android.jar包导入。
  • 拷贝.so包。在.LearnBdMapBasic\app\src\main目录下新建jniLibs目录,将.BaiduLBS_AndroidSDK_Lib\libs\目录下的包含.so的目录拷贝到jniLibs目录下。

3. 显示百度地图视图

3.1 在AndroidManifest.xml的application中添加开发密钥

     <application …… >

        <!-- 百度基础地图开发密钥 -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="mv6ASA0gMoDPyFjQtnUgqBXz"/><!--开发者 key-->
        ……
    </application>

3.2 在AndroidManifest.xml的manifest中添加基础地图所需权限

    <!-- 百度基础地图所需权限-->
    <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" />

解释MapView为何需要这些权限。

3.3 使用MapView显示百度地图视图

使用静态的方式显示百度地图控件。

(1) 声明MapView控件

activity_bd_map_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  android:orientation="vertical"
    ...>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello Map!" />

    <!-- 显示百度地图视图控件 -->
    <com.baidu.mapapi.map.MapView
        android:id="@+id/bdMapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.baidu.mapapi.map.MapView>
</LinearLayout>

MapView
一个显示地图的视图(View)。它负责从服务端获取地图数据。它将会捕捉屏幕触控手势事件。 使用这个类必须按照它的生命周期进行操控,你必须参照以下方法onCreate(Bundle)、 onResume()、onPause()、onDestroy()。等声明周期函数。在使用地图组件之前请确保已经调用了 SDKInitializer.initialize(Context) 函数以提供全局 Context 信息。——[.BaiduLBS_AndroidSDK_Docs\BaiduMap_AndroidSDK_v3.6.1_Docs\doc\index.xml - 所有类-MapView ]

(2) 加载MapView显示百度地图视图

BdMapMainActivity.java

package xndx.learnbdmapbasic;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.MapView;

public class BdMapMainActivity extends AppCompatActivity {

    private MapView bdMapView   = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        //注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_bd_map_main);

        //载入MapView对象
        bdMapView   = (MapView)this.findViewById(R.id.bdMapView);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        bdMapView.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        bdMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        bdMapView.onPause();
    }
}

主活动BdMapMainActivity启动时,自动运行onCreate()方法。当从布局文件中载入MapView控件时就相当于实现了一个MapView对象(构造函数会运行) - 从百度服务端取地图数据从而显示地图。百度地图的生命跟主活动的生命周期保持一致步伐,跟主活动同生同死。

通过AS将程序下载到Android手机上运行,运行结果如下。
这里写图片描述
图1. 显示百度地图视图

显示百度地图的AS版练习代码地址:LearnBdMapBasic1-3

2015.12.03

4. 百度地图一般事件监听

使用百度地图AndroidSDK时,“密钥不对”、“未联网”都不能显示百度地图视图。尤其对于后者,当用户使用地图未联网时应该给予提示。对于Android程序来说,需要检测“密钥不对”、“未联网”这些事件,检测到后再给出相应的提示。看开发指南,是使用了Android的广播监听(接收)类BroadcastReceiver 完成的“百度地图事件监听”工作。这里主要是想监听到“密钥不对”以及“未联网”两个事件来学习此类的使用,这两个事件也是目前所需的。

4.1 广播监听类参考

Android类参考网页的右上角搜“BroadcastReceiver”。

BroadcastReceiver
用于代码中以接收由sendBroadcast()发送的意图。

可在代码中(.java文件中)用Context.registerReceiver()方法动态地注册此类的实例,也可在清单文件AndroidManifest.xml中的receiver标签下静态注册此类。[看个动态注册和静态注册的实例]

注:若在Activity.onResume()实现中注册此类实例,那应该在Activity.onPause()注销此类实例。(在活动暂停时不需接收意图,并且这会减少必要的系统消耗)。不要在Activity.onSaveInstanceState()中注销此类,因为当用户回到历史堆上时此方法不会被调用。

接收器生命周期。
BroadcastReceiver对象只在调用onReceive(Context, Intent)的期间有效。一旦代码从此函数中返回,系统将会认为此对象结束并不再活跃。

在onReceive(Context, Intent)实现中能做什么响应很重要:任何异步操作不能包含其中,因为异步操作需要从此函数中返回处理异步操作,但函数返回时BroadcastReceiver已不存在,如此系统会在异步操作完成之前杀死BroadcastReceiver所在的进程。

尤其是,在BroadcastReceiver内部能展示对话框或绑定服务。对于前者,可以使用NotificationManager API;对于后者,可以使用Context.startService()来给服务发送命令。

进程生命周期。
当前执行BroadcastReceiver(即运行onReceive(Context, Intent)方法内的代码)的进程应该是一个前台进程,并且应该让系统保持它的运行(除非内存等极端问题)。

一旦从onReceive()函数返回时,BroadcastReceiver就不再活跃,它所在的进程将会运行其他的组件。若某进程内只运行BroadcastReceiver,当从onReceive()函数返回后系统会认为此进程为空就会将此进程杀死(将资源留给其它更需要资源的进程)。

这就意味着欲长期运行,就需要结合一个服务给BroadcastReceiver以让它们的进程一直保持活跃。

onRecive(Context context, Intent intent)方法。
此方法在BroadcastReceiver收到意图广播时会被自动调用。BroadcastReceiver会自动接收由sendBroadcast()发送的意图。当此方法运行在主线程中时不应该执行耗时的操作(在此函数中耗时10s就会被认为接收器阻塞,接收器就会列入被杀名单中),在onReceive()中也不应该启动组对话框。

参数
Context 接收器所运行的上下文[给个博客参考下Android中Context含义],次处的Context跟。
intent 欲接收的意图。

Context.registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
在主活动中注册BroadcastReceiver实例来运行,当在主应用程序线程中匹配到与filter一致的意图时,receiver就会被调用(调用onReceive()方法)。[ 向密钥失败和未联网事件由系统发出(系统调用sendBroadcast系类函数)]

读一次BroadcastReceiver类参考也没多大感觉。还是结合“百度地图开发指南-事件监听”将代码揉入Android工程中测试一下。

4.2 动态注册广播接收实例 & 监听密钥失败和网络错误事件

动态注册广播接收器类使用Context.registerReceiver()方法,需要两个条件:BroadcastReceiver实例IntentFilter。和因为要重新实现广播接收类中的onReceive()函数,所以可以在程序中实现一个扩展于BroadcastReceiver类的同时重新实现onReceive()。

(1) 重新实现onReceive()方法的扩展BroadcastReceiver的类

BdMapMainActivity.java

……
public class BdMapMainActivity extends AppCompatActivity {

    private MapView     bdMapView       = null;
    private TextView    tTipForBdMap    = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        …...
        //载TextView对象
        tTipForBdMap    = (TextView)this.findViewById(R.id.tTipForBdMap);
    }

     …...
    /*扩展广播监听类BroadcastReceiver,实现onReceive()方法*/
    public class BdMapSDKReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

            //获取接收到的意图
            String  action  = intent.getAction();

            //检测广播意图是否为百度地图权限验证失败的广播
            if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {

                tTipForBdMap.setText("百度地图key验证失败,请检查AndroidManifest.xml中key值");

                //没有联网的广播
            } else if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {

                tTipForBdMap.setText("请开启设备网络连接(Wi-Fi)");

                //百度Android SDK密钥验证成功
            }else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK)) {

                tTipForBdMap.setText("key + NetWork Well, BaiduMap:");
            }
        }
    }

}

检测百度地图密钥验证失败和网络错误的值都在SDKInitializer类中。[.BaiduLBS_AndroidSDK_Docs\BaiduMap_AndroidSDK_v3.6.1_Docs\doc\index.xml - com.baidu.mapapi - SDKInitializer]

R.id.tTipForBdMap为原显示“Hello World!”字符串的TextView控件。

(2) IntentFilter实例

BdMapMainActivity.java

……
public class BdMapMainActivity extends AppCompatActivity {

    ……
    private IntentFilter        bdiFilter   = null;
    private BdMapSDKReceiver    bdMapSDKReceiver    = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ......

        /*百度地图广播监听实例、欲监听的广播事件*/
        bdMapSDKReceiver    = new BdMapSDKReceiver();

        bdiFilter   = new IntentFilter();
        bdiFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
        bdiFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK);
        bdiFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);

    }

    ......
}

选择在活动的onCreate()方法中实例IntentFilter和BroadcastReceiver对象。

(3) 注册和注销广播监听

BdMapMainActivity.java

……
public class BdMapMainActivity extends AppCompatActivity {

    ......
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       ......
    }

    /*-------------------管理百度地图生命周期-------------------*/
    ……
       @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        bdMapView.onResume();

        //注册百度地图广播监听
        registerReceiver(bdMapSDKReceiver, bdiFilter);
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        bdMapView.onPause();

        //注销百度地图监听广播
        unregisterReceiver(bdMapSDKReceiver);
    }
    /*-------------------管理百度地图生命周期-------------------*/
   ......
}

选择在活动的onResume()和onPause()阶段分别注册、注销百度地图的广播监听。

(4) 验证百度地图的密钥错误和未联网事件监听

将清单文件中的百度地图Android SDK密钥修改为一个随机的字符串后下载程序到Android手机(连上Wi-Fi,程序第一次下载并安装时也需要联网验证密钥,不联网密钥也会验证失败)上运行:
这里写图片描述
图2. 监听百度地图Android SDK密钥验证失败事件

恢复正确密钥 + 连Wi-Fi:
这里写图片描述
图3. 恢复正确密钥正确显示百度地图视图 - 并监听到百度地图Android SDK密钥验证成功

正确密钥 + 不联网:
这里写图片描述
图4. 未能监听到未开启联网事件

未能够检测到未联网的状态(显示网络和密钥都OK但未从百度服务器上获取百度地图数据显示 - 取而代之显示的是方格子)。修改程序内容检测未联网状态 – 怀疑SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR网络错误广播不是指未联网事件广播。现将此广播下的提示改为“网络错误”。

(5) 管理网络连接状态 - 提示百度地图视图不能显示的未联网的原因

安卓中管理网络连接状态的是ConnectivityManager类。查其类参考。

ConnectivityManager
此类响应对网络连接状态的查询。当网络连接改变时此类也会通知应用程序。通过调用Context.getSystemService(Context.CONNECTIVITY_SERVICE)可以得到该类实例。

此类主要负责以下几个功能:
监控网络连接(Wi-Fi,GPRS,UMTS等)
- 当网络连接改变时发送广播
- 当某个网络断开时尝试“故障切换”连接到另外一个网络
- 提供API来供应用程序查询可用网络的粗、细粒度
- 提供API来供应用程序请求和选择连接网络来传输数据

在百度地图验证密钥成功后检测当前是否有连接网络。
BdMapMainActivity.java

         ……
public class BdMapMainActivity extends AppCompatActivity {

    ......
    private ConnectivityManager bdConnManager       = null;
    ……

        /*扩展广播监听类BroadcastReceiver,实现onReceive()方法*/
        public class BdMapSDKReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {

                …...
                //百度Android SDK密钥验证成功
                }else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK)) {

                    tTipForBdMap.setText("key有效 + 有NetWork连接[有流量的话,BaiduMap:]");

                    /* 检查当前是否连接有网络 */
                    if (!isNetworkConnected(context)) {
                        tTipForBdMap.setText("请连接网络");
                    }
                }
            }
        }


    /* 检查当前是否连接有网络 */
    public boolean isNetworkConnected(Context context) {
        if (context != null) {
            bdConnManager= (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = bdConnManager.getActiveNetworkInfo();

            if (networkInfo == null) return false;
        }

        return true;
    }

关闭Android设备网络连接,将程序下载到Android设备中运行,结果如下:
这里写图片描述
图5. 百度地图密钥验证通过无网络连接时的提示

在上图状态下恢复Android设备网络连接,获得百度地图视图新状态:
这里写图片描述
图6.恢复网络连接时,百度地图视图显示,但连接网络提示未变

当连接到网络时,在TextView视图中的提示应该改变,这可以通过监听当有网络接入时更改提示。
BdMapMainActivity.java

......
public class BdMapMainActivity extends AppCompatActivity {

    ......
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ......
        /* 为广播监听添加监听事件 */
        addIntentFilterAction();
    }
    ......

    /*扩展广播监听类BroadcastReceiver,实现onReceive()方法*/
    public class BdMapSDKReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {

            //获取接收到的意图
            String  action  = intent.getAction();

            ……
               //网络连接改变
            } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

                if (!isNetworkConnected(context)) {
                    tTipForBdMap.setText("网络连接关闭");
                } else if (isNetworkConnected(context))  {
                    tTipForBdMap.setText("key有效 + 有NetWork连接[有流量的话,BaiduMap:]");
                }
            }
        }
    }

    /* 为广播监听添加监听事件 */
    private void addIntentFilterAction() {
        bdiFilter= new IntentFilter();

        //百度地图
        bdiFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
        bdiFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK);
        bdiFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);

        //网络
        bdiFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    }
    ……
}

往BdMapMainActivity.java文件中加入监听ConnectivityManager.CONNECTIVITY_ACTION广播后,当网络连接发生改变时,系统就会发出ConnectivityManager.CONNECTIVITY_ACTION广播,在onResume()中注册的广播监听实例就能够接收到此广播。根据此广播就能够改变文本显示控件的内容 - 有网络接入或连接的网络发生改变时,广播监听器都能够监听到从而进入程序中的“网络连接分支中”。

“密钥验证失败和未连网提示”的AS版练习代码地址:LearnBdMapBasic4

2015.12.04

5. 百度基础地图

不含开发指南中提到的“地图类型”、“实时交通图”、“百度城市热力图”、“地图标注”、“检索结果覆盖物”、“OpenGL”、“TextureMapView渲染”、“瓦片图层”等块。以后若用再验。

5.1 简介

开发者可利用SDK提供的接口,使用百度提供的基础地图数据。目前百度地图SDK提供的地图等级为3 - 19级。所有叠加或覆盖到地图的内容被统称为地图覆盖物(如标注、矢量图形元素、定位图等)。百度地图SDK为开发者提供的基础地图和上面的各种覆盖物元素,具有一定的层级压盖关系,具体如下(从下至上的顺序):
[1] 基础底图(包括底图、底图道路、卫星图等);
[2] 瓦片图层(TileOverlay);
[3] 地形图图层(GroundOverlay);
[4] 热力图图层(HeatMap);
[5] 实时路况图图层(BaiduMap.setTrafficEnabled(true););
[6] 百度城市热力图(BaiduMap.setBaiduHeatMapEnabled(true););
[7] 底图标注(指的是底图上面自带的那些POI元素);
[8] 几何图形图层(点、折线、弧线、圆、多边形);
[9] 标注图层(Marker),文字绘制图层(Text);
[10] 指南针图层(当地图发生旋转和视角变化时,默认出现在左上角的指南针);
[11] 定位图层(BaiduMap.setMyLocationEnabled(true););
[12] 弹出窗图层(InfoWindow);
[13] 自定义View(MapView.addView(View););
源文档 http://developer.baidu.com/map/index.php?title=androidsdk/guide/basicmap

5.2 标注覆盖物 - 层9

可利用标注覆盖物在地图指定位置上添加标注信息。

(1) 标注

新建BdMapBasicLevelApplication.java。

package xndx.learnbdmapbasic;

import android.app.Application;

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;

/**
 * Created by lxr on 2015/12/4.
 * 通过百度地图SDK接口简单操作百度地图的基础图层
 */
public class BdMapBasicLevelApplication extends Application {

    private BaiduMap    bdMap   = null;


    /* 获取地图控制器 */
    public boolean getBdMapControl(MapView mapView) {
        if (mapView != null) {
            bdMap   = mapView.getMap();
            return true;
        }
        return false;
    }

    /* 百度地图标注(Marker)、文字绘制(Text)图层 */
    public void markTextBdMapLevel() {

        if (bdMap != null) {
            //定义Marker坐标
            LatLng point   = new LatLng(39.963175, 116.400244);

            //构建marker图标
            BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher);

            //构建MarkerOption,用于在地图上添加Marker
            OverlayOptions  option  = new MarkerOptions().position(point).icon(bitmap);

            //在地图上天际Marker并显示
            bdMap.addOverlay(option);
        }
    }
}

将安卓的默认启动图标拷贝到了res/drawable目录下。(涉及到的类见其类参考。)

activity_bd_map_main.xml

……
 <TextView
        android:id="@+id/tTipForBdMap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Button
        android:id="@+id/bBdMapLevel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加标注"/>
......

BdMapMainActivity.java

......
public class BdMapMainActivity extends AppCompatActivity {

   ......
    /* 百度地图基础地图 */
    private Button  bBdMapLevel = null;
    private BdMapBasicLevelApplication  bdMapLevelApp   = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ......
        /* ------百度基础地图层------ */
        bBdMapLevel = (Button)this.findViewById(R.id.bBdMapLevel);
        bBdMapLevel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bdMapLevelApp   = (BdMapBasicLevelApplication)getApplication();
                bdMapLevelApp.getBdMapControl(bdMapView);
                bdMapLevelApp.markTextBdMapLevel();
            }
        });
    }
    ......
}

通过AS下载程序到Android设备中运行:
这里写图片描述
图7. 点击“添加标注”按钮之前

这里写图片描述
图8.点击“添加按钮”之后将安卓默认图标标注到了程序指定的位置(且标注随地图的移动而移动)

2015.12.05

(2) 事件监听

见BaiduMap类,可设置具多监听方法 - 通过BaiduMap对象设置监听方法。以监听地图被点击事件方法为例。

只要确保百度地图点击事件监听方法在地图被点击前被运行过一次,百度地图就能自动捕捉到百度地图被点击事件。

public class BdMapBasicLevelApplication extends Application {

    private BaiduMap    bdMap   = null;


    /* 获取地图控制器 */
    public boolean getBdMapControl(MapView mapView) {
        if (mapView != null) {
            bdMap   = mapView.getMap();

            //设置监听百度地图点击事件的方法
            bdMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
                @Override
                public void onMapClick(LatLng latLng) {
                    bdMap.clear();  //清空地图所有的 Overlay 覆盖物(以及 InfoWindow)
                }

                @Override
                public boolean onMapPoiClick(MapPoi mapPoi) {
                    return false;
                }
            });
            return true;
        }
        return false;
    }
......
}

在点击“添加标注”按钮时,getBdMapControl()方法被调用,从而注册了BaiduMap被点击事件的监听方法。所以,只要后续地图被点击,系统就会进入onMapClick()运行。在这里,此方法中包含了清空地图所有的 Overlay 覆盖物的方法。

在AS中编译程序,重新下载到Android手机上运行。点击“添加标注”按钮,安卓图标作为地图标注出现在地图上,点击地图,安卓图标标注消失。

2015.12.07

(3) 文字覆盖物

文字,在地图中也是一种覆盖物,开发者可利用相关的接口,快速实现在地图上书写文字的需求。

BdMapBasicLevelApplication.java

    /* 百度地图标注(Marker)、文字绘制(Text)图层 */
    public void markTextBdMapLevel() {

        if (bdMap != null) {
                      ......

            //定义文字所显示的坐标点
            LatLng llText = new LatLng(39.86923, 116.397428);
            //构建文字Option对象,用于在地图上添加文字
            OverlayOptions textOption = new TextOptions()
                    .bgColor(0xAAFFFF00)        //文字背景颜色
                    .fontSize(48)               //字体大小
                    .fontColor(0xFFFF00FF)      //字体颜色
                    .text("西大25教lab1012")        //文字
                    .rotate(30)                //字体旋转角度
                    .position(llText);          //放置文字的位置

            //在地图上添加Marker、text并显示
            bdMap.addOverlay(options);
            bdMap.addOverlay(textOption);
        }
    }

在AS中编译此段程序,下载到Android手机上运行,点击“覆盖物”按钮后显示所有的覆盖物,文字覆盖物截图如下所示:
这里写图片描述
图9. 文字覆盖物

(4) 涉及到的类

BaiduMap
MarkerOptions
TextOptions
OverlayOptions
BitmapDescriptorFactory

5.3 几何图层覆盖物 - 层8

地图SDK提供多种结合图形覆盖物,利用这些图形,可帮助您构建更加丰富多彩的地图应用。目前提供的几何图形有:点(Dot)、折线(Polyline)、弧线(Arc)、圆(Circle)、多边形(Polygon)。
源文档 http://developer.baidu.com/map/index.php?title=androidsdk/guide/basicmap

(1) 几何图层覆盖物 - 折线

根据百度地图官方开发指南也在地图上绘制覆盖物。在本例中的步骤如下。

BdMapBasicLevelApplication.java

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

/**
 * Created by lxr on 2015/12/4.
 * 通过百度地图SDK接口简单操作百度地图的基础图层
 */
public class BdMapBasicLevelApplication extends Application {

    private BaiduMap    bdMap   = null;
    …...
    /* 百度地图几何图形覆盖物 */
    public void drawBdMapLevel() {
        if (bdMap != null) {

            //构建折线点坐标
            List<LatLng>    points  = new ArrayList<LatLng>();
            points.add(new LatLng(39.965, 116.404));
            points.add(new LatLng(39.925, 116.454));
            points.add(new LatLng(39.955, 116.494));
            points.add(new LatLng(39.905, 116.554));
            points.add(new LatLng(39.965, 116.604));

            //构建分段亚瑟索引数组
            List<Integer>   colors  = new ArrayList<>();
            colors.add(Integer.valueOf(Color.BLACK));
            colors.add(Integer.valueOf(Color.RED));
            colors.add(Integer.valueOf(Color.YELLOW));
            colors.add(Integer.valueOf(Color.BLUE));

            //构建绘制对变形对象
            OverlayOptions ooPolyLine   = new PolylineOptions()
                    .width(20)
                    .colorsValues(colors)
                    .points(points);

            //添加到地图的覆盖物层中
            bdMap.addOverlay(ooPolyLine);
        }
    }
}

BdMapMainActivity.java

……
public class BdMapMainActivity extends AppCompatActivity {

    ......
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ......

        /* ------百度基础地图层------ */
        bBdMapLevel = (Button)this.findViewById(R.id.bBdMapLevel);
        bBdMapLevel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bdMapLevelApp   = (BdMapBasicLevelApplication)getApplication();
                bdMapLevelApp.getBdMapControl(bdMapView);   //将MapView赋予application中的BaiduMap对象
                bdMapLevelApp.markTextBdMapLevel();         //标注、文本层覆盖物
                bdMapLevelApp.drawBdMapLevel();             //几何图形绘制层覆盖物
            }
        });
    }

    ......
}

在res/layout/activity_bd_map_main.xml中按钮的文本改为“覆盖物”。在AS中重新编译程序下载到Android手机上运行。
这里写图片描述
图10. 点击“覆盖物按钮”往地图上添加的“图标”和“绘制的集合图形”覆盖物,点击地图覆盖物消失

(2) 涉及到的类

BaiduMap
PolylineOptions
OverlayOptions
java类:List

5.4 弹出窗覆盖物 - 层12

开发者可利用InfoWindow接口构建具有更强交互性的地图页面。一个InfoWindow接口的简单示例如下:

BdMapBasicLevelApplication.java

......
/**
 * Created by lxr on 2015/12/4.
 * 通过百度地图SDK接口简单操作百度地图的基础图层
 */
public class BdMapBasicLevelApplication extends Application {

    ......
    /*百度地图弹出窗覆盖物-层12*/
    public void showInfoWindowBdMapLevel() {

        //创建InfoWindow展示的View
        TextView    tInfo   = new TextView(getApplicationContext());
        tInfo.setText("由InfoWindows弹出显示");
        tInfo.setTextColor(Color.BLACK);

        //定义用于显示该InfoWindow的坐标点
        LatLng positon  = new LatLng(39.86923, 116.397428);

        //创建InfoWindow,传入展示的View,地理坐标,y轴偏移量
        InfoWindow  mInfoWindow = new InfoWindow(tInfo, positon, -47);
        //显示InfoWindos
        bdMap.showInfoWindow(mInfoWindow);
    }
}

BdMapMainActivity.java

……
public class BdMapMainActivity extends AppCompatActivity {

   ……
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       ……

        /* ------百度基础地图层------ */
        bBdMapLevel = (Button)this.findViewById(R.id.bBdMapLevel);
        bBdMapLevel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               ……
                bdMapLevelApp.showInfoWindowBdMapLevel();   //弹出覆盖物
            }
        });
    }
    ……
}

在AS中重新编译程序,然后将程序下载到Android手机上运行,弹出窗覆盖物截图如下:
这里写图片描述
图11. 点击“覆盖物”按钮,显示弹出窗覆盖物,所有覆盖物将会消失

5.5 地形图图层-层3

地形图图层(GroundOverlay),又可叫做图片图层,即开发者可在地图的指定位置上添加图片。该图片可随地图的平移、缩放、旋转等操作做相应的变换。该图层是一种特殊的Overlay, 它位于底图和底图标注层之间(即该图层不会遮挡地图标注信息)。
源文档 http://developer.baidu.com/map/index.php?title=androidsdk/guide/basicmap#.E5.9C.B0.E5.BD.A2.E5.9B.BE.E5.9B.BE.E5.B1.82

在百度地图中使用地形图覆盖物的方式如下 - 使用GroundOverlayOptions接口:
BdMapBasicLevelApplication.java

......
/**
 * Created by lxr on 2015/12/4.
 * 通过百度地图SDK接口简单操作百度地图的基础图层
 */
public class BdMapBasicLevelApplication extends Application {

   ......
    /* 百度地图地形图图层 - 层3 */
    public void showGroundBdMapLevel() {

        //定义Ground的显示地理范围
        LatLng southwest    = new LatLng(39.92235, 116.380338);
        LatLng northeast    = new LatLng(39.997246, 116.514977);
        LatLngBounds bounds = new LatLngBounds
                .Builder()
                .include(northeast)
                .include(southwest)
                .build();
        //定义Ground显示的图片
        BitmapDescriptor bdGround   = BitmapDescriptorFactory
                .fromResource(R.drawable.wk);
        //定义Ground覆盖物选项
        OverlayOptions ooGround = new GroundOverlayOptions()
                .positionFromBounds(bounds)
                .image(bdGround)
                .transparency(0.8f);
        //在百度地图中添加Ground覆盖物
        bdMap.addOverlay(ooGround);
    }
}

在res/drawable下添加wk.png图片。

……
public class BdMapMainActivity extends AppCompatActivity {

    ......
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ......

        /* ------百度基础地图层------ */
        bBdMapLevel = (Button)this.findViewById(R.id.bBdMapLevel);
        bBdMapLevel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bdMapLevelApp   = (BdMapBasicLevelApplication)getApplication();
                bdMapLevelApp.getBdMapControl(bdMapView);   //将MapView赋予application中的BaiduMap对象
                             …...
                bdMapLevelApp.showGroundBdMapLevel();       //地形图图覆盖物
            }
        });
    }

    ......
}

在AS中重新编译程序,将程序下载到Android手机上运行,地形图图层覆盖物的截图如下:
这里写图片描述
图12. 点击“覆盖物”按钮,显示百度地形地图覆盖物,所有覆盖物将会消失

5.6 百度地图热力图功能(HeatMap)

热力图是用不同颜色的区块叠加在地图上描述人群分布、密度和变化趋势的一个产品,百度地图SDK将绘制热力图的能力为广大开发者开放,帮助开发者利用自有数据,构建属于自己的热力图,提供丰富的展示效果。
源文档 http://developer.baidu.com/map/index.php?title=androidsdk/guide/basicmap#.E7.83.AD.E5.8A.9B.E5.9B.BE.E5.8A.9F.E8.83.BD

利用热力图功能构建自有数据热力图的方式如下。
BdMapBasicLevelApplication.java

…...
/**
 * Created by lxr on 2015/12/4.
 * 通过百度地图SDK接口简单操作百度地图的基础图层
 */
public class BdMapBasicLevelApplication extends Application {

    …...
    /* 百度地图热力图功能 -层4*/
    public void showHeatBdMapLevel() {

        //设置渐变颜色值
        int[] DEFAULT_GRADIENT_COLORS = {Color.rgb(102, 225, 0), Color.rgb(255, 0, 0)};
        //设置渐变颜色起始值
        float[] DEFAULT_GRADIENT_START_POINTS = {0.2f, 1f};
        //构造颜色渐变对象
        Gradient gradient   = new Gradient(DEFAULT_GRADIENT_COLORS, DEFAULT_GRADIENT_START_POINTS);


        //随机生成地理位置点
        List<LatLng> randomList = new ArrayList<LatLng>();
        Random r    = new Random();
        for (int i = 0; i < 500; i++) {

            //116.220000, 39.780000 - 116.570000, 40.150000
            int rlat    = r.nextInt(370000);
            int rlng    = r.nextInt(370000);
            int lat     = 39780000 + rlat;
            int lng     = 116220000 + rlng;

            LatLng ll   = new LatLng(lat / 1E6, lng / 1E6);
            randomList.add(ll);
        }


        //添加、显示热力图
        /*在大量热力图数据情况下,build过程相对较慢,建议放在新建线程中 */
        HeatMap heatMap = new HeatMap.Builder()
                .data(randomList)
                .gradient(gradient)
                .build();
        //添加热力图
        bdMap.addHeatMap(heatMap);

        //删除热力图
        //heatMap.removeHeatMap();
    }
}

BdMapMainActivity.java

......
public class BdMapMainActivity extends AppCompatActivity {

     ......
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ......

        /* ------百度基础地图层------ */
        bBdMapLevel = (Button)this.findViewById(R.id.bBdMapLevel);
        bBdMapLevel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bdMapLevelApp   = (BdMapBasicLevelApplication)getApplication();
                bdMapLevelApp.getBdMapControl(bdMapView);   //将MapView赋予application中的BaiduMap对象
                              ……
                   bdMapLevelApp.showHeatBdMapLevel();             //热力图
            }
        });
    }

    ......
}

将activity_bd_map_main.xml中“覆盖物”按钮的文字内容改为“bd基础地图层”。

在AS中重新编译程序,将程序下载到Android手机上运行。热力图运行结果截图如下。
这里写图片描述
图13. 点击“bd基础地图层”按钮显示的热力图[删除热力图应该用HeatMap.removeHeatMap()方法]

编写百度地图基础地图的程序步骤:百度地图开发指南探到相应部分的步骤(类) –> 根据设计的程序结构和逻辑编写程序。

“百度地图基础地图”的AS版练习代码地址:LearnBdMapBasic5

2015.12.08

6 定位当前位置

百度地图Android定位SDK v6.1.3(全球定位支持)
百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的LBS定位服务接口,专注于为广大开发者提供最好的综合定位服务,通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、精准、高效的定位功能。

百度地图Android定位SDK提供GPS,基站,Wi-Fi等多种定位方式,适用于室、内外多种定位场景,具有出色的定位性能:定位精度高、覆盖率广、网络定位请求流量小、定位速度快。
源文档 http://developer.baidu.com/map/index.php?title=android-locsdk

以开发指南“使用百度定位SDK获取形影位置信息,然后利用地图SDK中的忌口,在地图上展示实时位置信息”为起点看定位的使用。

6.1 百度地图Android (基础地图 + 定位)SDK配置

百度地图Android SDK页面下载包含“基础地图”和“定位功能”的开发包。按照配“[配置百度地图移动版开发环境(Android Studio)] - 3 百度地图Android SDK在AS中的配置”置百度地图开发环境。

6.2 利用百度地图Android SDK定位当前位置

(1) 使用定位相关的类
新建BdMapLocationActivity.java文件。
BdMapLocationActivity.java

package xndx.learnbdmapbasic;

import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

/**
 * Created by lxr on 2015/12/8.
 * 使用百度地图Android SDK定位当前位置
 */
public class BdMapLocationActivity extends Activity {

    /* 视图相关 */
    private MapView     mapView = null;
    private BaiduMap    bdMap   = null;

    boolean isFirstLoc  = true; //是否首次定位

    /* 定位相关类 */
    private LocationClient          locClient           = null;
    private BdMapLocationListenner  bdLocListener       = new BdMapLocationListenner();
    private MyLocationConfiguration.LocationMode locMode    =
            MyLocationConfiguration.LocationMode.NORMAL;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bd_map_loc);

        //获取百度地图控制器
        mapView = (MapView)this.findViewById(R.id.bdMapView);
        bdMap   = mapView.getMap();

        //开启定位图层
        bdMap.setMyLocationEnabled(true);

        //定位初始化
        locClient   = new LocationClient(getApplicationContext());
        locClient.registerLocationListener(bdLocListener);
        setLocationOption();

        //开始定位
        locClient.start();
    }

    /* 定位SDK监听函数 */
    public class BdMapLocationListenner implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            if (mapView == null || bdLocation == null)
                return;

            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(bdLocation.getRadius())
                     // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(bdLocation.getLatitude())
                    .longitude(bdLocation.getLongitude()).build();
            bdMap.setMyLocationData(locData);

            //设置定位数据(定位模式,是否允许方向信息,用户自定义图标)
            BitmapDescriptor locMarker  = BitmapDescriptorFactory
                    .fromResource(R.drawable.loc_icon);
            MyLocationConfiguration locConfig   = new MyLocationConfiguration(locMode, true, locMarker);
            bdMap.setMyLocationConfigeration(locConfig);

            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(bdLocation.getLatitude(),
                        bdLocation.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                bdMap.animateMapStatus(u);
            }
        }
    }

    /* 设置定位参数 */
    private void setLocationOption() {
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        option.setCoorType("bd0911");   //返回的定位结果是百度经纬度,默认值gcj02
        option.setScanSpan(1000);       //设置发起定位请求的间隔时间为1000ms

        locClient.setLocOption(option);
    }


    /* 管理活动(百度地图)生命周期 */
    @Override
    protected void onPause() {
        mapView.onPause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        mapView.onResume();
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        //活动退出时停止定位,关闭定位图层
        locClient.stop();
        bdMap.setMyLocationEnabled(false);
        mapView.onDestroy();
        mapView = null;
        super.onDestroy();
    }
}

在/res/drawable目录下添加一张loc_icon.png突变,作为定位图标。

在百度地图上获取当前位置有3个关键的地方
- MyLocationData - 获取到当地的(地图坐标)信息
- LocationClientOption - 设置定位请求的间隔时间,每个1000ms发出一个定位请求
- BDLocationListener - 系统(百度地图Android SDK)每发出定位请求时,其内的onReceiveLocation()方法被自动调用

activity_bd_map_loc.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bdMapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.baidu.mapapi.map.MapView>

</LinearLayout>

BdMapMainActivity.java

......
public class BdMapMainActivity extends AppCompatActivity {

    ……
    /* 百度地图定位 */
    private Button bBdMapLocation                   = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ......

        /* 百度地图定位 */
        bBdMapLocation  = (Button)this.findViewById(R.id.bBdMapLocation);
        bBdMapLocation.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent   = new Intent(BdMapMainActivity.this, BdMapLocationActivity.class);
                startActivity(intent);
            }
        });
    }
    ......
}

当点击主活动中的“定位按钮”时,通过意图Intent来启动BdMapLocationActivity活动。

activity_bd_map_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"...

    <TextView
        android:id="@+id/tTipForBdMap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/bBdMapLevel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="bd基础地图层"/>
        <Button
            android:id="@+id/bBdMapLocation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/bBdMapLevel"
            android:text="定位"/>
    </RelativeLayout>

    <!-- 显示百度地图视图控件 -->
    <com.baidu.mapapi.map.MapView
        android:id="@+id/bdMapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.baidu.mapapi.map.MapView>
</LinearLayout>

(2) 注册

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ……>

    <application
        android:name=".BdMapBasicLevelApplication"
        ……>

        <!-- 百度基础地图开发密钥 -->
        ……
        <!-- 百度地图定位 -->
        <activity android:name=".BdMapLocationActivity">

        </activity>

        <!-- 定位服务 -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote">
        </service>
    </application>
    ……
</manifest>

主要是在AndroidManifest.xml清单文件中注册定位活动BdMapLocationActivity与定位服务com.baidu.location.f。

在AS中编译程序。将程序下载到Android手机上并运行。定位截图如下:
这里写图片描述
图14. 在启动活动中点击“定位”按钮启动定位活动定位到当前位置 - 北碚

双击定位图标所在位置,见更详细的位置:
这里写图片描述
图15. 双击百度地图观察更详细的位置(还不太精准)

百度地图定位当前位置的AS练习代码保存地址:LearnBdMapBasic6

2015.12.09

7. 周边雷达

7.1 简介·摘

周边雷达功能,是面向移动端开发者的一套SDK功能接口。同步支持Android和iOS端。它的本质是一个连接百度LBS开放平台前端SDK产品和后端LBS云的中间服务。开发者利用周边雷达功能,可以便捷的在自己的应用内,帮助用户实现查找周边跟“我”使同样一款App的人,这样一个功能。周边雷达功能的典型使用场景:
[1] 查看周边都有谁跟“我”使用同一个App,分布在哪里?
[2] 查看周边用户在听什么歌、看什么文章、有什么新动态?
[3] 查看周边有什么最新发生的新闻、资讯?
源文档 http://developer.baidu.com/map/index.php?title=androidsdk/guide/radar

7.2 使用“周边雷达功能”的流程

(1) 注册“周边雷达功能”

到“周边雷达管理页面”用应用AK注册周边雷达功能。

(2) 下载含“周边雷达功能”的百度地图Android SDK

到“百度地图Android SKD下载页面”下载包含“基础地图”、“定位功能”以及“周边雷达”模块的开发包、示例代码以及类参考。

将下载的.jar包和.so文件导入到AS的LearnBdMapBasic工程中。

12.14

(3) 调用百度地图“周边雷达功能”API

[1] 读“周边雷达功能”类参考
类名 描述
RadarSearchManager 周边雷达管理类
RadarNearbyResult 查询周边结果结构
RadarNearbyInfo 周边人信息结构
RadarNearbySearchOption 查找周边人参数对象
RadarNearbySearchSortType 排序策略
RadarSearchError 周边雷达结果状态定义
RadarSearchListener 查询周边监听
RadarUploadInfo 上传的个人信息
RadarUploadInfoCallback 上传信息回调
[2] 百度地图“周边雷达功能”API(使用)流程

以“位置信息”单词上传为例:
通过RadarSearchManager对象初始化周边雷达 –> 注册周边雷达监听实例(RadarSearchListener) –>调用主动上传信息的函数(uploadInfoRequest(RadarUploadInfo info))触发回调函数(RadarSearchListener.onGetUploadState(RadarSearchError error))被调用。

在AS中新建BdMapRadarActivity.java文件,实现以上流程(失败 - 没有调用RadarSearchListener.onGetUploadState(RadarSearchError error)函数):

package xndx.learnbdmapbasic;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.radar.RadarNearbyResult;
import com.baidu.mapapi.radar.RadarSearchError;
import com.baidu.mapapi.radar.RadarSearchListener;
import com.baidu.mapapi.radar.RadarSearchManager;
import com.baidu.mapapi.radar.RadarUploadInfo;
import com.baidu.mapapi.radar.RadarUploadInfoCallback;


/**
 * Created by lxr on 2015/12/14.
 * 百度地图周边雷达功能 - 尝试揣摩API的用途(监听 - 运行机理等)
 */
public class BdMapRadarActivity extends Activity implements RadarSearchListener {

    private RadarSearchManager  radarSearchManager  = null;
    private TextView            tRadarMsg           = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bd_map_radar);

        tRadarMsg   = (TextView)this.findViewById(R.id.tRadarMsg);

        //初始化周边雷达功能 - 获取“周边雷达”实例
        radarSearchManager  = RadarSearchManager.getInstance();
        //周边雷达设置用户,id为空默认是设备标识
        radarSearchManager.setUserID("");
        //添加查询周边信息的监听
        radarSearchManager.addNearbyInfoListener(this);

        //准备上传数据
        RadarUploadInfo info    = new RadarUploadInfo();
        info.comments           = "APIs机制";
        LatLng  pt  = new LatLng(39.1, 100.1);
        info.pt                 = pt;

        //请求上传info数据
        radarSearchManager.uploadInfoRequest(info);
    }

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

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

    @Override
    protected void onDestroy() {
        tRadarMsg.setText(null);
        radarSearchManager.removeNearbyInfoListener(this);
        super.onDestroy();
    }

    /* 在实现RadarSearchListener类时,以下三个方法需要被重写 */
    //上传状态监听 - 当有周边雷达上传数据操作后,此函数会被自动调用
    @Override
    public void onGetUploadState(RadarSearchError radarSearchError) {

        if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {

            tRadarMsg.setText("上传成功");

        } else {

            tRadarMsg.setText("上传失败");
        }
    }

    //查询周边的人监听 - 当有周边雷达查询周边的人的操作后,此函数被自动调用
    @Override
    public void onGetNearbyInfoList(RadarNearbyResult radarNearbyResult, RadarSearchError radarSearchError) {

    }

    //清除位置信息监听 - 当周边雷达有清除位置信息操作后,此函数被自动调用
    @Override
    public void onGetClearInfoState(RadarSearchError radarSearchError) {

    }
}

将此活动注册在应用程序的清单文件中。

在BdMapMainActivity中添加按钮来触发BdMapRadarActivity活动的运行,结果 RadarSearchListener.onGetUploadState()函数未被触发调用。不调了,百度地图基础就到这里 - 从百度地图基础改变到APIs中的回调方法(触发)。

[2015.12.09 - 19:22]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值