融雲即時通訊 添加地理位置信息的功能


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;
    }

}
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;
  }  }
<?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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM