(تطوير كلاسات Register و Login وJSONParser ) ربط تطبيق أندرويد مع MySQL و PHP و JSON

السلام عليكم ورحمة الله وبركاته

(جاري تحديث الموضوع)

فهرس سلسلة دروس ربط تطبيق أندرويد مع MySQL و PHP و JSON :

  1. مقدمة وشرح توضيحي عن Web Services وعن المشروع.
  2. إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
  3. التعامل مع PHP لبناء Web Service  تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
  4. التعامل مع PHP لبناء Web Service  بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
  5. بناء مشروع أندرويد  جديد و إعداد واجهة تطبيق الأندرويد.
  6. تطوير كلاسات Register و Login وJSONParser في أندرويد.
  7. تطوير UsersActivity و ListViewAdapter لعمل قائمة المستخدمين بالتنسيق الذي نحتاجه.

 

 

JSONParser.java

package com.ahmaadssb.androidwebservices;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {
	static InputStream is = null;
	static JSONObject jObj = null;
	static JSONArray jarray = null;
	static String json = "";

	// constructor
	public JSONParser() {

	}
	
	 public JSONArray getJSONArrayFromUrl(String url) {
		 
		 StringBuilder builder = new StringBuilder();
		 HttpClient client = new DefaultHttpClient();
         HttpGet httpGet = new HttpGet(url);
         
         try {
             HttpResponse response = client.execute(httpGet);
             StatusLine statusLine = response.getStatusLine();
             int statusCode = statusLine.getStatusCode();
             if (statusCode == 200) {
               HttpEntity entity = response.getEntity();
               InputStream content = entity.getContent();
               BufferedReader reader = new BufferedReader(new InputStreamReader(content));
               String line;
               while ((line = reader.readLine()) != null) {
                 builder.append(line);
               }
             } else {
               Log.e("==>", "Failed to download file");
             }
           } catch (ClientProtocolException e) {
             e.printStackTrace();
           } catch (IOException e) {
             e.printStackTrace();
           }
         
         // Parse String to JSON object
         try {
             jarray = new JSONArray( builder.toString());
         } catch (JSONException e) {
             Log.e("JSON Parser", "Error parsing data " + e.toString());
         }
		return jarray;
	 }
	
	public JSONObject getJSONFromUrl(String url) {
		// making HTTP Request
		try {
			// Construct the client and the HTTP request.
			DefaultHttpClient httpClient = new DefaultHttpClient();
			HttpPost httpPost = new HttpPost(url);

			// Execute the POST request and store the response locally.
			HttpResponse httpResponse = httpClient.execute(httpPost);

			// Extract data from the response.
			HttpEntity httpEntity = httpResponse.getEntity();

			// Open an inputStream with the data content.
			is = httpEntity.getContent();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			// Create a BufferedReader to parse through the inputStream.
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					is, "iso-8859-1"), 8);

			// Declare a string builder to help with the parsing.
			StringBuilder sb = new StringBuilder();
			// Declare a string to store the JSON object data in string form.
			String line = null;

			// Build the string until null.
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}

			// Close the input stream.
			is.close();
			// Convert the string builder data to an actual string.
			json = sb.toString();
		} catch (Exception e) {
			Log.e("Buffer Error", "Error converting result " + e.toString());
		}

		// try to parse the string to a JSON Object
		try {
			jObj = new JSONObject(json);
		} catch (JSONException e) {
			Log.e("JSON Parser", "Error Parsing data" + e.toString());
		}

		// return JSON String
		return jObj;
	}

	// function get json from url
	// by making HTTP POST or GET mehtod
	public static JSONObject makeHttpRequest(String loginUrl, String method, List<NameValuePair> params) {
		// making HTTP Request
		try {
			// check for request method
			if(method == "POST"){
				DefaultHttpClient httpClient = new DefaultHttpClient();
				HttpPost httpPost = new HttpPost(loginUrl);
				httpPost.setEntity(new UrlEncodedFormEntity(params));
				HttpResponse httpResponse = httpClient.execute(httpPost);
				
				HttpEntity httpEntity = httpResponse.getEntity();
				is = httpEntity.getContent();
			}else 
				// check for request method
				if(method == "GET"){
					DefaultHttpClient httpClient = new DefaultHttpClient();
					String paramString = URLEncodedUtils.format(params, "utf-8");
					loginUrl += "?" + paramString;
					HttpGet httpGet = new HttpGet(loginUrl);
					HttpResponse httpResponse = httpClient.execute(httpGet);
					HttpEntity httpEntity = httpResponse.getEntity();
					is = httpEntity.getContent();
			}
			
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		try {
				BufferedReader  reader = new BufferedReader(
					new InputStreamReader(is, "iso-8859-1"),8);
				StringBuilder sb = new StringBuilder();
				String  line = null;
			
				while((line = reader.readLine()) != null){
					sb.append(line + "\n");
				}
				is.close();
				json = sb.toString();
			} catch (IOException e) {
				Log.d("Buffer Error","Error Converting Reesult "+e.toString());
			}
		
		// try parse the string to JSON Object
		try {
			jObj = new JSONObject(json);
		} catch (JSONException e) {
			Log.e("JSON Parser", "Error Parsing data" + e.toString());
		}

		// return JSON String
		return jObj;
	}

	public static JSONObject getJSONfromURL(String url) {
        InputStream is = null;
        String result = "";
        JSONObject jArray = null;
 
        // Download JSON data from URL
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
 
        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection " + e.toString());
        }
 
        // Convert response to string
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }
 
        try {
 
            jArray = new JSONObject(result);
        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data " + e.toString());
        }
 
        return jArray;
    }
}

 

