Site icon Mobilhanem

Android Login Ekran Yapımı 1 (Php ve Mysql kullanarak)

Merhaba arkadaşlar bu dersimizde php ve mysql kullanarak androidde login ekranı yapımını anlatacağım.İlk dersimizde sadece login olmayı ikinci dersimizde yeni kayıt yapmayı sonraki derslerde ise facebook ve twitter logini anlatacağım.
Buradaki mantık kullanıcı bir defa login bilgileriyle uygulamaya giriş yaptığında bundan sonraki girişlerinde login bilgilerini tekrar istemeden uygulamaya giriş yapmasıdır.İşleyiş şöyledir.Kullanıcı bilgileri girer bu bilgiler sunucuya gönderilir ve kullanıcı kayıtlı ise gerekli kontrollerden sonra giriş yapılmasına izin verilir ve kullanıcı bilgileri SQLite database kayıt edilir.
1. dersimizde sadece login olmayı göstereceğim. 2.derste kayıt olmayı ,3.derste facebook login ve 4.derste twitter logini anlatmaya çalışacağım.Bu dersimizi yazmış olduğum uygulama ile anlatmaya çalışacağım ve her derste bu uygulamayı geliştirerek devam edeceğim.
Tasarım konusunda fazla uğraşmadım sizler tasarımını istediğiniz gibi değiştirip kullanabilirsiniz.
Bu uygulamamızda database olarak SQLite Database kullandık. Bu derste database kullanımını anlatmayacağım. SQLite database kullanımı hakkında ayrıntılı bilgiyi buradaki dersimizde bulabilirsiniz.

Database sınıfını inceleyelim:

import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Database extends SQLiteOpenHelper {

	// All Static variables
	// Database Version
	private static final int DATABASE_VERSION = 1;

	// Database Name
	private static final String DATABASE_NAME = "login_database";//database adı

	private static final String TABLE_NAME = "login";
	private static String KULLANICI_ID = "id";
	private static String KULLANICI_MAIL = "mail";
	private static String KULLANICI_SIFRE = "sifre";
	private static String KAYIT_TARIHI = "tarih";

	
	public Database(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	
	@Override
	public void onCreate(SQLiteDatabase db) {  // Databesi oluşturuyoruz.Bu methodu biz çağırmıyoruz. Databese de obje oluşturduğumuzda otamatik çağırılıyor.
		String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
				+ KULLANICI_ID + " INTEGER PRIMARY KEY," 
				+ KULLANICI_MAIL + " TEXT,"
				+ KULLANICI_SIFRE + " TEXT,"
				+ KAYIT_TARIHI + " TEXT" + ")";
		db.execSQL(CREATE_TABLE);
	}


	
	public void kullaniciEkle(String mail,String sifre,String tarih) { 
		//kullaniciEkle methodu ise adı üstünde Databese veri eklemek için 
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put(KULLANICI_MAIL, mail);
		values.put(KULLANICI_SIFRE, sifre);
		values.put(KAYIT_TARIHI, tarih);

		db.insert(TABLE_NAME, null, values);
		db.close(); //Database Bağlantısını kapattık*/
	}
	
	
	public HashMap<String, String> kullaniciDetay(){
		//Bu methodda sadece tek row değerleri alınır.
		
		//HashMap bir çift boyutlu arraydir.anahtar-değer ikililerini bir arada tutmak için tasarlanmıştır.
		//mesala map.put("x","300"); mesala burda anahtar x değeri 300.
		
		HashMap<String,String> kisi = new HashMap<String,String>();
		String selectQuery = "SELECT * FROM " + TABLE_NAME;
		 
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
        	kisi.put(KULLANICI_MAIL, cursor.getString(1));
        	kisi.put(KULLANICI_SIFRE, cursor.getString(2));
        	kisi.put(KAYIT_TARIHI, cursor.getString(3));        	
        }
        cursor.close();
        db.close();
		// return kişi
		return kisi;
	}
	
	
	public int getRowCount() { //tabloda kaç satır kayıtlı olduğunu geri döner

		String countQuery = "SELECT  * FROM " + TABLE_NAME;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(countQuery, null);
		int rowCount = cursor.getCount();
		db.close();
		cursor.close();
		// return row count
		return rowCount;
	}
	

	public void resetTables(){ 
		// Tüm verileri siler. tabloyu resetler.
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(TABLE_NAME, null, null);
		db.close();
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub
		
	}

}

