Notice
Recent Posts
Recent Comments
Today
Total
04-19 00:01
Archives
관리 메뉴

Jeongchul Kim

Google Map API 이용 라이딩(거리,속도)정보 SharedPreferences 저장 웹서버의 MySQL DB 전송 - 2. java.class 본문

Android

Google Map API 이용 라이딩(거리,속도)정보 SharedPreferences 저장 웹서버의 MySQL DB 전송 - 2. java.class

김 정출 2016. 3. 15. 16:21


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 설정을 하겠습니다.



Comments