Google Map API 이용 마커(위도,경도) 웹서버 MySQL DB 전송 매 5초마다 찍는 마커(Marker) 의 정보(위도 latitude, 경도 longtitude)를 통해 라이딩에 통계를 위해 아이디(id)와 날짜와 시간(date), 주소(address)를 위해 위도와 경도를 전송할 것입니다. APP 단에서는 httpUrlConnection을 이용해 서버로 접근하고, 웹 서버의 php문의 쿼리 전송으로 MySQL로 전송할 것입니다. APP 안드로이드 애플리케이션 우선 첫째로 Fragment에서 호출할 메소드 정의합니다. 파라미터로 아이디, 날짜/시간, 위도, 경도를 입력받고 변수에 저장합니다. /* Google Map 라이딩 서버 전송 부분 */ /* -- 아이디, 날짜/시간 위도, 경도를 파라미터로 받는다. */ public ArrayList<String> riding_user_information(String str_user_id, String str_datetime, String str_latitude, String str_longitude) { urlPath = riding_user_information_UrlPath; this.str_user_id = str_user_id; this.str_datetime = str_datetime; this.str_latitude = str_latitude; this.str_longitude = str_longitude; try { results = new RidingPostUser().execute().get(); } catch ( InterruptedException e ) { e.printStackTrace(); } catch ( ExecutionException e ) { e.printStackTrace(); } return results; } 둘째로 HttpUrlConnection을 전송하는 클래스 정의 입니다. 데이터 전송 시 구분자는 &이며, 아이디, 날짜/시간, 위도, 경도를 전송합니다. /* -- 문자열로 이루어진 데이터를 서버에 POST 방식으로 전송한다 */ class RidingPostUser extends AsyncTask<Void, Void, ArrayList<String>> { @Override protected ArrayList<String> doInBackground(Void... voids) { // TODO Auto-generated method try { URL url = new URL(urlPath); // Set url HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setDoInput(true); // Available Write con.setDoOutput(true); // Available Read con.setUseCaches(false); // No cash con.setRequestMethod("POST"); /* 구분자는 &이며, 아이디 str_user_id, 날짜/시간 str_datetime 위도 str_latitude, 경도 str_longitude 순으로 보낸다.*/ String param = "str_user_id="+str_user_id+"&str_datetime="+str_datetime+ "&str_latitude="+str_latitude+"&str_longitude"+str_longitude; OutputStream outputStream = con.getOutputStream(); outputStream.write(param.getBytes()); outputStream.flush(); outputStream.close(); BufferedReader rd = null; ArrayList<String> qResults = new ArrayList<String>(); rd = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8")); String line = ""; while((line = rd.readLine()) != null) { Log.d("BufferedReader:", line); if(line != null) { qResults.add(line); } } return qResults; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } protected void onPostExecute(ArrayList<String> qResults) { super.onPostExecute(qResults); } } 셋째로 urlpath를 지정해줍니다. 본인 서버의 주소와 이후부터는 디렉터리입니다. 우리는 /www 디렉터리 하위로 user_riding 디렉터리를 생성하고 riding_user_information.php 파일을 작성할 것입니다. private final String riding_user_information_UrlPath = "http://….../user_riding/riding_user_information.php"; Fragment db에 전송을 위한 dbmanager 추가 private DB_Manager dbmanger; dbmanger = new DB_Manager(); 매 5초마다 반복적으로 Marker 찍는 부분에서부터 웹 전송을 보내는 작업을 시작하겠습니다. btn_timer_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { time_handler = new Handler() { @Override public void handleMessage(Message msg) { ………………………………… <- 코딩은 이 부분입니다. } SharedPreferences를 통해 기존의 아이디를 가져오는 부분입니다. facebook login API를 사용했기 때문에, facebook으로 로그인했는지, 자체 회원 가입을 통한 로그인인지 알아 내어, id를 가져옵니다. /** 사용자 id 알아오는 부분 */ SharedPreferences prefs = getActivity().getSharedPreferences("login", 0); String login = prefs.getString("USER_LOGIN", "LOGOUT"); String facebook_login = prefs.getString("FACEBOOK_LOGIN", "LOGOUT"); String user_id = ""; if(facebook_login.equals("LOGIN")) { FacebookSdk.sdkInitialize(rootView.getContext()); Profile profile = Profile.getCurrentProfile(); user_id = profile.getId(); }else if(login.equals("LOGIN")) { user_id = prefs.getString("USER_ID", "NULL"); } final String str_user_id = user_id; // inner class 오류를 위한 //Toast.makeText(getActivity(),user_id,Toast.LENGTH_SHORT).show(); /** */ 우선 현재 시간을 찍어봅시다. long now = System.currentTimeMillis(); Date date = new Date(now); SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); String str_datetime = sdfNow.format(date); String 클래스의 valueof 메소드를 이용하여 double형 변수를 문자열로 형변환 합니다. double latitude = gps.getLatitude(); // 위도 double longitude = gps.getLongitude(); // 경도 String str_latitude = String.valueOf(latitude); String str_longitude = String.valueOf(longitude); 웹서버 db로 보낼 변수들은 다음과 같습니다. 모두 String 변수 입니다. 아이디 : str_user_id 날짜/시간 str_datetime 위도 str_latitude 경도 str_longitude 자 이제, db_manager를 호출해서 정의했던 메소드를 호출합니다. dbmanger.riding_user_information(str_user_id,str_datetime,str_latitude,str_longitude); 앱 부분은 완료되었습니다. Mysql table 생성하기 phpmyadmin으로 접속합니다. table을 생성합니다. table은 riding_user_information 으로 하겠습니다. 필드는 str_user_id, str_datetime, str_latitude, str_longitude 저장 버튼을 누릅니다. Mysql 완료가 되었습니다. 웹 서버 php 작성 putty를 이용해 웹 서버로 접속합니다. /www 디렉터리에서 mkdir를 이용해 디렉터리를 새로 만듭니다. vim을 이용해 php문을 작성합니다. 소스 코드는 이러합니다. 필히!! database_name, database_password를 본인db 정보로 변경해주세요!! <?php $connect = mysql_connect("localhost", "database_name", "database_password"); // db와 연결을 시도합니다. if(!$connect) { die('Could not connect : '.mysql_error()); } // db를 선택합니다. mysql_select_db("smartwheel",$connect); // 한국어로 입력 가능하도록 설정합니다. mysql_query("set names utf8"); // INSERT 쿼리 명령어로 테이블에 삽입합니다. // INSERT INTO 테이블명 // INSERT INTO 테이블명 (필드명,필드명) VALUES (‘$_POST[]’,$_POST[]); // $_POST[]는 app 또는 web에서 post로 전송한 데이터를 입력받습니다. $qry = "INSERT INTO riding_user_information (str_user_id, str_datetime, str_latitude, str_longitude) VALUES('$_POST[str_user_id]','$_POST[str_datetime]','$_POST[str_latitude]','$_POST[str_longitude]')"; // 쿼리를 실행합니다. if(!mysql_query($qry,$connect)) { die('Error : '.mysql_error()); } echo "1 record added"; // db 연결을 닫습니다. mysql_close($connect); ?> 완료되었습니다. 테스트 해보기 APP을 통해 실행해봅니다. MySQL 데이터가 잘 삽입되어집니다. str_user_id에는 페이스북 아이디가 들어옵니다.DB_Manager
Fragment
유저의 아이디를 가져오기
현재 시간
위도와 경도
db로 보낼 String 문자열 변수
'Android' 카테고리의 다른 글
Google Calendar ical 공유 (0) | 2016.03.11 |
---|---|
Forecast API (10) | 2016.03.11 |
구글 음성 인식 (SST : Speech to Text) (4) | 2016.02.17 |
웹서버 PHP MySQL 연동 안드로이드 통신 [4] 안드로이드 앱 (18) | 2016.02.15 |
웹서버 PHP MySQL 연동 안드로이드 통신 [3] PHP (15) | 2016.02.15 |