login_database adında oluşturduğumuz databasede login adında bir tablo oluşturduk ve bu tabloda 4 değer tutuyoruz id,mail,şifre ve ne zaman kayıt olduğu bilgilerini tutuyoruz. Tabi burada uygulamanın gereksimine göre farklı bilgilerde tutabiliriz. Önümüzdeki derslerde bu tabloyu dahada genişleterek kullanacağız.

Şimdi MainActivity sınıfını inceleyelim:

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.app.Activity;
import android.content.Intent;

public class MainActivity extends Activity {

	
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if(Fonksiyonlar.giriskontrol(getApplicationContext())){//önceden giriş yapmış ise
			setContentView(R.layout.activity_main);
			Button cikis=(Button)findViewById(R.id.button1);
			
			cikis.setOnClickListener(new View.OnClickListener() { //Çıkış butonu tıklandığında
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					Database db = new Database(getApplicationContext());
					db.resetTables(); //Databasi sıfırlıyoruz.Verileri siliyoruz.Ve Login sayfasına gidiyoruz.
					
					Intent anasayfa = new Intent(getApplicationContext(),LoginPage.class );
		            startActivity(anasayfa);
		            finish();
				}
			});
			
		}else{//giriş yapmamış ise login sayfasına yönlenecek
			 Intent anasayfa = new Intent(getApplicationContext(),LoginPage.class );
             startActivity(anasayfa);
             finish();
		}
		
	}

	

}

Uygulama acıldığında MainActivity açılıyor ve girişkontrol() metoduyla databaseden login tablosundan önceden giriş yapılıp yapılmadığını kontrol ediyor .

public static boolean giriskontrol(Context context){
		Database db = new Database(context);
		int count = db.getRowCount();// databasedeki table logindeki row sayısı
		if(count > 0){//0 dan fazla ise giriş yapmıs önceden demek
			//kullanıcı giriş yapmıs
			return true;
		}
		return false;
	}

Önceden giriş yapıldıysa layout dosyası uygulamaya dahil ediliyor tasarım yükleniyor ve uygulama normal şekilde kullanılmaya devam ediyor.Eğer önceden giriş yapılmadıysa Login Sayfasına yönlendiriliyor.Ben bu uygulamada Splash Screen kullanmadığım için bu kontrolü MainActivity de yaptım.Eğer sizler SplashScreen kullanırsanız bu kontrolü SplashScreen de yapın ve giriş yapılmışsa MainActivity e eğer yapılmamışsa login Sayfasına yönlendirin.

