Google Map API 이용 라이딩(거리,속도)정보 SharedPreferences 저장 웹서버의 MySQL DB 전송 - 2. java.class
이전 포스트 필히 참고!
http://jungchul.tistory.com/310 Google Map Fragment 만들기
Google Map API 이용 시작과 종료 지점 (위도,경도)를 이용한 총 거리 계산과 평균 속도 및 SharedPreferences 저장 웹서버의 MySQL DB 전송 -1
5. 버튼 별 소스 추가
map2Fragment.java
Start버튼부터 코딩을 해봅시다.
Start 버튼(기록 시작)
btn_timer_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_timer_start) {
if(isReset == false) { // false 초기화 유도, true 진행
Toast.makeText(getActivity(), "Reset으로 초기화 해주세요.", Toast.LENGTH_SHORT).show();
return;
}
if (isBtnClickStart == true) { // 시작 버튼이 눌렸는데 유저가 다시 한번 누른 경우
Toast.makeText(getActivity(), "이미 시작되었습니다.", Toast.LENGTH_SHORT).show();
return;
}
// 타이머를 시작한다.
Toast.makeText(getActivity(), "타이머를 시작합니다.", Toast.LENGTH_SHORT).show();
// Flag 설정
isReset = false;
isBtnClickStart = true;
// GPS 설정
GpsInfo gps = new GpsInfo(getActivity());
// GPS 사용유무 가져오기
if (gps.isGetLocation()) {
/* 첫 시작 지점*/
Log.d("GPS사용", "찍힘" + timer);
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
LatLng latLng = new LatLng(latitude, longitude);
// 마커 설정.
MarkerOptions optFirst = new MarkerOptions();
optFirst.alpha(0.5f);
optFirst.anchor(0.5f, 0.5f);
optFirst.position(latLng);// 위도 • 경도
optFirst.title("라이딩 시작지점");
optFirst.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker));
googleMap.addMarker(optFirst).showInfoWindow();
/* 이전의 GPS 정보 저장*/
bef_lat = latitude;
bef_long = longitude;
/* 시작 지점 경도, 위도 */
s_lat = String.valueOf(latitude);
s_long = String.valueOf(longitude);
/* 시작 시간 */
long now = System.currentTimeMillis();
Date date = new Date(now);
SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
s_time = sdfNow.format(date);
}
/* 타이머를 위한 Handler */
time_handler = new Handler() {
@Override
public void handleMessage(Message msg) {
time_handler.sendEmptyMessageDelayed(0, 1000); // 1초 간격으로
timer++; // Timer 증가
/* Text View 갱신*/
tv_timer.setText("주행시간 : " + timer + " 초");
tv_distance.setText("주행거리 : "+sum_dist+ " m");
tv_avg_speed.setText("평균 속도 : "+avg_speed+" m/s");
/* 3초 마다 GPS를 찍기 위한 소스*/
if (timer % 3 == 0) {
GpsInfo gps = new GpsInfo(getActivity());
// GPS 사용유무 가져오기
if (gps.isGetLocation()) {
Log.d("GPS사용", "찍힘 : " + timer);
double latitude = gps.getLatitude(); // 위도
double longitude = gps.getLongitude(); // 경도
/* 현재의 GPS 정보 저장*/
cur_lat = latitude;
cur_long = longitude;
/* 이전의 GPS 정보와 현재의 GPS 정보로 거리를 구한다.*/
calDistance = new CalDistance(bef_lat,bef_long,cur_lat,cur_long); // 거리계산하는 클래스 호출
double dist = calDistance.getDistance();
dist = (int)(dist * 100) / 100.0; // 소수점 둘째 자리 계산
sum_dist += dist;
/* 평균 속도 계산하기 */
avg_speed = dist/timer;
avg_speed = (int)(avg_speed * 100) / 100.0; // 소수점 둘째 자리 계산
/* 이전의 GPS 정보를 현재의 GPS 정보로 변환한다. */
bef_lat = cur_lat;
bef_long = cur_long;
// 현재 화면에 찍힌 포인트로 부터 위도와 경도를 알려준다.
LatLng latLng = new LatLng(latitude, longitude);
// Showing the current location in Google Map
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Map 을 zoom 합니다.
googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
/* 이전과 현재의 point로 폴리 라인을 긋는다*/
current_point = latLng;
googleMap.addPolyline(new PolylineOptions().color(0xFFFF0000).width(30.0f).geodesic(true).add(latLng).add(ex_point));
ex_point = latLng;
// 마커 설정.
MarkerOptions optFirst = new MarkerOptions();
optFirst.alpha(0.5f);
optFirst.anchor(0.5f, 0.5f);
optFirst.position(latLng);// 위도 • 경도
optFirst.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker));
googleMap.addMarker(optFirst).showInfoWindow();
}
}
}
};
time_handler.sendEmptyMessage(0);
}
}
});
중간에 CalDistance 클래스를 호출합니다.
CalDistance 클래스 내용은 다음과 같습니다.
위도와 경도를 가져와 거리를 m로 반환합니다.
CalDistance.java
package sincere.kimjungchul.smartwheel.service;
/**
* bef: before, cur: current lat : latitude long : longitude.
*/
public class CalDistance{
public double theta, dist;
public double bef_lat,bef_long,cur_lat,cur_long;
public CalDistance(double bef_lat, double bef_long, double cur_lat, double cur_long) {
this.theta = 0;
this.dist = 0;
this.bef_lat = bef_lat;
this.bef_long = bef_long;
this.cur_lat = cur_lat;
this.cur_long = cur_long;
}
public double getDistance(){
theta = bef_long - cur_long;
dist = Math.sin(deg2rad(bef_lat)) * Math.sin(deg2rad(cur_lat)) + Math.cos(deg2rad(bef_lat))
* Math.cos(deg2rad(cur_lat)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
dist = dist * 1.609344; // 단위 mile 에서 km 변환.
dist = dist * 1000.0; // 단위 km 에서 m 로 변환
return dist; // 단위 m
}
// 주어진 도(degree) 값을 라디언으로 변환
private double deg2rad(double deg){
return (double)(deg * Math.PI / (double)180d);
}
// 주어진 라디언(radian) 값을 도(degree) 값으로 변환
private double rad2deg(double rad){
return (double)(rad * (double)180d / Math.PI);
}
}
map2Fragment.java 이어서
Stop 버튼
(기록 중지 및 SharedPrefereces 저장 및 DB전송)
btn_timer_finish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_timer_finish) {
if (isBtnClickStart == true) { // 시작이 되었다면
//GPS 저장
GpsInfo gps = new GpsInfo(getActivity());
// GPS 사용유무 가져오기
if (gps.isGetLocation()) {
/* 첫 시작 지점*/
Log.d("GPS사용", "찍힘" + timer);
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
LatLng latLng = new LatLng(latitude, longitude);
// 마커 설정.
MarkerOptions optFirst = new MarkerOptions();
optFirst.alpha(0.5f);
optFirst.anchor(0.5f, 0.5f);
optFirst.position(latLng);// 위도 • 경도
optFirst.title("라이딩 종료 지점");
optFirst.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker));
googleMap.addMarker(optFirst).showInfoWindow();
/* 종료 지점 위도 경도*/
f_lat = String.valueOf(latitude);
f_long = String.valueOf(longitude);
/* 종료 시간 */
long now = System.currentTimeMillis();
Date date = new Date(now);
SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
f_time = sdfNow.format(date);
}
Toast.makeText(getActivity(), "주행을 종료합니다.", Toast.LENGTH_SHORT).show();
/* Timer Handler 제거 */
time_handler.removeMessages(0);
/* Checking 변수 */
isBtnClickStart = false;
/** 최종 정보 Log 찍기*/
Log.d("최종 라이딩 정보", "총 라이딩 시간 : " + timer + " 총 라이딩 거리 :" + sum_dist);
Log.d("최종 라이딩 정보", "시작시간 : " + s_time + " 시작지점 경도 :" + s_lat + " 시작지점 위도 : " + s_long);
Log.d("최종 라이딩 정보", "종료시간 : " + f_time + " 종료지점 경도 :" + f_lat + " 종료지점 위도 : " + f_long);
/** 사용자 라이딩 저장하는 부분 SharedPreferences 이용
* 최근 RECENT :: 라이딩 거리, 라이딩 시간, 평균속도, 포인트
* 합계 TOTAL :: 라이딩 거리, 라이딩시간, 포인트
* */
Log.d("prefs",user_id+" | 라이딩거리 : "+(float)sum_dist+" | 시간 : "+timer+" | 평균속도 : "+(float)avg_speed
+" | 포인트 : "+(int)Math.round(sum_dist)*5);
/* SharedPreferences의 RECENT 데이터를 저정한다.*/
editor.putFloat("RECENT_DIST", (float) sum_dist);
editor.putInt("RECENT_TIME", timer);
editor.putFloat("RECENT_AVGSPEED", (float) avg_speed);
editor.putInt("RECENT_POINT", (int) Math.round(sum_dist));
/* SharedPreferences의 TOTAL 데이터를 가져온다.*/
float total_dist = prefs.getFloat("TOTAL_DIST",0);
int total_time = prefs.getInt("TOTAL_TIME",0);
int total_point = prefs.getInt("TOTAL_POINT",0);
Log.d("total_prefs",total_dist+" | "+total_time+" | "+total_point);
/* SharedPreferences의 TOTAL 데이터를 저정한다.*/
editor.putFloat("TOTAL_DIST", (float) sum_dist + total_dist);
editor.putInt("TOTAL_TIME", timer + total_time);
editor.putInt("TOTAL_POINT",(int)Math.round(sum_dist)+total_point);
editor.commit();
/** DB 전송 부분
* 전송할 것 :*/
/* ProgressDialog 실행 */
mProgressDialog.setMessage("주행 종료 ...");
handler = new Handler();
mProgressDialog.setCancelable(false);
mProgressDialog.show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
}, 1000);
} else {
Toast.makeText(getActivity(), "타이머가 시작되지 않았습니다.", Toast.LENGTH_SHORT).show();
}
}
}
});
DB 전송 부분은 다음 포스트에서 진행하겠습니다.
Reset 버튼 (기록 관련 변수 초기화)
btn_timer_reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_timer_reset) {
/* 체킹 변수 설정*/
isReset = true;
/* 시작되어 있는 상태에서 종료시킬 경우 */
if (isBtnClickStart == true) {
Toast.makeText(getActivity(), "타이머를 Stop버튼으로 종료시켜주세요", Toast.LENGTH_SHORT).show();
}else {
/* 체킹 변수 설정*/
isBtnClickStart = false;
Toast.makeText(getActivity(), "타이머를 리셋합니다.", Toast.LENGTH_SHORT).show();
/** 초기화 */
timer = 0; // 총 라이딩 시간(타이머) 초기화
avg_speed = 0; // 평균 속도 초기화
sum_dist = 0;// 총 라이딩 거리
s_lat = "";
s_long = "";
s_time = ""; // 시작 지점 GPS 정보 초기화
f_lat = "";
f_long = "";
f_time = ""; // 종료 지점 GPS 정보 초기화
/* 텍스트 뷰 갱신*/
tv_timer.setText("주행시간 : " + timer + " 초");
tv_avg_speed.setText("평균 속도 : " + avg_speed + " m/s");
tv_distance.setText("주행거리 : " + sum_dist + " m");
/* ProgressDialog 시작 */
mProgressDialog.setMessage("Reset ...");
handler = new Handler();
mProgressDialog.setCancelable(false);
mProgressDialog.show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
}, 1000);
}
}
}
});
통계 버튼
btn_riding_for_analysis.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_riding_for_analysis) {
if (isBtnClickStart == true) {
Toast.makeText(getActivity(), "타이머를 Stop버튼으로 종료시켜주세요", Toast.LENGTH_SHORT).show();
}else {
FragmentTransaction ft = getFragmentManager().beginTransaction();//getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.frame_container, new StatsFragment());
ft.commit();
}
}
}
});
5. 통계 프래그먼트 추가
마지막으로 StatsFramgent를 보겠습니다.
StatsFragment.java
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragment;
public class StatsFragment extends SherlockFragment{
private float recent_dist;
private int recent_time;
private float recent_avg;
private int recent_point;
private float total_dist;
private int total_time;
private int total_point;
public StatsFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_stats, container, false);
TextView stats_recent_time = (TextView)rootView.findViewById(R.id.stats_recent_time);
TextView stats_recent_distance = (TextView)rootView.findViewById(R.id.stats_recent_distance);
TextView stats_recent_avg_speed= (TextView)rootView.findViewById(R.id.stats_recent_avg_speed);
TextView stats_recent_point = (TextView)rootView.findViewById(R.id.stats_recent_point);
TextView stats_total_time = (TextView)rootView.findViewById(R.id.stats_total_time);
TextView stats_total_distance = (TextView)rootView.findViewById(R.id.stats_total_distance);
TextView stats_total_point = (TextView) rootView.findViewById(R.id.stats_total_point);
SharedPreferences prefs = getActivity().getSharedPreferences("login", 0);
recent_dist = prefs.getFloat("RECENT_DIST",0);
recent_time = prefs.getInt("RECENT_TIME", 0);
recent_avg = prefs.getFloat("RECENT_AVGSPEED", 0);
recent_point = prefs.getInt("RECENT_POINT", 0);
Log.d("recent_prefs", recent_dist + " | " + recent_time + " | " +recent_avg+" | "+ recent_point);
total_dist = prefs.getFloat("TOTAL_DIST", 0);
total_time = prefs.getInt("TOTAL_TIME", 0);
total_point = prefs.getInt("TOTAL_POINT", 0);
Log.d("total_prefs", total_dist + " | " + total_time + " | " + total_point);
stats_recent_time.setText(recent_time+" 초");
stats_recent_distance.setText(recent_dist+" m");
stats_recent_avg_speed.setText(recent_avg+" m/s");
stats_recent_point.setText(recent_point+" 점");
stats_total_time.setText(total_time+" 초");
stats_total_distance.setText(total_dist+" m");
stats_total_point.setText(total_point+" 점");
return rootView;
}
}
6. 중간 실행
다음 포스트에서는 DB Class 설정을 하겠습니다.
'Android' 카테고리의 다른 글
Google Map API 이용 라이딩(거리,속도)정보 SharedPreferences 저장 웹서버의 MySQL DB 전송 - 4. php, mysql (0) | 2016.03.17 |
---|---|
Google Map API 이용 라이딩(거리,속도)정보 SharedPreferences 저장 웹서버의 MySQL DB 전송 - 3. DB.class (0) | 2016.03.17 |
Google Map API 이용 라이딩(거리,속도)정보 SharedPreferences 저장 웹서버의 MySQL DB 전송 - 1. XML (2) | 2016.03.15 |
서울 열린 데이터 오픈 API (1) | 2016.03.11 |
Google Calendar ical 공유 (0) | 2016.03.11 |