안드로이드와 PHP 간에 로그인 연동처리 방법을 적어둔다.
1. 안드로이드 단말에서 PHP 서버로 정보를 보낼 때
- 안드로이드 단말에서 보내는 코드
String postURL = "http://192.168.1.2/Logincheck.php";
HttpPost httppost= new HttpPost(postURL);
// 전달할 인자
nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("loginID",et.getText().toString().trim()));
nameValuePairs.add(new BasicNameValuePair("loginPW",pass.getText().toString().trim()));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//Execute HTTP Post Request
httpclient=new DefaultHttpClient();
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String response = httpclient.execute(httppost, responseHandler);
- 안드로이드 단말에서 보낸 정보를 PHP 에서 인식하는 코드 추가
$userID
=
$_POST
[
'
loginID'
];
$password
=
$_POST
[
'loginPW'
];
2. PHP 서버의 정보를 안드로이드 단말로 가져올 때
- 허니콤(3.0) 이후로 네트워크 접속시 별도의 스레드로 돌려야 오류가 발생하지 않는다.
AsyncTask 를 주로 사용한다.
3. Android 소스 코드
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
public class Login extends Activity {
String getDeviceID; // 스마트기기의 장치 고유값
ProgressDialog dialog = null;
EditText etId;
EditText etPw;
String loginID;
String loginPW;
CheckBox autologin;
Boolean loginChecked;
List<NameValuePair> params;
public SharedPreferences settings;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
// 네트워크 연결상태 체크
if(NetworkConnection() == false){
NotConnected_showAlert();
}
etId = (EditText) findViewById(R.id.login_id_edit);
etPw = (EditText) findViewById(R.id.login_pw_edit);
autologin = (CheckBox) findViewById(R.id.autologinchk);
// 폰에 저장된 로그인 정보 가져오기
settings = getSharedPreferences("settings", Activity.MODE_PRIVATE);
loginChecked = settings.getBoolean("LoginChecked", false);
if (loginChecked) {
etId.setText(settings.getString("loginID", ""));
etPw.setText(settings.getString("loginPW", ""));
autologin.setChecked(true);
}
if(!settings.getString("loginID", "").equals("")) etPw.requestFocus();
Button submit = (Button) findViewById(R.id.login_btn);
submit.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
dialog = ProgressDialog.show(Login.this, "", "Validating user...", true);
new Thread(new Runnable() {
public void run() {
login();
}
}).start();
}
});
}
void login() {
try {
loginID = etId.getText().toString().trim();
loginPW = etPw.getText().toString().trim();
// 단말기의 ID 정보를 얻기 위해서는 READ_PHONE_STATE 권한이 필요
TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (mTelephony.getDeviceId() != null){
getDeviceID = mTelephony.getDeviceId(); // 스마트폰 기기정보
} else {
getDeviceID = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);
}
String postURL = "http://IP주소/loginChk.php";
HttpPost httppost = new HttpPost(postURL);
// 전달할 인자들
params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("loginID", loginID));
params.add(new BasicNameValuePair("loginPW", loginPW));
params.add(new BasicNameValuePair("deviceID", getDeviceID));
UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);
httppost.setEntity(ent);
HttpClient httpclient = new DefaultHttpClient();
ResponseHandler<String> responseHandler = new BasicResponseHandler();
final String responsePost = httpclient.execute(httppost, responseHandler);
System.out.println("DeviceID : " + getDeviceID);
System.out.println("Response : " + responsePost);
runOnUiThread(new Runnable() {
public void run() {
dialog.dismiss();
}
});
if(responsePost.equalsIgnoreCase("<meta http-equiv='Refresh' content='0; URL=mobile/list.php'>")){
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(Login.this,"Login Success", Toast.LENGTH_SHORT).show();
}
});
startActivity(new Intent(Login.this, MainActivity.class));
finish(); // finish()를 호출해서 Activity를 없애줌
} else {
showAlert();
}
} catch(Exception e) {
dialog.dismiss();
System.out.println("Exception : " + e.getMessage());
}
}
public void onStop(){
// 어플리케이션이 화면에서 사라질때
super.onStop();
// 자동 로그인이 체크되어 있고, 로그인에 성공했으면 폰에 자동로그인 정보 저장
if (autologin.isChecked()) {
settings = getSharedPreferences("settings",Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString("loginID", loginID);
editor.putString("loginPW", loginPW);
editor.putBoolean("LoginChecked", true);
editor.commit();
} else {
// 자동 로그인 체크가 해제되면 폰에 저장된 정보 모두 삭제
settings = getSharedPreferences("settings", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.clear(); // 모든 정보 해제
editor.commit();
}
}
public void showAlert(){
Login.this.runOnUiThread(new Runnable() {
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(Login.this);
builder.setTitle("Login Error.");
builder.setMessage("로그인 정보가 일치하지 않습니다.")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
}
private void NotConnected_showAlert() {
AlertDialog.Builder builder = new AlertDialog.Builder(Login.this);
builder.setTitle("네트워크 연결 오류");
builder.setMessage("사용 가능한 무선네트워크가 없습니다.\n" + "먼저 무선네트워크 연결상태를 확인해 주세요.")
.setCancelable(false)
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish(); // exit
//application 프로세스를 강제 종료
android.os.Process.killProcess(android.os.Process.myPid() );
}
});
AlertDialog alert = builder.create();
alert.show();
}
private boolean NetworkConnection() {
ConnectivityManager manager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
boolean isMobileAvailable = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isAvailable();
boolean isMobileConnect = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
boolean isWifiAvailable = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable();
boolean isWifiConnect = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
if ((isWifiAvailable && isWifiConnect) || (isMobileAvailable && isMobileConnect)){
return true;
}else{
return false;
}
}
}
4. AndroidManifest.xml 파일 수정사항
- 로그인(Login.java) 한 후, 메인(MainActivity.java) 가 실행되게 하는 순서에 맞게
AndroidManifest.xml 파일 내용도 수정을 해줘야만 된다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.phpmysqljson"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Login"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:launchMode="singleTop"
android:windowSoftInputMode="adjustPan" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop" />
</application>
</manifest>
5. PHP 로그인 코드
<?php
session_start();
if(isset($_POST['loginID']) && !empty($_POST['loginID']) && isset($_POST['loginPW']) && !empty($_POST['loginPW'])) {
$loginID = trim($_POST['loginID']);
$loginPW = trim($_POST['loginPW']);
require_once $_SERVER['DOCUMENT_ROOT'].'/dbconnect.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/phpclass/loginClass.php';
$c=new LoginClass();
$row = $c->LoginUserAuthCheck($loginID,$loginPW);
if(is_array($row)) {
if($row['code'] > 0) {
$_SESSION['userID'] = $row['id'];
$_SESSION['userPW'] = md5($loginPW);
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];
echo("<meta http-equiv='Refresh' content='0; URL=mobile/list.php'>");
}
}
} else {
echo("<meta http-equiv='Refresh' content='0; URL=loginForm.php'>");
}
?>
이 로그인 연동처리하는 코드는 http://www.coderzheaven.com/2012/04/22/create-simple-login-form-php-android-connect-php-android/ 자료를 참조했으나 부족한 사항들을 상당히 더 추가했다.
http://www.coderzheaven.com/ 사이트에 좋은 예제들이 많이 있다.
'안드로이드 > Android Data 통신' 카테고리의 다른 글
안드로이드 PHP 연동 JSON 방식 검색기능 추가 (GET 방식) (0) | 2016.07.01 |
---|---|
안드로이드 PHP 연동(자동로그인, 등록단말 검사, 네트워크 상태 검사) (4) | 2016.06.27 |
안드로이드 AsyncTask (0) | 2016.06.21 |
[Eclipse]안드로이드 MySQL DB 연동 (안드로이드 앱 Part) - XML 방식 (0) | 2016.06.14 |
[Eclipse]안드로이드 MySQL DB 연동 (안드로이드 앱 Part : ListView) - JSON 방식 (0) | 2016.06.08 |