Şimdi LoginPage classı inceleyelim:


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
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.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class LoginPage extends Activity {
	Button giris;
	EditText mail_input,sifre_input;
	String mail,sifre,sonuc,tarih;
	String hata_mesaji="";
	String URL_POST= "http://www.mobilhanem.com/test/login.php";
	ProgressDialog pDialog;
	Boolean hata = false;
	PostClass post = new PostClass();
	JSONObject cevap=null;
	public String donus_hata_mesaji;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.loginpage);
		mail_input = (EditText) findViewById(R.id.editText1);
		sifre_input = (EditText) findViewById(R.id.editText2);
		giris = (Button) findViewById(R.id.button1);
		
		giris.setOnClickListener(new View.OnClickListener() {//giriş butonu tıklandığında

			public void onClick(View v) {
				
				mail = mail_input.getText().toString();//edittext değerini alıyoruz
				sifre = sifre_input.getText().toString();//edittext değerini alıyoruz
				
				//Tarih bilgisini almak için 
				Calendar c = Calendar.getInstance();
				SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy");
				tarih = format.format(c.getTime());
				
				//Edittextlerden aldığımız mail ve şifreleri kontrol ediyoruz
				if(mail.matches("")){
					hata_mesaji += "Üye No yada E-Mail Alanı Boş Olamaz\n";
					hata = true;
				}
				if(!Fonksiyonlar.isEmailValid(mail)){//Mail format kontrol
					hata_mesaji += "Yanlış e-mail formatı\n";
					hata=true;
				}
				
				int sifre_karakter = sifre.length();
				if(sifre_karakter<6 || sifre_karakter==0){
					hata_mesaji += "Şifre 6 Karakterden Az Olamaz\n";
					hata=true;
				}
				
				if(hata){//hata varsa AlertDialog ile kullanıcıyı uyarıyoruz.
					AlertDialog alertDialog = new AlertDialog.Builder(LoginPage.this).create();
		            alertDialog.setTitle("Hata");
		            alertDialog.setMessage(hata_mesaji);
		            alertDialog.setCancelable(false);
		            alertDialog.setButton(RESULT_OK,"Tamam", new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int which) {
							sifre_input.setText("");
							hata_mesaji = "";
							hata = false;
						}
					});
		            alertDialog.show();
				}else{//Hata yoksa Asynctask classı çağırıyoruz.İşlemlere orda devam ediyoruz
					new GirisKontrol().execute();
				}
				
				
			}
		});
		
	}

	class GirisKontrol extends AsyncTask<Void, Void, Void> {
		private String sonucmesaji;

		protected void onPreExecute() {
	        //  progress dialog 
	        pDialog = new ProgressDialog(LoginPage.this);
	        pDialog.setMessage("Giriş Yapılıyor...");
	        pDialog.setIndeterminate(true);
	        pDialog.setCancelable(false);
	        pDialog.show();
	    }
	 
	    protected Void doInBackground(Void... unused) {
	    	 // Building Parameters
	    	//String sifre_sha1 = Fonksiyonlar.sha1(sifre); //istersek sha1 şifreleme fonksiyonunu kullanabiliriz
            List<NameValuePair> params = new ArrayList<NameValuePair>();
    		params.add(new BasicNameValuePair("mail", mail));
    		params.add(new BasicNameValuePair("sifre", sifre));
            String json = post.httpPost(URL_POST,"POST",params,20000);
            
            Log.d("Gelen Json",""+json);//Gelen veriyi logluyoruz.Log Catten kontrol edebiliriz
            try {
            	
            	cevap = new JSONObject(json);
            	sonucmesaji = cevap.getString("sonucmesaji");
            	
                if (cevap.getString("sonuc") != null) {
                    sonuc = cevap.getString("sonuc");
                    if(Integer.parseInt(sonuc) == 1){ //Eğer giriş başarılı ise
                    	Database db = new Database(getApplicationContext());
						db.resetTables();
						db.kullaniciEkle(mail, sifre, tarih);	//kullanıcıyı ekliyoruz.Ve Main activitye yönlendiriyoruz.			
						
						//Sonuc başarılı ise main activitye yönlendirdk.
                        Intent anasayfa = new Intent(getApplicationContext(),MainActivity.class );
                        startActivity(anasayfa);
                        finish();
                        
                    }
                }
            	
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;     	
	    }       
	    // Sonuç başarılı ise bu kod çalışmıcak çünkü Main activitye yönlenmiş durumda
	    protected void onPostExecute(Void unused) {
	        // closing progress dialog
	    	pDialog.dismiss();
            // updating UI from Background Thread
	    	 runOnUiThread(new Runnable() {
					public void run() {   
		            		if(Integer.parseInt(sonuc) == 0){// Sonuç başarılı değil ise 
			                	AlertDialog alertDialog = new AlertDialog.Builder(LoginPage.this).create();
					            alertDialog.setTitle("Hata");
					            alertDialog.setMessage(sonucmesaji);//Sonuc mesajıyla bilgilendiriyoruz.
					            alertDialog.setCancelable(false);
					            alertDialog.setButton(RESULT_OK,"Tamam", new DialogInterface.OnClickListener() {
									public void onClick(DialogInterface dialog, int which) {
										sifre_input.setText("");
									}
								});
					            alertDialog.show();
		                    }
		            	}
	                    
	                
	            });
	    }
	}
	

}

