안드로이드로 서버랑 통신해서 로그인하는 프로그램을 만들려면 sql을 사용해야 합니다.
하지만 안드로이드에서는 sql에 직접적으로 접근을 할 수는 없습니다.ㅠ
php나 jsp같은 웹언어를 이용해야 합니다.
먼저 아래와 같이 로그인 페이지를 만들었습니다.
admin이라는 ID를 검색해서 PW, Name을 가져왔습니다.
이제 이 코드를 APM(Apache,Php,Mysql)이 설치된 pc에 php파일로 만들어 줘야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php $host='server address';//insert as yours $uname='mysql id'; $pwd='mysql pw'; $db="database name"; $con = mysql_connect($host,$uname,$pwd) or die("connection failed"); mysql_select_db($db,$con) or die("db selection failed"); $id=$_GET['id']; $r=mysql_query("select PW,Name from User_Info where ID='$id'",$con); $row=mysql_fetch_array($r); print(json_encode($row)); mysql_close($con); ?> | cs |
1 2 3 4 5 6 | public loginMysql(String id,String pw,String url){ mHandler=new Handler(); userId=id; userPw=pw; this.url=url+"?id="+userId; } | cs |
thread를 실행할때 id와 pw, php의 url을 넘겨줬습니다.
그리고 url에는 id값을 get방식으로 넘기기 위해 id값을 추가했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | @Override public void run() { super.run(); if(active){ StringBuilder jsonHtml = new StringBuilder(); try { URL phpUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection)phpUrl.openConnection(); if ( conn != null ) { conn.setConnectTimeout(10000); conn.setUseCaches(false); if ( conn.getResponseCode() == HttpURLConnection.HTTP_OK ) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); while ( true ) { String line = br.readLine(); if ( line == null ) break; jsonHtml.append(line + "\n"); } br.close(); } conn.disconnect(); } } catch ( Exception e ) { e.printStackTrace(); } show(jsonHtml.toString()); } } | cs |
이부분이 통신을 하는 부분입니다.
Line 5 : 읽어올 데이터를 저장할 stringbuilder를 하나 만들어 줍니다.
Line 7 : php의 주소와 id가 저장된 URL을 만들어 줍니다.
Line 8 : HTTP로 연결을 시작합니다.
Line 9~23 : 연결이 성공적으로 되면 이부분으로 들어오게 됩니다.
Line 12~21 : 응답코드가 OK가 뜨면 들어오게 됩니다.
Line 13~19 : php를 통해 mysql에서 읽어온 데이터를 라인단위로 저장을 합니다.
Line 22 : 연결을 끊습니다.
Line 27 : 읽어온 데이터를 처리하기 위해 show라는 함수로 보냅니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void show(final String result){ mHandler.post(new Runnable(){ @Override public void run() { try { JSONObject jObject = new JSONObject(result); String getpw =jObject.get("PW").toString(); String getname=jObject.get("Name").toString(); Login.result_login(getpw, userPw, getname); } catch (JSONException e) { e.printStackTrace(); Login.result_login("false", "false", "false"); } } }); } | cs |
읽어 온 데이터를 처리하는 함수 입니다.
Line 7 :json형태로 받았기 때문에 JSON오브젝트를 생성하여 읽어온 값을 넣어줍니다.
Line 9~10 : JSON에서 pw와 name 필드의 값을 각각 저장해 줍니다.
Line 12 : 값을 비교해서 처리하기위해 Login activity로 전달해 줍니다.
Line 15 : 만약 db에 잘못된 id를 요청했을경우 이부분으로 빠지게 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | static public void result_login(String result,String pw,String name){ loginMysql.active=false; if(result.equals("false")) Toast.makeText(mContext,"사용자 ID가 없습니다.",Toast.LENGTH_SHORT).show(); else{ if(pw.equals(result)) { userId.setText(""); userPw.setText(""); Toast.makeText(mContext, name + "님 로그인 되었습니다.", Toast.LENGTH_SHORT).show(); Intent intent=new Intent(mContext,Main.class); intent.putExtra("name",name); mContext.startActivity(intent); }else Toast.makeText(mContext,"PW가 틀렸습니다.",Toast.LENGTH_SHORT).show(); } } | cs |
Login activity입니다.
Line 3~4 : 위에서 id가 없었을때 id가 없다고 띄워주게 됩니다.
Line 5~16 : db에서 가져온 pw와 사용자가 입력한 pw를 비교합니다.
Line 6~13 : pw가 일치하면 main activity로 이동합니다.
Line 15~16 : pw가 일치하지 않으면 toast를 띄워줍니다.
추가(2017.03.17)
안드로이드용 소스코드와 PHP용 소스코드가 새롭게 업데이트 되었습니다.
제일 위 링크를 통해 다운로드 하세요^^
'Study > Android' 카테고리의 다른 글
한글URL으로 XML parsing시 한글 깨질때 (0) | 2015.12.10 |
---|---|
JSON Array parsing (0) | 2015.11.24 |
custom Notification (커스텀 알림창) (0) | 2015.11.18 |
Google map Location (구글맵 위치) - LocationListener using google api (4) | 2015.10.26 |
Google map Location (구글맵 위치) - setMyLocationChangeListener (0) | 2015.10.26 |