融云&百度地图-实现地理位置发送
来源:互联网 发布:蒙面歌王知乎 编辑:程序博客网 时间: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¢er=" + 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
如果没明白的也可以来问我。
效果图
以上就是使用百度地图,实现融云的发送位置消息,如果那写的不对,希望大家能多多给我留言,在此谢谢各位大哥大姐了。
代码下载地址:https://github.com/AnOneTable/CanonHouse
4 0
- 融云&百度地图-实现地理位置发送
- 融云&高德地图-实现地理位置发送
- 基于百度地图实现融云 sdk 2.8.0+ 发送地理位置
- iOS 仿照微信发送地理位置功能 [百度地图]
- android 百度地图 实现附近的地理位置信息
- 百度地图---查看地图上的地理位置
- go实现访问百度地图api实现经纬度逆解析出地理位置收集
- 利用百度地图的API定位地理位置
- 基于百度地图的android地理位置获取
- IOS 百度地图定位,显示地理位置
- 百度地图 经纬度和地理位置的转换
- 基于百度地图的地理位置选择功能
- iOS 百度地图反编码地理位置信息
- iOS之百度地图获取地理位置名称
- IOS 百度地图定位,显示地理位置
- 百度地图API地理位置和坐标转换
- HTML5地理位置Geolocation以及百度地图应用
- android 定位 获取地理位置 百度地图
- 各类快捷键整理(Windows、Sublime、Firebug)
- 当我们在使用CSS的时候ID与Class有何不同?
- 5段SQL可以测试出你对SQL性能优化知识了解多少
- Hash Function
- 8个SQL语句常用优化技巧
- 融云&百度地图-实现地理位置发送
- 求链表的倒数第k个节点
- 五大Linux简单命令解决系统性能问题
- 欢迎使用CSDN-markdown编辑器
- Avro kafka(Producer-Consumer)
- Dalvik Virtual Machine的用处和功能
- libSVM的使用介绍(3.20版本为例)
- C#实现企业邮件发送,支持HTML格式
- tango_with_django 中7.3.2 添加slug字段报错解决