package com.talk.demo.intimate;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.JsonWriter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.HeatMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.talk.demo.R;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class StepRelateFragment extends Fragment {
private static final String TAG = "StepRelateFragment";
private Button saveButton;
private Context mContext;
private List<LatLng> tempData;
// 定位相关
LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
private LocationMode mCurrentMode;
BitmapDescriptor mCurrentMarker;
MapView mMapView = null; // 定义mapview对象
BaiduMap mBaiduMap = null;
private HeatMap heatmap;
boolean isFirstLoc = true;// 是否首次定位
private SharedPreferences settings;
private double lat, lng;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
SDKInitializer.initialize(getActivity().getApplicationContext());
settings = getActivity().getSharedPreferences("GeoPoint_Info", 0);
lat = (double) settings.getLong("Lat", 0);
lng = (double) settings.getLong("Lng", 0);
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_relate_step,
container, false);
mMapView = (MapView) rootView.findViewById(R.id.mapview);
mBaiduMap = mMapView.getMap();
// 普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 修改为自定义marker
/*
mCurrentMode = LocationMode.NORMAL;
mCurrentMarker = BitmapDescriptorFactory
.fromResource(R.drawable.icon_geo);
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
mCurrentMode, true, mCurrentMarker));
*/
LatLng ll = new LatLng(lat, lng);
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.setMapStatus(u);
addHeatMap();
// 定位初始化
mLocClient = new LocationClient(getActivity());
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
mLocClient.setLocOption(option);
mLocClient.start();
try {
tempData = getLocations(new FileInputStream(getJsonFile()));
} catch (IOException ex) {
ex.printStackTrace();
}
saveButton = (Button) rootView.findViewById(R.id.bt_save_publish);
saveButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
FileOutputStream out = new FileOutputStream(getJsonFile());
writeJsonStream(out, tempData);
/*
out.flush();
out.close();
*/
} catch (IOException e) {
e.printStackTrace();
}
saveButton.setPressed(true);
}
});
return rootView;
}
public void writeJsonStream(OutputStream out, List<LatLng> messages)
throws IOException {
JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
writeMessagesArray(writer, messages);
writer.close();
}
public void writeMessagesArray(JsonWriter writer, List<LatLng> mesgs)
throws IOException {
writer.beginArray();
if(null != mesgs) {
for (LatLng message : mesgs) {
writeMessage(writer, message);
}
} else {
Log.e(TAG, "file don't contain geo data");
}
// record this step place
writeThisStep(writer);
writer.endArray();
}
public void writeMessage(JsonWriter writer, LatLng message)
throws IOException {
writer.beginObject();
writer.name("lng").value(message.longitude);
writer.name("lat").value(message.latitude);
writer.endObject();
}
public void writeThisStep(JsonWriter writer) throws IOException {
writer.beginObject();
writer.name("lng").value(lng);
writer.name("lat").value(lat);
writer.endObject();
}
private List<LatLng> getLocations(InputStream input)
throws IOException{
List<LatLng> list = new ArrayList<LatLng>();
Scanner scanner = new Scanner(input);
if(!scanner.hasNext()) {
return null;
}
String json = scanner.useDelimiter("\\A").next();
JSONArray array;
try {
array = new JSONArray(json);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
double lat = object.getDouble("lat");
double lng = object.getDouble("lng");
list.add(new LatLng(lat, lng));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public File getJsonFile() {
File tempDir = new File(Environment.getExternalStorageDirectory()
+ "/Demo");
if (!tempDir.exists()) {
tempDir = new File("/sdcard/Demo");
tempDir.mkdir();
}
File tempFile = new File(tempDir, "testJson.json");
return tempFile;
}
private void addHeatMap() {
final Handler h = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mBaiduMap.addHeatMap(heatmap);
}
};
new Thread() {
@Override
public void run() {
super.run();
List<LatLng> data;
try {
data = getLocations(new FileInputStream(getJsonFile()));
heatmap = new HeatMap.Builder().data(data).build();
} catch (IOException e) {
e.printStackTrace();
}
h.sendEmptyMessage(0);
}
}.start();
}
/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
lat = location.getLatitude();
lng = location.getLongitude();
LatLng ll = new LatLng(lat, lng);
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
@Override
public void onDestroy() {
super.onDestroy();
/* 退出时保存这次的定位信息 */
settings.edit().putLong("Lat", (long) lat).commit();
settings.edit().putLong("Lng", (long) lng).commit();
// 退出时销毁定位
mLocClient.stop();
// 关闭定位图层
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
}
@Override
public void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}