MainActivity.java  (المسؤول عن عملية تسجيل الدخول)

/***
 * @author Ahmed Saleh
 * Created by ahmadssb on 2014-12-13
 * Website: http://www.ahmadssb.com
 * Email: [email protected]
 * Facebook: https://www.facebook.com/ahmadssbblog
 * Twitter: https://twitter.com/ahmadssb
 * YouTube: http://www.youtube.com/user/ahmadssbblog
 */

package com.ahmaadssb.androidwebservices;

import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.support.v7.app.ActionBarActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity implements OnClickListener {
	private EditText user, pass;
	private Button login, register;

	private ProgressDialog pDialog;

	JSONParser jsonParser = new JSONParser();

	// من خلال شبكة الواي فاي
	private static String LOGIN_URL = "http://192.168.1.103/GoogleDrive/android-webservice1/login.php";

	// من خلال Android emulator
	// private static String LOGIN_URL = "http://10.0.2.2/GoogleDrive/android-webservice1/login.php";

	// من خلال رابط الموقع على الانترنت
	// private static String LOGIN_URL = "http://www.YOUR-DOMAIN.com/GoogleDrive/android-webservice1/login.php";

	/***
	 * كما فعلنا في ملفات PHP قمنا بوضع مفاتيح (متغيرات) ل JSON يفضل أن نقوم
	 * بتعريفها كـ static final لأنها قيم ثابتة سنحتاجها لاحقا
	 */
	private static final String TAG_SUCCESS = "success";
	private static final String TAG_MESSAGE = "message";
	private static final String TAG_USERNAME = "username";
	private static final String TAG_PASSWORD = "password";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		user = (EditText) findViewById(R.id.edtUsername);
		pass = (EditText) findViewById(R.id.edtPassword);

		login = (Button) findViewById(R.id.btnLogin);

		register = (Button) findViewById(R.id.btnRegisterUser);

		login.setOnClickListener(this);

		register.setOnClickListener(this);

	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.btnLogin:
			// عند الضغط على Login
			// نقوم بتفعيل كلاس AttemptLogin()
			new AttemptLogin().execute();
			break;
		case R.id.btnRegisterUser:
			Intent i = new Intent(MainActivity.this, RegisterActivity.class);
			startActivity(i);
			break;

		default:
			break;
		}
	}

	/***
	 * 
	 * @author Ahmadssb في هذا الكلاس سنقوم بالإتصال برابط تسجيل الدخول ونقوم
	 *         بإضافة الباراميترز المطلوبة username , Password ومن ثم الحصول على
	 *         JSON Response وأخيرا حسب قيمة success نقرر ما سنقوم بعمله
	 * 
	 */

	class AttemptLogin extends AsyncTask<String, String, String> {

		boolean failure = false;

		// نقوم بعرض ProgressDialog
		// حتى تنتهي جميع الأوامر الموجودة في doInBackground()
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			pDialog = new ProgressDialog(MainActivity.this);
			pDialog.setMessage("محاولة تسجيل الدخول ...");
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(true);
			pDialog.show();
		}

		@Override
		protected String doInBackground(String... args) {
			// TODO Auto-generated method stub

			int success;
			// نقوم بتسجيل البيانات الموجودة في حقول username و password كنص
			String username = user.getText().toString();
			String password = pass.getText().toString();
			try {
				// نقوم ببناء الباراميترز المطلوبة لعملية تسجيل الدخول
				List<NameValuePair> params = new ArrayList<NameValuePair>();
				params.add(new BasicNameValuePair(TAG_USERNAME, username));
				params.add(new BasicNameValuePair(TAG_PASSWORD, password));

				// فقط لتتبع ما يحصل في LogCat
				Log.d("request!", "starting");

				// نقوم بارسال طلب POST الى رابط تسجيل الدخول مع إضافة الباراميتيرز
				// للحصول على JSON Objects 
				JSONObject json = JSONParser.makeHttpRequest(LOGIN_URL, "POST",	params);

				// فقط لتتبع ما يحصل في LogCat
				Log.d("Login attempt", json.toString());

				// نضع قيمة success والتي حصلنا عليها من JSON
				// بداخل المتغير success
				success = json.getInt(TAG_SUCCESS);

				/*
				 * في حال كانت قيمة success = 1 يعني ذلك انه تم التسجيل بنجاح
				 * أكتب الأمر الذي تريد تنفيذه سواء نقل المستخدم الى أكتيفيتي
				 * أخر أو اي شي تريده
				 * 
				 * ******************************** أما في حالة قيمة success = 0
				 * يعني انه توجد مشكلة سواء من المستخدم أو من السيرفر المستضيف
				 * حينها أكتب الأمر الذي تريده
				 */
				if (success == 1) {
					Log.d("Login Successful!", json.toString());

					Intent i = new Intent(MainActivity.this,
							UsersActivity.class);

					startActivity(i);
					return json.getString(TAG_MESSAGE);
				} else {
					Log.d("Login Failure!", json.getString(TAG_MESSAGE));
					return json.getString(TAG_MESSAGE);

				}
			} catch (JSONException e) {
				e.printStackTrace();
			}

			return null;

		}

		protected void onPostExecute(String file_url) {
			// نقوم بإخفاء الدايلوج بعد الانتهاء
			pDialog.dismiss();

			// نقوم بعرض الرسالة الناتجة من دالة doInBackground()
			if (file_url != null) {
				Toast.makeText(MainActivity.this, file_url, Toast.LENGTH_LONG)
						.show();

			}

		}

	}

}

 

RegisterActivity.java

/***
 * @author Ahmed Saleh
 * Created by ahmadssb on 2014-12-13
 * Website: http://www.ahmadssb.com
 * Email: [email protected]
 * Facebook: https://www.facebook.com/ahmadssbblog
 * Twitter: https://twitter.com/ahmadssb
 * YouTube: http://www.youtube.com/user/ahmadssbblog
 */

package com.ahmaadssb.androidwebservices;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class RegisterActivity extends Activity implements OnClickListener {
	private EditText user, pass, displayname;
	private Button btnRegister;

	private ProgressDialog pDialog;

	JSONParser jsonParser = new JSONParser();

	// من خلال شبكة الواي فاي
	private static String REGISTER_URL = "http://192.168.1.103/GoogleDrive/android-webservice1/register.php";


	// من خلال Android emulator
	// private static String REGISTER_URL = "http://10.0.2.2/GoogleDrive/android-webservice1/register.php";

	// من خلال رابط الموقع على الانترنت
	// private static String REGISTER_URL = "http://www.YOUR-DOMAIN.com/GoogleDrive/android-webservice1/register.php";


	/***
	 * كما فعلنا في ملفات PHP 
	 * قمنا بوضع مفاتيح (متغيرات) ل JSON
	 * يفضل أن نقوم بتعريفها كـ static final
	 * لأنها قيم ثابتة سنحتاجها لاحقا 
	 */
	private static final String TAG_SUCCESS = "success";
	private static final String TAG_MESSAGE = "message";
	private static final String TAG_USERNAME = "username";
	private static final String TAG_PASSWORD = "password";
	private static final String TAG_DISPLAYNAME = "displayname";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.register_layout);


		user = (EditText) findViewById(R.id.edtRegisterUserName);
		pass = (EditText) findViewById(R.id.edtRegisterPassword);
		displayname = (EditText) findViewById(R.id.edtRegisterDisplayName);

		btnRegister = (Button) findViewById(R.id.btnRegister);
		btnRegister.setOnClickListener(this);

	}

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		new Register().execute();
	}

	/***
	 * 
	 * @author Ahmadssb 
	 * في هذا الكلاس سنقوم بالإتصال برابط تسجيل مستخدم جديد  ونقوم
	 * ارسال الباراميترز المطلبوية ussername , password, displayname
	 * ومن ثم نحصل على JSON Response
	 * وأخيرا حسب قيمة success نقرر ما سنقوم بعمله
	 * 
	 */
	class Register extends AsyncTask<String, String, String> {

		boolean failure = false;

		// نقوم بعرض ProgressDialog
		// حتى تنتهي جميع الأوامر الموجودة في doInBackground()
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			pDialog = new ProgressDialog(RegisterActivity.this);
			pDialog.setMessage("محاولة تسجيل مستخدم جديد...");
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(true);
			pDialog.show();
		}

		@Override
		protected String doInBackground(String... args) {
			// TODO Auto-generated method stub
			// نقوم بتسجيل البيانات الموجودة في حقول username و password و displayname كنص

			int success;
			String username = user.getText().toString();
			String password = pass.getText().toString();
			String sdisplayname = displayname.getText().toString();
			try {
				// نقوم ببناء الباراميترز المطلوبة لعملية تسجيل الدخول
				List<NameValuePair> params = new ArrayList<NameValuePair>();
				params.add(new BasicNameValuePair(TAG_USERNAME, username));
				params.add(new BasicNameValuePair(TAG_PASSWORD, password));
				params.add(new BasicNameValuePair(TAG_DISPLAYNAME, sdisplayname));

				//فقط لتتبع ما يحصل في LogCat
				Log.d("request!", "starting");
				
				// نقوم بارسال طلب POST الى رابط تسجيل الدخول مع إضافة الباراميتيرز
				// للحصول على JSON Objects 
				JSONObject json = JSONParser.makeHttpRequest(REGISTER_URL,"POST", params);
				//فقط لتتبع ما يحصل في LogCat
				Log.d("Register attempt", json.toString());

				// نضع قيمة success والتي حصلنا عليها من JSON
				// بداخل المتغير success
				success = json.getInt(TAG_SUCCESS);

				/*
				 * في حال كانت قيمة success = 1 يعني ذلك انه تم التسجيل بنجاح
				 * أكتب الأمر الذي تريد تنفيذه سواء نقل المستخدم الى أكتيفيتي
				 * أخر أو اي شي تريده
				 * 
				 * ******************************** أما في حالة قيمة success = 0
				 * يعني انه توجد مشكلة سواء من المستخدم أو من السيرفر المستضيف
				 * حينها أكتب الأمر الذي تريده
				 */
				if (success == 1) {
					Log.d("User Created!", json.toString());
					finish();
					return json.getString(TAG_MESSAGE);
				} else {
					Log.d("Register Failure!", json.getString(TAG_MESSAGE));
					return json.getString(TAG_MESSAGE);

				}
			} catch (JSONException e) {
				e.printStackTrace();
			}

			return null;

		}

		protected void onPostExecute(String file_url) {
			// نقوم بإخفاء الدايلوج بعد الانتهاء
			pDialog.dismiss();
			
			// نقوم بعرض الرسالة الناتجة من دالة doInBackground()
			if (file_url != null) {
				Toast.makeText(RegisterActivity.this, file_url,
						Toast.LENGTH_LONG).show();
			}

		}

	}

}

 

بإمكانك تحميل المشروع من خلال GitHub :
https://github.com/ahmadssb/Android-PHP-MySQL-JSON-Tutorial.git

5 Comments

Add a Comment
  1. WordPress › Error

    There has been a critical error on this website.

    Learn more about troubleshooting WordPress.