融云&百度地图-实现地理位置发送

来源:互联网 发布:蒙面歌王知乎 编辑:程序博客网 时间:2024/05/13 16:25
  • 注册百度地图开发者账号,获取百度地图的appkey,下载相关的地图jar包
  • 实现融云地理位置点击事件,我是在会话页面设置的监听事件,具体方法可以参考融云的demo
public class ConversationActivity extends AppCompatActivity implements RongIM.LocationProvider,RongIM.ConversationBehaviorListener{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_conversaction);        initview();    }    private  void  initview(){        //设置地理位置监听事件        RongIM.setLocationProvider(this);        RongIM.setConversationBehaviorListener(this);//设置会话界面操作的监听器。    /**     * 位置信息提供者:LocationProvider 的回调方法,打开第三方地图页面。     *     * @param context  上下文     * @param callback 回调     */    @Override    public void onStartLocation(Context context, LocationCallback callback) {         /**         * 在这里写相应的代码,跳转到自己地图activity         */        Tool.mLastLocationCallback=callback;        Intent intent = new Intent(context, MapLocationActivity.class);        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        context.startActivity(intent);    }      /**       * 会话页面监听事件,这里有消息点击事件,头像点击事件,开发者如果有需要的可以自己实现。       */    @Override    public boolean onMessageClick(Context arg0, View arg1, Message arg2) {        // 消息点击事件,判断如果是位置消息就取出Content()跳转到地图activity        if (arg2.getContent() instanceof LocationMessage) {            Intent intent = new Intent(ConversationActivity.this, MapLocationActivity.class);            intent.putExtra("location", arg2.getContent());            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            startActivity(intent);        }        return false;    }    @Override    public boolean onMessageLinkClick(Context arg0, String arg1) {        // TODO Auto-generated method stub        return false;    }    //消息长按事件    @Override    public boolean onMessageLongClick(Context arg0, View arg1, Message arg2) {        // TODO Auto-generated method stub        return false;    }    //头像点击事件    @Override    public boolean onUserPortraitClick(Context arg0, Conversation.ConversationType arg1,                                       UserInfo arg2) {        // TODO Auto-generated method stub        return false;    }    //头像长按事件    @Override    public boolean onUserPortraitLongClick(Context arg0, Conversation.ConversationType arg1,                                           UserInfo arg2) {        // TODO Auto-generated method stub        return false;    }}
  • 新建MapLocationActivity实现地图绘制定位等功能
package htf.scme.org.Activity;import android.graphics.Point;import android.location.Location;import android.net.Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.RelativeLayout;import android.widget.TextView;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.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MyLocationData;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.geocode.GeoCodeResult;import com.baidu.mapapi.search.geocode.GeoCoder;import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;import java.util.ArrayList;import java.util.List;import htf.scme.org.bgims.CustomListAdpter;import htf.scme.org.bgims.PlaceListAdapter;import htf.scme.org.bgims.R;import htf.scme.org.bgims.Tool;import io.rong.message.LocationMessage;public class MapLocationActivity extends AppCompatActivity {  MapView mMapView;  BaiduMap baiduMap;  private TextView text_go, toolbar_tetle;  private RelativeLayout btn_go;  //当前经纬度  private double jingdu;  private double weidu;  LatLng mLoactionLatLng;  private String adderss = "";  // 定位相关声明  LocationClient locationClient;  LocationMessage mMsg;  //自定义图标  boolean isFirstLoc = true;// 是否首次定位  // MapView中央对于的屏幕坐标  Point mCenterPoint = null;  // 地理编码  GeoCoder mGeoCoder = null;  // 位置列表  ListView mListView;  // PlaceListAdapter mAdapter;  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() {    text_go = (TextView) findViewById(R.id.toolbar_edit);    btn_go = (RelativeLayout) findViewById(R.id.btn_go);    toolbar_tetle = (TextView) findViewById(R.id.toolbar_tetle);    Maplistview = (ListView) findViewById(R.id.mymapListView);    text_go.setText("发送");    toolbar_tetle.setText("地理位置");    btn_go.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=" + jingdu + "," + weidu + "&zoom=17&markers=" + jingdu + "," + weidu + "&markerStyles=m,A");        LocationMessage locationMessage = LocationMessage.obtain(weidu, jingdu, adderss, uri);        //如果地图地位成功,那么调用        Tool.mLastLocationCallback.onSuccess(locationMessage);        //如果地图地位失败,那么调用        Tool.mLastLocationCallback.onFailure("定位失败!");        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);    //!!!!!这里需要注意,这段代码是第二次点击会话页面的位置消息跳过来的,判断message里面是否有值,如果有就说明是从会话页面的消息体点击过来的,取出来里面的经纬度,设置到地图中,如果没值就正常实例化地图,开启定位。--------//    try {      if (getIntent().hasExtra("location")) {        mMsg = getIntent().getParcelableExtra("location");      }      if (mMsg != null) {        btn_go.setVisibility(View.INVISIBLE);        text_go.setText("");        Maplistview.setVisibility(View.GONE);        locationClient = new LocationClient(getApplicationContext()); // 实例化LocationClient类        MyLocationData locData = new MyLocationData.Builder()        /*.accuracy(location.getRadius())*/          // 此处设置开发者获取到的方向信息,顺时针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); // 返回的定位结果包含手机机头的方向    locationClient.setLocOption(option);  }  public BDLocationListener myListener = new BDLocationListener() {    @Override    public void onReceiveLocation(BDLocation location) {      // map view 销毁后不在处理新接收的位置      if (location == null || mMapView == null)        return;        //定位成功之后,我定义了三个变量,去出来对应的经纬度,以及位置信息,用来生成静态地图,发送到会话页面。      weidu = location.getLatitude();      jingdu = location.getLongitude();      adderss = location.getAddrStr();      MyLocationData locData = new MyLocationData.Builder()        // 此处设置开发者获取到的方向信息,顺时针0-360        .direction(100).latitude(location.getLatitude())        .longitude(location.getLongitude()).build();      baiduMap.setMyLocationData(locData);    //设置定位数据      if (isFirstLoc) {        isFirstLoc = false;        mLoactionLatLng = new LatLng(location.getLatitude(),          location.getLongitude());        MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(mLoactionLatLng, 20);//设置地图中心点以及缩放级别        baiduMap.animateMapStatus(u);      }      // 获取当前MapView中心屏幕坐标对应的地理坐标      LatLng currentLatLng;      currentLatLng = baiduMap.getProjection().fromScreenLocation(        mCenterPoint);      System.out.println("----" + mCenterPoint.x);      System.out.println("----" + currentLatLng.latitude);      // 发起反地理编码检索      mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())        .location(currentLatLng));    }  };  /**   * 初始化地图物理坐标   */  private void getimgxy() {    // 初始化POI信息列表    mInfoList = new ArrayList<PoiInfo>();    mCenterPoint = baiduMap.getMapStatus().targetScreen;    mLoactionLatLng = baiduMap.getMapStatus().target;// 地理编码    mGeoCoder = GeoCoder.newInstance();    mGeoCoder.setOnGetGeoCodeResultListener(GeoListener);    customListAdpter = new PlaceListAdapter(getLayoutInflater(), mInfoList);    Maplistview.setAdapter(customListAdpter);    Maplistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {      @Override      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {        customListAdpter.clearSelection(i);        customListAdpter.notifyDataSetChanged();        locationClient.stop();        baiduMap.clear();        PoiInfo info = (PoiInfo) customListAdpter.getItem(i);        LatLng la = info.location;        weidu = la.latitude;        jingdu = la.longitude;        adderss = info.address;        MyLocationData locData = new MyLocationData.Builder()        /*.accuracy(location.getRadius())*/          // 此处设置开发者获取到的方向信息,顺时针0-360          .direction(100).latitude(la.latitude)          .longitude(la.longitude).build();        baiduMap.setMyLocationData(locData);        //设置定位数据        mLoactionLatLng = new LatLng(la.latitude,          la.longitude);        MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(mLoactionLatLng, 20);    //设置地图中心点以及缩放级别        baiduMap.animateMapStatus(u);      }    });  // 地理编码监听器  OnGetGeoCoderResultListener GeoListener = new OnGetGeoCoderResultListener() {    public void onGetGeoCodeResult(GeoCodeResult result) {      if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {        // 没有检索到结果      }      // 获取地理编码结果    }    @Override    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {      if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {        // 没有找到检索结果      }      // 获取反向地理编码结果      else {        // 当前位置信息        mCurentInfo = new PoiInfo();        mCurentInfo.address = result.getAddress();        mCurentInfo.location = result.getLocation();        mCurentInfo.name = "[位置]";        mInfoList.clear();        mInfoList.add(mCurentInfo);        // 将周边信息加入表        if (result.getPoiList() != null) {          mInfoList.addAll(result.getPoiList());        }        // 通知适配数据已改变        customListAdpter.notifyDataSetChanged();       /* mLoadBar.setVisibility(View.GONE);*/      }    }  };  // 地图触摸事件监听器  BaiduMap.OnMapTouchListener touchListener = new BaiduMap.OnMapTouchListener() {    @Override    public void onTouch(MotionEvent event) {      // TODO Auto-generated method stub      if (event.getAction() == MotionEvent.ACTION_UP) {        if (mCenterPoint == null) {          return;        }        // 获取当前MapView中心屏幕坐标对应的地理坐标        LatLng currentLatLng;        currentLatLng = baiduMap.getProjection().fromScreenLocation(          mCenterPoint);        System.out.println("----" + mCenterPoint.x);        System.out.println("----" + currentLatLng.latitude);        // 发起反地理编码检索        mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())          .location(currentLatLng));        //mLoadBar.setVisibility(View.VISIBLE);      }    }  };}
package htf.scme.org.bgims;import android.graphics.Color;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.baidu.mapapi.search.core.PoiInfo;import java.util.List;/** * Created by Administrator on 2016/5/6. */public class PlaceListAdapter extends BaseAdapter {  List<PoiInfo> mList;  LayoutInflater mInflater;  int notifyTip ;  private int selectedPosition=0;private class MyViewHolder {  TextView placeName;  TextView placeAddree;}  public PlaceListAdapter(LayoutInflater mInflater , List<PoiInfo> mList) {    super();    this.mList = mList;    this.mInflater = mInflater;    notifyTip = -1 ;  }  /**   * 设置第几个item被选择   * @param notifyTip   */  public void setNotifyTip(int notifyTip) {    this.notifyTip = notifyTip;  }  @Override  public int getCount() {    // TODO Auto-generated method stub    return mList.size();  }  @Override  public Object getItem(int position) {    // TODO Auto-generated method stub    return mList.get(position);  }  @Override  public long getItemId(int position) {    // TODO Auto-generated method stub    return position;  }  public  void clearSelection(int p){    selectedPosition = p;  }  @Override  public View getView(int position, View convertView, ViewGroup parent) {    // TODO Auto-generated method stub    MyViewHolder holder;    if (convertView == null) {      System.out.println("----aa-");      convertView = mInflater.inflate(R.layout.maplistitem, parent, false);      holder = new MyViewHolder();      holder.placeName = (TextView) convertView        .findViewById(R.id.mapname);      holder.placeAddree = (TextView) convertView        .findViewById(R.id.mapaddress);      holder.placeName.setText(mList.get(position).name);      holder.placeAddree.setText(mList.get(position).address);      convertView.setTag(holder);    } else {      holder = (MyViewHolder) convertView.getTag();    }    holder.placeName.setText(mList.get(position).name);    holder.placeAddree.setText(mList.get(position).address);    //根据重新加载的时候第position条item是否是当前所选择的,选择加载不同的图片    if(selectedPosition == position ){      holder.placeName.setTextColor(Color.parseColor("#ff6501"));      holder.placeAddree.setTextColor(Color.parseColor("#ff6501"));    }    else {      holder.placeName.setTextColor(Color.parseColor("#000000"));      holder.placeAddree.setTextColor(Color.parseColor("#8f605f5f"));    }    return convertView;  }  }

activity_map_location.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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:orientation="vertical"    tools:context="htf.scme.org.Activity.MapLocationActivity">    <include layout="@layout/custom_toolbar" />    <RelativeLayout        android:layout_width="match_parent"        android:layout_weight="1"        android:layout_height="wrap_content">        <com.baidu.mapapi.map.MapView        android:id="@+id/bmapView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:clickable="true"        android:layout_alignParentTop="true"        android:layout_alignParentLeft="true"        android:layout_alignParentStart="true"/>        <ImageView            android:layout_width="29dp"            android:layout_height="29dp"            android:id="@+id/imageView"            android:layout_gravity="center_horizontal"            android:src="@mipmap/weizhi"            android:layout_centerVertical="true"            android:layout_centerHorizontal="true"/>    </RelativeLayout>    <ListView        android:id="@+id/mymapListView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:layout_weight="1">    </ListView></LinearLayout>

代码可能写的有点乱这里说一下逻辑

1.首先集成好百度地图,地图初始化定位都没有问题了再进行下一步。
2.实现融云的位置点击事件,跳转到自己的mapactivity,这里点位置消息也进的mapactivity,点地图消息也会进 mapactivity,所以需要一个判断具体方法我上面的代码已经写出来了可以参考,从mapactivity返回的时候注意关闭定位,如果不关的话就会一直显示你定位的地方。
3.下面的listview列表显示周围的地图信息请参考
http://blog.csdn.net/u010571316/article/details/44806055
如果没明白的也可以来问我。

效果图

点击发送
获取到经纬度之后,生成静态图片,显示在会话页面
点击位置消息进入到mapactivity显示坐标

以上就是使用百度地图,实现融云的发送位置消息,如果那写的不对,希望大家能多多给我留言,在此谢谢各位大哥大姐了。
代码下载地址:https://github.com/AnOneTable/CanonHouse

4 0