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.
Android Login Ekran Yapımı 1 (Php ve Mysql kullanarak)
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=="[email protected]" && $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.
Öncelikle merhaba , webservice ile login girişi yapacağım fakat bir şeyi anlayamadım.Daha önceden giriş yapıp yapmadığını kontrol etmemiz yeterli mi , yani sharedpreferences ‘e gerek kalmıyor mu ?
Burada ben Sqlite database kullanmıştım. Login bilgilerini databasede tutuyor.Burdaki ders üzerinden gideceksen Shared kullanmana gerek kalmıyor. Ama database kullanmak istemezsen burda database kaydettiğim verileri sharedpreferences’a kaydederek tutabilirsin.Onunla ilgilide dersim mevcuttu.
Cevabınız için teşekkür ederim , web service ile kullanıcı adı ve şifrelerini çekmeyi düşünüyorum. Sadece daha önce girilip girilmediğini kontrol etmem yeterli sanırım buradaki şekilde..
Kullanıcıları webdeki databasede mi tutacaksın?
Kullanıcıları web service’ten çekeceğim. Tekrar sharedpreferences’e gerek kalmayacak sanırım doğru mu anladım? Yani sadece giriş olacak , kayıtlarım zaten web service’te hazır olacak. Sadece giriş yaptıracağım bilgilere göre.Yüksek bir miktarda kullanıcı kaydı oldugunu varsayalım..
Şimdi kullanıcı giriş yaptı sonra uygulamayı kapattı diyelim. Birdaha ki açtığında tekrardan login ekranı çıkmasını istiyorsan herhangi bir kayıt yapısı (Sqlite,sharedpref vs..) kullanmana gerek yok. Ama genel olarak uygulamalar birkere login olduktan sonra birdaha login olmanı istemez facebook,twitter,gmail.. İşte yapın böyle olacaksa burda SharedPref yada sqlite kullanman gereklidir.
Tekrar giriş ekranının gelmesini istemiyorum , ms-sql ile 10 bin kullanıcı kaydı tutacagım(webservice). Tekrar hatırlamasını istiyorum fakat SharedPref bu kadar kaydı tutuyor mu ?
Hayır kullanıcıları mobil cihazlarda tutmucaksın. Uygulamana giriş yaptım. Kullanıcı bilgilerimi doldurdum ve giriş dedim. Sen bu giriş bilgilerini webservice gönderdin ve databasede bulunan kişiler arasında arattın ve login bilgilerinin doğru olduğunu gördün. Geriye true olarak bir değer döndün. Bu değeri sharedPref’e kaydettin ve beni uygulamana giriş yaptırdın(Bu değer uygulama ilk açıldığında boş veya false olarak kayıtlıydı). Ben uygulamadan çıkıp tekrar girdiğimde sen sharedPrefdeki değere bakıcaksın true ise zaten login deyip uygulamaya direk yönlendireceksin. Eğer false ise login ekranına yönlendireceksin.Bunun mantığı zaten örnek kodlardada var.
Cevabınız için çok teşekkür ederim , ilginiz ve dersleriniz içinde. 🙂
Önemli değil:)
Kolay Gelsin..
İyi günler,xampp ile bir mysql db oluşturdum fakat sizin kodlamanızda aklıma takılan şeyler var siz adres’i verdiniz db’nin fakat şifre falan gerekmedi bir yazılım ile şifresiz giriliyorsa başkası da programımızı böyle kontrol edemez mi ?
Burdaki kontrol static oluyor.Databaseden kontrol yapmıyoruz.
if($mail==”[email protected]” && $sifre ==”123456″) bu satırdaki kodla kontrolü static olarak gerçekleştiriyoruz.
Ama bundan sonraki kayıt dersinide incelersen orda static değil dinamik(databaseden) olarak kontrol gerçekleştiriyoruz.
İyi günler hocam {: kodlarınızı incelemek için indirdim programa giriş deneyince hata veriyor ve kapanıyor benim programım da aynı şekilde oldu nedeni nedir sizce?
Uygulamaya giriş yaparken mi hata veriyor?Yoksa açılır açılmaz mı?
Uygulama açıldı Login ekranında giriş butonuna tıklayınca giriş yapılıyor ve hemen ardından çalışmayı durdudu hatası.
Şuan çalısıyor “[email protected]” mail adresi ve 123456 şifresi ile deneyebilirsin.
Su anda Aynı Hatayı Yasıyorum Uygulama Acılıyor Login Butonuna Tıkladıgımda Uygulama Durdu Diye Hata Veriyor
Bizim servisimize mi bağlısın kendi yazdığın servise mi ?
2 sindede denedim sonuc aynı hatta hotmaili değistirdim yine aynı localhost’da denedim yine aynı << nedenini nasıl ogreniriz
Kusura bakmayın çok soru soruyor olabilirim fakat konu biraz düşündürücü
Biz zaten mysql database’e bağlanmadık mı ?
yazılımdaki database oluşturuyoruz şuan demeniz’İ anlamadım programın içinde ayrı bir db mi yapıyoruz ?
Burdaki dersimizde database bağlantısı yapmıyoruz. Eğer php dosyasına bakarsan bunu anlayabilirsin.Kullanıcı adı ve şifresini yolluyoruz ve static olarak kontrol ediyoruz. Bu ders iki aşamadan oluşan bir ders .Database bağlantısı yapıp sorgu yapmayı yada yeni kullanıcı eklemeyi istiyorsan bu dersime bakman gerekir.
http://www.mobilhanem.com/android-login-ekran-yapimi-2-kayit-islemi/
Teşekkürler Gösterdiğiniz İlgi İçin.
merhaba ben bu php işini anlamadım . notepad++ ta yazdığımız php kodlarını projeye nasıl dahil ediyoruz acaba
Projeye dahil etmiceksnz . Linux bir sunucuda ayrı çalıştıracaksınız.
Merhaba öncelikle ders için teşekkürler çok güzel bir kaynak bir sorun çıkıyor resimdeki gibi doğru yazıyorum ama hatalı gösteriyor nerde hata yapıyorum ?
SQLiteHandler class’ın SQLiteOpenHandler classına extend etmeli.
hocam merhaba,benim bu şekilde veritabanım var ve kullanıcı kayıt sayfam var.ekleme işlemlerini kullanıcı kayıt.java da yaptım program şuan sorunsuz çalısıyor ama programı her açtığımda kaydol sayfası geliyor ben bunu kaydol sayfasını bir defaya mahsus yapmak istiyorum.sizin bu kodunuz saatlerdir uğraşıp yapmaya çalıştım ama olmadı yardımcı olurmusunuz acaba?
Bu dersimde sorunun karşılığını bulabilirsin:
http://www.mobilhanem.com/android-sharedpreferences-kullanarak-login-ekran-yapimi/
Hocam Merhaba ben de yeni katıldım buralara da tam kullanmayı bilmiyorum. Yaklaşık 3 gün önce androide başladım ama hızlı ilerledim sanırım..azıcık tabanım vardı. yalnız bir sorunum var ana uygulamaya başka bir projede yaptığım toolbar ı eklemek istiyorum fakat yapamadım. nasıl yardımcı olabilir siniz?
Toolbardan kastın nedir?
selamın aleyküm hocam ben bu hazır halini indirdimde kullanıcı adını ve şifresini nereden belirliyoruz
Güzel bir paylaşım elinize sağlık.
Örnek kodları indirdim Android studio ile çalıştırdım uygulama hata verip kapandı yine aynı platformda apk haline getirip pc de Memu içine kurdum kapandı telefonuma kurdum yine kapandı.Giriş yaparken sizin [email protected] şifre 123456 yı kullandım. denemek için saçma bir mail ve şifre kullansamda kapanıyor … Android Studyoda debug yaptığımda bir problem gözükmüyor sorunu nasıl çözebilirim.uygulama kapanınca studyoda şu hata veriyor.Login.php yide paylaşırsanız sevinirim
06-10 20:11:12.967 3894-4211/com.mobilhanem.loginkontrol A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4200000150 in tid 4211 (AsyncTask #1)
Hocam selamlar, benim bir uygulamam var ve bu uygulamaya php mysql kullanarak login – register işlemi yaptırabiliyorum. Benim istediğim şuan beni hatırla özelliği yapmak, kullanıcın her uygulamaya her girdiğinde kullanıcı adı ve şifresini yazmadan girişini sağlamak. Ama login – register olayını başka bir dersten yaptığım için sizin bu derste yaptığınız beni hatırla olayını kendi uygulamama entegre edemedim. Yardımcı olabilir misiniz hocam bu konuda
Takıldığın yeri sorucevap.mobilhanem.com dan sorabilirsin. Yada bu dersteki gibi kodlarını değiştirebilirsin.
Ben uygulamamda mysql kullandım hostinger’ın ücretsiz hostunu kullandım ama bu derste sqlite göstermişsiniz, biraz kafam karıştı neler ekleyeceğimi anlayamadım, teamviewer ile bağlanıp ilgilenebilir misiniz acaba?
Yani benim istediğim şey sadece login olduktan sonra bir daha login ekranı açılmadan kullanıcının ana menüye gitmesi, beni hatırla olayı. Login -register sistemi hazır
Bu ders zaten onun için yazıldı. Login bilgisini bir defa girdikten sonra tekrar girilmemesi için. Dersi baştan sonu bir oku , mysql nerde sqlite nerde kullanılmıs zaten anlarsın. Teamviewer yolu ile kimseye yardım etmiyoruz.
Anladım hocam tamam, Fonksiyonlar adında bir java classı oluşturmuşsunuz, benim de projemde bunu oluşturmam şart mı? Bu classın ne işe yaradığını pek anlayamadım
İyi günler. Bende kendi uygulamam için bu kodları biraz düzenleyip uygulamaya ekledim fakat giriş butonuna tıklandığında uygulama durdu hatası alıyorum. birçok yere try catch yerleştirdim fakat bi sonuç alamadım. Neden olabilir?
Sunucu olarak bizim sunucuya mı bağlısın kendi sunucuna mı bağlanıyorsun ?
localhosta wamp server üzerinden bağlanıyorum.
bizim server’a bağlandığında hatasız çalışıyor mu ?
Maalesef yine duruyor.
Ben bu dersi daha 1 hafyta önce güncelledim ve sıkıntısız çalışıyordu. LogCat çıktısını paylaşır mısın crash’in.
12-13 10:31:25.946 8707-8870/com.deneme.deneme E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.deneme.deneme, PID: 8707
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String org.json.JSONObject.getString(java.lang.String)’ on a null object reference
at com.deneme.deneme.GirisActivity$GirisKontrol.doInBackground(GirisActivity.java:133)
at com.deneme.deneme.GirisActivity$GirisKontrol.doInBackground(GirisActivity.java:112)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
12-13 10:31:26.584 8707-8760/com.deneme.deneme E/Surface: getSlotFromBufferLocked: unknown buffer: 0xae5b9ae0
12-13 10:31:26.599 8707-8760/com.deneme.deneme D/OpenGLRenderer: endAllStagingAnimators on 0xa298d480 (RippleDrawable) with handle 0xae5929d0
12-13 10:31:26.640 8707-8707/com.deneme.deneme E/WindowManager: android.view.WindowLeaked: Activity com.deneme.deneme.GirisActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{fbecf81 V.E…… R……D 0,0-1026,304} that was originally added here
at android.view.ViewRootImpl.(ViewRootImpl.java:368)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.app.Dialog.show(Dialog.java:319)
at com.deneme.deneme.GirisActivity$GirisKontrol.onPreExecute(GirisActivity.java:164)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:604)
at android.os.AsyncTask.execute(AsyncTask.java:551)
at com.deneme.deneme.GirisActivity$1.onClick(GirisActivity.java:94)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-13 10:31:26.655 8707-8760/com.deneme.deneme E/Surface: getSlotFromBufferLocked: unknown buffer: 0xae5b9a70
Sen bizim uygulamamız üzerinden mi test ediyorsun yoksa kendi uygulamanı yazıp bu kodlarımı ekledin.Bizim uygulama sorunsuz çalışıyor. Senin uygulamandaki crash sebebine gelince bağlantıda cevap boş geliyor gibi gözüküyor. Sunucu tarafından cevabın kesin geldiğine emin misin? Bunu anlamak için uygulamayı debug modda çalıştırıp satır satır inceleme yaparsan, cevabın gelip gelmediğini anlayabilirsin.
Dediğim gibi kendi uygulamama bu kodları düzenleyip ekledim ve sanırım burada bir hata yaptım. ama sadece yaptığım şey mail yerine kullanıcı adını yazmaktı. Bundan kaynaklı olabilir mi ?
Sunucu tarafında işlemleri nasıl yaptın bilemem ama hatan zaten şurda yazıor:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String org.json.JSONObject.getString(java.lang.String)’ on a null object reference
Sunucudan gelen cevap null olduğu için crash atıyor.
Bana vakit ayırıp sorularımı yanıtladığınız için teşekkür ederim. Debug olarak çalıştırmayı deneyeceğim. Çok teşekkür ederim.
Debug hakkında buradan bilgi alabilirsin.
https://www.mobilhanem.com/android-studio-debug-kullanimi/
peki localhostunu adresini telefonun bulabileceği şekildemi yazdın. http://localhost/bal bla yazarsan bulamaz 😀
localhostu telefonun görebileceği şekilde yazarsan bulabiliyor ve çalışıyor