如何基于百度地图实现融云 SDK 2.8.0+ 发送地理位置

如何基于百度地图实现融云 SDK 2.8.0+ 发送地理位置
发布时间: 2016-11-30 10:06

回答:

集成前准备

- 注册百度地图开放平台,可能需要审核开发者身份

- 创建 Android 应用, 生成 sha1 码获取百度地图 appkey

- 下载百度地图 SDK、 Demo、 Doc


集成代码

集成前需要将百度相关的 jar so 文件 以及 manifest 中需要配置的服务 和 appkey 都配置好,还需要在 application 中调用百度地图的初始化方法。

SDKInitializer.initialize(getApplicationContext());

android_initialize.png

集成前建议把融云 SDK 2.8.0+ Extension 文档通读,这样对概念理解和后面集成都有很大的帮助。

BaiDuLocationPlugin:

public class BaiDuLocationPlugin implements IPluginModule {
    private Conversation.ConversationType conversationType;
    private String targetId;
    @Override
    public Drawable obtainDrawable(Context context) {
        //设置插件 Plugin 图标
        return context.getResources().getDrawable(R.drawable.rc_ext_plugin_location_selector);
    }
    @Override
    public String obtainTitle(Context context) {
        //设置插件 Plugin 展示文字
        return "百度地图";
    }
    @Override
    public void onClick(final Fragment currentFragment, RongExtension extension) {
        //示例获取 会话类型、targetId、Context,此处可根据产品需求自定义逻辑,如:开启新的 Activity 等。
        conversationType = extension.getConversationType();
        targetId = extension.getTargetId();
        //只有通过 extension 中的 startActivityForPluginResult 才会返回到本类中的 onActivityResult
        extension.startActivityForPluginResult(new Intent(currentFragment.getActivity(),BaiDuLocationActivity.class),5, this);
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data != null) {
            double latitude = data.getDoubleExtra("latitude",0.00);
            double longitude = data.getDoubleExtra("longitude",0.00);
            String address = data.getStringExtra("address");
            String uri = data.getStringExtra("locuri");
            LocationMessage locationMessage = LocationMessage.obtain(latitude,longitude,address, Uri.parse(uri));
            RongIM.getInstance().sendLocationMessage(Message.obtain(targetId, conversationType, locationMessage), null, null, null);
        }
    }
}

此类是一个关键类,包含了唤起地图定位的 Activity ,和 onActivityResult 返回相关经纬度数据后的发送地理位置消息逻辑,请通读上面类 和 类中的注释。(参考上面 Plugin 实现可以不用理会 融云 SDK 内部接口地理位置提供者 )


BaiDuLocationActivity:

此类是地图展示的 activity 类,展示成什么逻辑由开发者自己定义。但是最少需要获取到给  BaiDuLocationPlugin 的四个参数为: 纬度,经度,地图的 uri,和位置信息的 String。

public class BaiDuLocationActivity extends BaseActivity{
    public static final int RESULT_CODE = 6;
    MapView mMapView;
    BaiduMap baiduMap;
    private double longitude;
    private double latitude;
    LatLng mLoactionLatLng;
    private String address;
    LocationClient locationClient;
    LocationMessage mMsg;
    boolean isFirstLoc = true;
    Point mCenterPoint;
    GeoCoder mGeoCoder;
    List<PoiInfo> mInfoList;
    PoiInfo mCurentInfo;
    ListView Maplistview;
    PlaceListAdapter customListAdpter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_location);
        initview();
        getimgxy();
    }
    private void initview() {
      Button mRightButton = getHeadRightButton();
        mRightButton.setBackground(getResources().getDrawable(R.drawable.icon1_menu));
        Maplistview = (ListView) findViewById(R.id.mymapListView);
        setTitle("地理位置");
        mRightButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri uri = Uri.parse("http://api.map.baidu.com/staticimage?width=300&height=200&center="+ longitude + "," + latitude + "&zoom=17&markers=" + longitude + "," + latitude + "&markerStyles=m,A");
                Intent intent = new Intent();
                intent.putExtra("latitude", latitude);
                intent.putExtra("longitude", longitude);
                intent.putExtra("address",address);
                intent.putExtra("locuri",uri.toString());
                setResult(RESULT_CODE , intent);
                finish();
            }
        });
        mMapView = (MapView) findViewById(R.id.bmapView);
        mMapView.showZoomControls(false);
        baiduMap = mMapView.getMap();
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(17.0f);
        baiduMap.setMapStatus(msu);
        //开启定位图层
        baiduMap.setMyLocationEnabled(true);
        baiduMap.setOnMapTouchListener(touchListener);
        try {
            if (getIntent().hasExtra("location")) {
                mMsg = getIntent().getParcelableExtra("location");
            }
            if (mMsg != null) {
                Maplistview.setVisibility(View.GONE);
                locationClient = new LocationClient(getApplicationContext()); // 实例化LocationClient类
                MyLocationData locData = new MyLocationData.Builder()
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(100).latitude(mMsg.getLat())
                        .longitude(mMsg.getLng()).build();
                baiduMap.setMyLocationData(locData);    //设置定位数据
                mLoactionLatLng = new LatLng(mMsg.getLat(),
                        mMsg.getLng());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(mLoactionLatLng, 16);    //设置地图中心点以及缩放级别
                baiduMap.animateMapStatus(u);
            } else {
                locationClient = new LocationClient(getApplicationContext()); // 实例化LocationClient类
                locationClient.registerLocationListener(myListener); // 注册监听函数
                this.setLocationOption();    //设置定位参数
                locationClient.start(); // 开始定位
            }
        } catch (Exception e) {
        }
    }
    @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();
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            locationClient.stop();
            Log.d("stop", "定位关闭");
            finish();
        }
        return false;
    }
    /**
     * 设置定位参数
     */
    private void setLocationOption() {
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开GPS
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置定位模式
        option.setCoorType("bd09ll"); // 返回的定位结果是百度经纬度,默认值gcj02
        option.setScanSpan(5000); // 设置发起定位请求的间隔时间为5000ms
        option.setIsNeedAddress(true); // 返回的定位结果包含地址信息
        option.setNeedDeviceDirect(true); // 返回的定位结果