Kod üzerinde gerekli açıklamaları yapmaya çalıştım. Edittextlerden değerleri alıp gerekli kontrollerden sonra sunucuya gönderiyoruz.Sunucudan gelen Json veri değerini parse ediyoruz.Eğer sonuç 0 ise hatayı AlertDialog ile kullanıcıya bidiriyoruz.Sonuç 1 ise database verileri kaydedip MainActivitye geçiş yapıyoruz.Bu derste Json veriyi nasıl parse ettiğimizi açıklamıyacağım.Bu konu hakkında detaylı bilgiyi buradaki dersimizden bulabilirsiniz.
Burada email formatının doğru olup olmadığını bu fonksiyonla kontrol ediyoruz:

public static boolean isEmailValid(String email) { //mail formatı kontrol eder
	    boolean isValid = false;

	    String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
	    CharSequence inputStr = email;

	    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
	    Matcher matcher = pattern.matcher(inputStr);
	    if (matcher.matches()) {
	        isValid = true;
	    }
	    return isValid;
	}

Sunucu tarafını PHP ile kodladım.Bu derste Mysql kullanmayıp basit bir kontrol yaptık.Bir dahaki dersimizde kullanıcı kayıtta yapıcağımız için Mysql de kullanacağız ve sorguları database üzerinden yapacağız.

Şimdi PHP dosyamıza login.php ye göz atalım:

<?php 
if($_POST){//eğer posttan geliyorsa işlem yapacak
	$mail = $_POST["mail"];//mail adresini aldık
	$sifre = $_POST["sifre"];//sifreyi aldık
	//mail ve şifreyi androidde kontrol etmiştik .Güvenlik acısından burdada kontrol edeceğiz.
	$hata = false;
	$sonucmesaji = "";
	
	if($mail==""){//mail bos mu
		$hata = true;
		$sonucmesaji = "Mail Adresiniz Boş Olamaz.";
	}
	if(strlen($sifre)<6){//şifre 6 haneden kısamı
		$hata =true;
		$sonucmesaji = "Şifre 6 Haneden kısa olamaz.";
	}
	if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {//mail format kontrol
		$hata =true;
		$sonucmesaji = "Mail Formatı Yanlış.";
	}
	
	if(!$hata){//eğer hata yoksa
		
		if($mail=="tahakirca@mobilhanem.com" && $sifre =="123456"){
		//Burada basit bir eşleştirme yaptık.
		//Bir dahaki derste kullanıcı kayıt etmeyi anlatacağım için işin içine databsede girecek ve sorgular databaseden olacak.
			$sonucmesaji = "Giriş Başarılı.";
			$cevap = array('sonuc' => "1", 'sonucmesaji' => $sonucmesaji);
		}else{
			$sonucmesaji = "Kullanıcı Bulunamadı.";
			$cevap = array('sonuc' => "0", 'sonucmesaji' =>  $sonucmesaji);
		}
	}else{
		$cevap = array('sonuc' => "0",'sonucmesaji' => $sonucmesaji); 
	}
	echo json_encode($cevap);// json verisini yazdırdık
}else{
	echo "Giriş Engellendi";
}
?>

Gerekli açıklamaları kod üzerinde yapmaya çalıştım. Burada dikkat etmemiz gereken çok önemli bir husus var.Php dosyasını kodlarken Utf-8(Bomsuz) olmasına dikkat edelim. Yoksa türkçe karakter olan Json değerleri null dönüyor.Utf-8 bomsuz kodlamayıda notepad++ indirip kodlama menüsünden utf-8 kodlaması (bomsuz) olarak tercih edin.Çok daha iyi anlamak için uygulamanın kaynak kodlarını indirip incelemenizi tavsiye ederim.
Arkadaşlar bu derste anlatmak istediklerim bu kadar. Aklınıza takılan her türlü soruyu sorabilirsiniz.Elimizden geldiğince cevap veririz. Sizden ricam alttaki linklerden derslerimizi her türlü platformda paylaşmanızdır.Bir dahaki derste görüşmek dileğiyle…

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

0
Exit mobile version