Hepimiz günlük hayatımızda arkadaşlarımıza, ailemize, sevdiklerimize mesaj atıyoruz öyle değil mi?Bu olayı,ben de günlük hayatımda çok sık kullanıyorum ve sizin de kullandığınızı tahmin ediyorum. İşte size mesajlaşma servisini keyifli bir hale getirdiğimi düşündüğüm ve keyif alarak oluşturduğum projemden bahsetmek istiyorum.
Şimdi gelin hep birlikte neler yazmışım bir göz atalım ne dersiniz?
Push Notification, BroadcastReceiver, SQLite Veritabanı,Mysql Veritabanı, Php Programlama ve RESTful Web Servisi ile Post ve Get İşlemleri konularını birlikte kullanarak keyifle yazdığım projemin detayları aşağıdaki gibidir.
Projenin İçeriği
Sizlerin hayatını kolaştırmak için oluşturduğum projemden bahsetmeye başlıyorum.
Grup içindeki kullanıcılar,yönetim tarafından verilen şifreler ile uygulamaya giriş yaptıktan sonra, kendi aralarında birbirlerine mesaj göndermesi ve sisteme gelen mesajların ,bu kullanıcılara Push Notification metodlarıyla bildirim olarak gösterilmesidir.Grup içindeki kullanıcılar ,eğer isterlerse, şifreleri ile giriş yaparak, mesajlaşma geçmişlerine bakma imkanlarıda bulunmaktadır.
BroadcastReceiver sayesinde ,uygulama kapalı dahi olsa, gönderilen mesajlar kullanıcıya bildirim ile gösterilmektedir. Projenin örnek resimleri:
Proje uygulayabilmek için atılması gereken adımlar şu şekildedir:
1- Android cihazda ,SQLite veritabanı oluşturmak
2- Android programlamada Push Notification, BroadcastReceiver ve RESTful Web Servisi ile Post ve Get İşlemlerinin yapılması
3- Sunucu tarafında veritabanı(Mysql) oluşturmak
4- Php programlama dili ile mysql ile veritabanına bağlanarak,mesajların girilmesi ve mesajların çekilmesi
İlk olarak olarak, Android arayüzleri için xml kodlarımızı hazırlayalım.
Kullanıcı giriş için şifre formu bulunan activity_main.xml kodları :
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#fff"> <!-- Header Starts--> <LinearLayout android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@layout/header_gradient" android:paddingTop="5dip" android:paddingBottom="5dip"> <!-- Logo Start--> <ImageView android:src="@drawable/giris" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip"/> <!-- Logo Ends --> </LinearLayout> <!-- Header Ends --> <!-- Registration Form --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dip" android:layout_below="@id/header" android:weightSum="1"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#025f7c" android:text="Şifre*"/> <EditText android:id="@+id/sifre" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dip" android:textColor="#404040" android:singleLine="true" android:layout_marginBottom="20dip"/> <!-- Register Button --> <Button android:id="@+id/btn_kayit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:text="Gönder"/> </LinearLayout> <!-- Registration Form Ends --> </RelativeLayout> |
Mesajın girilmesi için oluşturulan activity_send_message.xml kodları
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#fff"> <!-- Header Starts--> <LinearLayout android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@layout/header_gradient" android:paddingTop="5dip" android:paddingBottom="5dip"> <!-- Logo Start--> <ImageView android:src="@drawable/logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip"/> <!-- Logo Ends --> </LinearLayout> <!-- Header Ends --> <!-- Registration Form --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dip" android:layout_below="@id/header" android:weightSum="1"> <!-- Mesaj Label --> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#025f7c" android:text="Mesaj*"/> <EditText android:id="@+id/mesaj" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="5dip" android:textColor="#404040" android:singleLine="true" android:layout_marginBottom="20dip" android:inputType="textMultiLine" android:layout_weight="0.54" /> <!-- Register Button --> <Button android:id="@+id/btn_kayit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:text="Gönder"/> <Button android:id="@+id/btn_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:text="Mesajları Listele"/> </LinearLayout> <!-- Registration Form Ends --> </RelativeLayout> </ScrollView> |
Mesajların listelenmesi için kullanılacak activity_message_list.xml kodları ve mesaj gönder başlığının görüntülenmesi için yazılacak xml; header_gradient.xml e Github linkinden ulaşabilirsiniz.
Kullanıcıların şifreleri ile sisteme giriş yapmaları için , gerekli kontrollerin yazıldığı MainActivity sınıfının kodları:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
package com.tugbaustundag.mesajlasmauygulamasi; import android.app.Activity; import android.content.Intent; import android.os.StrictMode; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import org.json.JSONObject; public class MainActivity extends Activity { private Veritabani db; private EditText sifreInput; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Android cihaz veritabanındaki,kayıt sayısını, getRecordNumber metodu kullanarak alındı. db=new Veritabani(MainActivity.this); int count=db.getRecordNumber(); //Kullanıcı programı her actıgında, mesajla ilgili işlemleri yapmak istedginde,sifre girme ekranı gelmemesi icin kontrol yaptık. //Eğer kullanıcı Android cihaz veritabanında kayıdı yoksa kullanıcı giriş ekran gelcek,kayıt varsada direk Mesaj gönderme ekranı gelmesi icin kontrol yaptık //Android cihaz da kayıt yok ise, sifre girilmesi saglanır if (count == 0) { //Form elemanlarını tanımladık sifreInput=(EditText)findViewById(R.id.sifre); Button btn_kayit=(Button)findViewById(R.id.btn_kayit); btn_kayit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v){ MyMethod myMethod=new MyMethod(); //Form dan gelen degerleri aldık.. String sifre=sifreInput.getText().toString(); //Xss ataklarını önlemek icin,form dan gelen degerleri stripXSS metodunu kullanarak süzgecledik sifre=myMethod.stripXSS(sifre); if(sifre.equals("")|| sifre.equals(null)) { Toast.makeText(getApplicationContext(), "Şifre alanı boş bırakmayın!", Toast.LENGTH_SHORT).show(); } else{ //Sifre kontrolu icin metod cagrıldı ve true/false degeri degiskene atıldı boolean sifreDurum=PasswordControl_in_Server(sifre); //Sifre dogruysa,Android cihazın veritabanına sifre kayıdı yaptım ve SendMessage sınıfına yonlendrdim if(sifreDurum){ //Android cihazın veritabanına sifre kayıtı yapılır db.insertUser(sifre); Intent i=new Intent(MainActivity.this,SendMessage.class); Bundle b=new Bundle(); b.putString("sifre",sifre); i.putExtras(b); startActivity(i); }else{ Toast.makeText(getApplicationContext(),"Yalnış şifre girdiniz", Toast.LENGTH_SHORT).show(); } } } }); } else{ //Kullanıcı grubundan bir kişi sifresi veritabanından silinerek cıkarıldıgında , o kişinin programı actgında mesaj girmesini engelemek icin kontrol yapıyoruz //Yani engelenen kişinin android cihazında sifre kayıdı dahi olsa ,sunucu veritabanında kullanıcı cıkarıldıgından , programı actgında sifre girme ekranı getirmesini sagladık. String sifre=db.getPassword(); boolean sifreDurum=PasswordControl_in_Server(sifre); if(sifreDurum){ //Android cihaz da kayıt varsa bu alana girer ve SendMessage sınıfına yonlendirme yapılır Intent i=new Intent(MainActivity.this,SendMessage.class); Bundle b=new Bundle(); b.putString("sifre",sifre); i.putExtras(b); startActivity(i); }else{ Toast.makeText(getApplicationContext(),"Yönetim tarafından, kullanıcı kaydınız kaldırıldıgından yeniden kayıt olmalısınız", Toast.LENGTH_SHORT).show(); } } } /** * Kullanıcının girdigi sifrenin doğru olup olmadıgna dair kontrolu,sifreyi sunucuya gonderip, sunucu veritabanı kontrollerinden sonra sifre durumunu(true/false) * RESTful Web servisi aracılıgıyla sunucudan cektik * @param sifre * @return boolean */ private boolean PasswordControl_in_Server(String sifre){ //StrictMode kullanarak,ağ erişiminin güvenli bir şekilde yapılmasını sağlıyoruz... StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); String wcfUrl= "http://test.com/passwordControl.php"; String jsonString=""; JSONObject obj=new JSONObject(); boolean sifreDurum=false; try { //RESTful Web servisiyle göndermek isteğimiz içerikleri,Json objesine put methoduyla ekliyoruz.. obj.put("sifre",sifre); HttpClientMy HttpClientMy=new HttpClientMy(); //Sifre kontrolu icin,RESTful Web servisini çağırıp, sifreyi sunucuya gönderen ve sunucudan sifrenin dogru olup olmadıgına dair //(true/false) degerini çekmeyi sağlayn methodu çağırdık, jsonString=HttpClientMy.callWebService(wcfUrl, obj); //Json string ini parse ediyoruz JSONObject reader=new JSONObject(jsonString); JSONObject jsonObject=reader.getJSONObject("Android"); sifreDurum=jsonObject.getBoolean("sifreDurum"); } catch (Exception e) { e.printStackTrace(); } return sifreDurum; } } |
Kullanıcının uygulamayı her açtığında ,şifreyi girerek kullanıcı girişini sağlamaması için,kullanıcıyı Android cihazın veritabanına kaydettim.Bu veritabanı işlemleriyle ilgili yaptığım tüm işlemlerin metotları Veritabani sınıfında bulunmaktadır.Veritabani.java kodları:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
package com.tugbaustundag.mesajlasmauygulamasi; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; import android.util.Log; public class Veritabani extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; //Veritabanı ismi private static final String DATABASE_NAME = "Message"; public Veritabani(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { //kullanici tablosunu olusturma SQL sorgusunu olusturduk String CREATE_USER_TABLE = "CREATE TABLE kullanici ( " + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "sifre TEXT)"; //kullanici tablosunu olusturduk db.execSQL(CREATE_USER_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //Eskiden olusturulan, kullanici adında tablo varsa, kaldırıp yeniden olusturduk db.execSQL("DROP TABLE IF EXISTS kullanici"); this.onCreate(db); } /** * getRecordNumber methodu telefondaki kayit sayisini dondurur * @return */ public int getRecordNumber() { SQLiteDatabase db = this.getReadableDatabase(); String[] columns={"_id"}; Cursor cursor=db.query("kullanici",columns,null,null,null,null,null); int count = 0; if (cursor != null) { count=cursor.getCount(); Log.w("count",String.valueOf(count)); } cursor.close(); db.close(); return count; } //Android cihaza , kullanıcı sifresini kayıt eden metod public void insertUser(String sifre){ SQLiteDatabase db = this.getWritableDatabase(); String table_name="kullanici"; SQLiteStatement sqLiteStatement = db.compileStatement("" + "INSERT INTO " + table_name + " (sifre) " + " VALUES (?) "); sqLiteStatement.bindString(1, sifre); sqLiteStatement.executeInsert(); db.close(); } //Android cihazdaki , kullanıcı sifresini ceken metod public String getPassword() { SQLiteDatabase db = this.getReadableDatabase(); String[] columns={"sifre"}; Cursor cursor=db.query("kullanici",columns,null,null,null,null,null); String sifre=""; if(cursor!=null && cursor.getCount()>0){ cursor.moveToFirst(); sifre = cursor.getString(cursor.getColumnIndex("sifre")); } cursor.close(); db.close(); return sifre; } } |
Mesaj formundan alınan değerleri, RESTful Web Servisi ile sunucuya gönderdiğimiz ve NotificationReceiver sınıfımızı,10 saniyede bir tekrar ederek çalışmasını sağlayan SendMessage sınıf kodları :
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
package com.tugbaustundag.mesajlasmauygulamasi; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.StrictMode; import android.provider.Settings; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.telephony.TelephonyManager; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import org.json.JSONObject; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; public class SendMessage extends ActionBarActivity { private EditText mesajInput; private PendingIntent pendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_message); //NotificationReceiver sınıfımızı,10 saniyede bir tekrar ederek çalısmasını saglayan AlarmManager sınıfını kullanıyoruz Intent dialogIntent = new Intent(getBaseContext(), NotificationReceiver.class); pendingIntent = PendingIntent.getBroadcast(this, 0, dialogIntent, PendingIntent.FLAG_CANCEL_CURRENT); //AlarmManager sınıfını kullanmak icin ALARM_SERVICE servisini tanımlıyorurz... AlarmManager alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); // 1000 * 10 =10 saniye anlamına gelir alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 10, pendingIntent); //---------------- //Form elemanlarını tanımladık mesajInput=(EditText)findViewById(R.id.mesaj); Button btn_kayit=(Button)findViewById(R.id.btn_kayit); Button btn_list=(Button)findViewById(R.id.btn_list); btn_kayit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v){ MyMethod myMethod=new MyMethod(); //Form dan gelen degerleri aldık.. String mesaj=mesajInput.getText().toString(); //Xss ataklarını önlemek icin,form dan gelen degerleri stripXSS metodunu kullanarak süzgecledik mesaj=myMethod.stripXSS(mesaj); if(mesaj.equals("") || mesaj.equals(null)) { Toast.makeText(getApplicationContext(), "Mesaj alanını boş bırakmayın!", Toast.LENGTH_SHORT).show(); } else{ //MainActivity den gelen sifre verimizi Intent ile aldık String sifre=""; Bundle ext=getIntent().getExtras(); if(ext!=null){ sifre=ext.getString("sifre"); } //Kullanıcının gönderdiği mesajı,kendisine bildirim olarak gelmesini engelemede kullanacagımız kontrol icin, // Android cihazın seri numarası alıyouruz.. String deviceId= setDeviceUUID(getApplicationContext()); //Kontrollerimizi geçen dataları, sunucuya gonderen methodu cagırdık.. sendServerData_with_WebService(sifre, mesaj,deviceId); Toast.makeText(getApplicationContext(),"Kayıt yapıldı",Toast.LENGTH_LONG).show(); } } }); //Mesajlari listemele buttonuna tıkladıgında ,mesaj listeleme sayfasına gidebilmesi Intent kullandık... btn_list.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i=new Intent(SendMessage.this,MessageList.class); startActivity(i); } }); } /** * Form dan gelen degerleri ,JSONObject objesine ekleyip ,sendServerDataWithWebService methoduna gonderdik * @param sifre * @param mesaj * @param deviceId */ private void sendServerData_with_WebService(String sifre,String mesaj,String deviceId){ //StrictMode kullanarak,ağ erişiminin güvenli bir şekilde yapılmasını sağlıyoruz... StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); String wcfUrl= "http://test.com/insertMessage.php"; JSONObject obj=new JSONObject(); try { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date =new Date(); //RESTful Web servisiyle göndermek isteğimiz içerikleri,Json objesine put methoduyla ekliyoruz.. obj.put("date",dateFormat.format(date)); obj.put("sifre",sifre); obj.put("mesaj",mesaj); obj.put("deviceId",deviceId); HttpClientMy HttpClientMy=new HttpClientMy(); //RESTful Web servisini çağırıp, içerikleri sunucuya gönderen sağlayan method çağırdık, HttpClientMy.sendServerDataWithWebService(wcfUrl, obj); } catch (Exception e) { e.printStackTrace(); } } /** * Android cihazın, tekil cihaz id (seri numarası) değerini aldık * @param context * @return String */ public String setDeviceUUID(Context context) { final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice, tmSerial, androidId; tmDevice = "" + tm.getDeviceId(); tmSerial = "" + tm.getSimSerialNumber(); androidId = "" + Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); return deviceUuid.toString(); } } |
MyMethod sınıfında stripXSS metodu ile Xss ataklarını önlemek için, metoda gönderilen verileri güvenlik açığı yaratacak karakterlerden temizleme kodu kullandım.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package com.tugbaustundag.mesajlasmauygulamasi; import java.util.regex.Pattern; /** * Bu sınıf,genel olarak kullanıdıgım metodları barındırır */ public class MyMethod { /** * Xss ataklarını önlemek için, metoda gonderilen verileri güvenlik acıgı yaratacak karakterlerden temizliyen method * @param value * @return */ protected String stripXSS(String value) { if (value != null) { value = value.replaceAll("", ""); Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll(""); scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); } return value; } } |
HttpClientMy sınıfında , RESTful Web Servisi kullanarak sunucuya mesaj gönderimi ve sunucudan mesaj çekme metodları bulunmaktadır
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
package com.tugbaustundag.mesajlasmauygulamasi; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicHeader; import org.apache.http.protocol.HTTP; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URI; public class HttpClientMy { //RESTful Web servisini çağırıp, içerikleri sunucuya gönderen sağlayan methodu public static void sendServerDataWithWebService(String wcfUrl,JSONObject jsonObject) { try { //Bağlantıyı sağlamak için HttpClient sınıfımızı tanımlıyoruz HttpClient httpClient = new DefaultHttpClient(); //Post işlemi için sınıfımızı tanımlıyoruz... HttpPost post=new HttpPost(); //Json objesinde tuttugumuz icerikleri String hale getirip, setEntity methoduna atıyoruz.. HttpEntity httpEntity; StringEntity stringEntity=new StringEntity(jsonObject.toString(), HTTP.UTF_8); stringEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); httpEntity=stringEntity; post.setEntity(httpEntity); //RESTful Web Servisinin baglancağı url yi veriyoruz... post.setURI(new URI(wcfUrl)); post.setHeader("Content-type", "application/json"); // HttpEntity tutulan dataların HttpClient tarafından çalıstırılmasını saglama.. httpClient.execute(post); } catch (Exception e) { e.printStackTrace(); } } /** * RESTful Web servisini kullanarak, sunucudan data çekmeyi sağlayan metod * @param wcfUrl * @return String jsonString */ public static String getServerDataWithWebService(String wcfUrl) { String jsonString = ""; try { //Bağlantıyı sağlamak için HttpClient sınıfımızı tanımlıyoruz HttpClient httpClient = new DefaultHttpClient(); HttpResponse response; //Post işlemi için sınıfımızı tanımlıyoruz... HttpPost post=new HttpPost(); //RESTful Web Servisinin baglancağı url yi veriyoruz... post.setURI(new URI(wcfUrl)); post.setHeader("Content-type", "application/json"); // HttpEntity tutulan dataların HttpResponse tarafından çalıstırılmasını saglama.. response=httpClient.execute(post); //response değişkenindeki nesneyi, json string değerine çeviriyoruz... BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = rd.readLine()) != null) { sb.append(line + NL); } //Elde ettigimiz json string i değişkene atadık jsonString = sb.toString(); rd.close(); } catch (Exception e) { e.printStackTrace(); } return jsonString; } //RESTful Web servisini çağırıp, içerikleri sunucuya gönderen ve sunucudan data çekmeyi sağlayn methodu public static String callWebService(String wcfUrl,JSONObject jsonObject) { String jsonString = ""; try { //Bağlantıyı sağlamak için HttpClient sınıfımızı tanımlıyoruz HttpClient httpClient = new DefaultHttpClient(); HttpResponse response; //Post işlemi için sınıfımızı tanımlıyoruz... HttpPost post=new HttpPost(); //Json objesinde tuttugumuz icerikleri String hale getirip, setEntity methoduna atıyoruz.. HttpEntity httpEntity; StringEntity stringEntity=new StringEntity(jsonObject.toString(), HTTP.UTF_8); stringEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); httpEntity=stringEntity; post.setEntity(httpEntity); //RESTful Web Servisinin baglancağı url yi veriyoruz... post.setURI(new URI(wcfUrl)); post.setHeader("Content-type", "application/json"); // HttpEntity tutulan dataların HttpResponse tarafından çalıstırılmasını saglama.. response=httpClient.execute(post); //response değişkenindeki nesneyi, json string değerine çeviriyoruz... BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = rd.readLine()) != null) { sb.append(line + NL); } //Elde ettigimiz json string i değişkene atadık jsonString = sb.toString(); rd.close(); } catch (Exception e) { e.printStackTrace(); } return jsonString; } } |
NotificationReceiver sınıfında , sunucudan mesajları çekme , Push Notification ile bildirim yapma ve gelen bildirim mesajının tekrar tekrar gösterilmemesi için mesaj_id değerinin sunucuya iletilmesi için kodlar bulunmaktadır.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
package com.tugbaustundag.mesajlasmauygulamasi; import android.annotation.TargetApi; import android.app.AlarmManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.StrictMode; import android.provider.Settings; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class NotificationReceiver extends BroadcastReceiver { int MID=0; @Override public void onReceive(Context context, Intent intent) { //StrictMode kullanarak,ağ erişiminin güvenli bir şekilde yapılmasını sağlıyoruz... StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); // RESTful Web servisini kullanarak, sunucudan data çekmeyi sağlayan metoduzu cagırdık HttpClientMy HttpClientMy = new HttpClientMy(); String wcfUrl = "http://test.com/getMessage.php"; String jsonString=HttpClientMy.getServerDataWithWebService(wcfUrl); //Json string ini parse edicek methodu yazdık.. ParseResponseJSONData(jsonString,context); } /** * RESTful Web servis'den gelen json string i parse edip,elde ettigi * verileri push notification ile kullanıcıya gosteren method * @param jsonString */ public void ParseResponseJSONData(String jsonString,Context context) { JSONObject jsonResponse; try { //Json objesi olusturuyoruz.. jsonResponse = new JSONObject(jsonString); //Olusturdugumuz obje üzerinden json string deki dataları parse ediyoruz.. JSONArray jArray=jsonResponse.getJSONArray("Android"); for(int i=0;i<jArray.length();i++) { JSONObject json_data=jArray.getJSONObject(i); int mesaj_id = json_data.getInt("mesaj_id"); String mesaj = json_data.getString("mesaj"); String deviceId = json_data.getString("deviceId");//Tekil cihaz id (seri numarası) //Mesajı kayıt eden kişinin cihazı haricindeki, diğer cihazlara bildirim göster kontrolu yaptık //Bu kontrolu , sunucudan gelen deviceId degeri ile uygulamanın çalıştığı cihazın deviceId ini karsılastırarak yaptım SendMessage sendMessage=new SendMessage(); if(!sendMessage.setDeviceUUID(context).equals(deviceId)) { //Sunucudan cektigimiz degerleri PushNotification a ekleyen methodu cagırdık.. sendPushNotification(mesaj, context); //Gönderilmiş mesajın ,tekrar tekrar gönderilmemesi icin ,sunucu veritabanındaki // mesaj tablosundaki , flag sutununun degeri 1 diye update eden methodu cagırdım updateFlagRow(mesaj_id); } } } catch (JSONException e) { e.printStackTrace(); } } /** * Sunucudan gelen degerleri PushNotification ile kullanıcıya, uyarı bildirimi seklinde gormesini saglayan method * @param mesajData * @param context */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void sendPushNotification(String mesajData,Context context){ // Push Notification pencerisinin yanında gorunecek icon resmini belirledik... int icon=R.drawable.ic_launcher; //Gösterilcek mesajı hazırladık.. String mesaj="Yeni mesajınız var: "+mesajData; //Push Notification pencerisinde gostermek istedigimiz baslıgı hazırladık.Ben uygulama ismini verdim.. String ApplicationTitle=context.getString(R.string.app_name); //NOTIFICATION_SERVICE cagırıp, notification un icon , baslık gibi ozeliklerini vererek tanımladık NotificationManager notificationManager=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); long[] pattern = {1000, 1000, 1000, 1000, 1000 };//titreme süresi Notification.Builder notification = new Notification.Builder(context) .setContentTitle(ApplicationTitle) //Push Notification pencerisinde gozukcek baslık belirlendi .setContentText(mesaj)//Uyarı mesajı gonderildi .setSmallIcon(icon)//Push Notification pencerisinin yanında gorunecek icon resmini belirledik... .setWhen(System.currentTimeMillis()) .setSound(Settings.System.DEFAULT_NOTIFICATION_URI) ////Notification geldiginde telefonun default sesinin calısmasını saglar //Dilerseniz, notification.sound kullanarak istediginiz bir muzik dosyasını,notification geldiginde calmasını saglayabilirsiniz.. //.setSound(Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" + R.raw.beyoncesingleladies)) .setVibrate(pattern)//Notification geldiginde telefonun titremisini saglar .setAutoCancel(true);//Notification a bastıgınızda ,uyarı penceresinin kapanmasını saglar Intent mesajListIntent=new Intent(context,MessageList.class); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, mesajListIntent, PendingIntent.FLAG_UPDATE_CURRENT); notification.setContentIntent(contentIntent); //ve notification ozelliklerimizi ,notificationManager a gondererek, notification bildirimini sagladık notificationManager.notify(MID,notification.build()); MID++; } /** * Gönderilmiş mesajın ,tekrar tekrar gönderilmemesini saglamak amacıyla kullanılacak mesaj_id datasını * sunucuya gonderen method * @param mesaj_id */ public void updateFlagRow(int mesaj_id){ //StrictMode kullanarak,ağ erişiminin güvenli bir şekilde yapılmasını sağlıyoruz... StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); String wcfUrl= "http://test.com/updateFlagRow.php"; JSONObject obj=new JSONObject(); try { //RESTful Web servisiyle göndermek isteğimiz içerikleri,Json objesine put methoduyla ekliyoruz.. obj.put("mesaj_id",mesaj_id); HttpClientMy HttpClientMy=new HttpClientMy(); //RESTful Web servisini çağırıp, içerikleri sunucuya gönderen sağlayan method çağırdık, HttpClientMy.sendServerDataWithWebService(wcfUrl, obj); } catch (Exception e) { e.printStackTrace(); } } } |
MessageList sınıfında şifresi doğru olan kullanıcıların,kendi aralarında gönderdikleri tüm mesajları ListView ile listeledim.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
package com.tugbaustundag.mesajlasmauygulamasi; import android.content.Intent; import android.os.StrictMode; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; public class MessageList extends ActionBarActivity { private ArrayList mesajList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_message_list); //Kullancagımız controller tanımladık... ListView list=(ListView)findViewById(R.id.msj_list); Button btn_msjGonder=(Button)findViewById(R.id.btn_msjGonder); //StrictMode kullanarak,ağ erişiminin güvenli bir şekilde yapılmasını sağlıyoruz... StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); // RESTful Web servisini kullanarak, sunucudan data çekmeyi sağlayan metoduzu cagırdık HttpClientMy HttpClientMy = new HttpClientMy(); String wcfUrl = "http://test.com/getAllMessage.php"; String jsonString=HttpClientMy.getServerDataWithWebService(wcfUrl); mesajList=new ArrayList(); //Json string ini parse ediyoruz ve listview 'e mesajları atadık.. JSONObject jsonResponse; try { //Json objesi olusturuyoruz.. jsonResponse = new JSONObject(jsonString); //Olusturdugumuz obje üzerinden json string deki dataları kullanıyoruz.. JSONArray jArray=jsonResponse.getJSONArray("Android"); for(int i=0;i<jArray.length();i++) { JSONObject json_data=jArray.getJSONObject(i); String mesaj = json_data.getString("mesaj"); // ArrayList e sunucudan gelen mesajları ekledik. mesajList.add(mesaj); } //ListView' e ArrayList deki mesajları aktardık ... ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, mesajList); list.setAdapter(adapter); } catch (JSONException e) { e.printStackTrace(); } //Mesaj gönderme sayfasına geri donmeyi saglayan butonun click event ini yazdık... btn_msjGonder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i=new Intent(MessageList.this,MainActivity.class); startActivity(i); } }); } } |
Son olarak Android programlama tarafında , AndroidManifest.xml dosyasında ilgili izin ve tanımlamaları yaptım. Bu ayara Github linkinden ulaşabilirsiniz
Sunucu taraflı kodlar ve işlemler;
Sunucu veritabanındaki(mysql) tabloların oluşturulması
kullanici_sifre ve mesaj veritabanı tablolarının aşağıdaki resimde gösterildiği gibi oluşturulması yapılmalıdır.
Php programlama dilini kullanarak yazılmış, sunucu taraflı kodlar:
passwordControl.php;kullanıcı giriş formundan gelen şifrenin doğru olup olmadığını true/false şeklinde döndüren php-mysql kodları:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<!--?php mysql_connect("localhost","username","password")or die("baglanamadim"); mysql_query('SET NAMES utf8'); mysql_query('SET CHARACTER_SET utf8'); mysql_select_db("mesaj"); //RESTful Web servisinde varolan dataları çekiyoruz.. $json = file_get_contents('php://input'); $obj = json_decode($json); $query=mysql_query("select * from kullanici_sifre where kullanici_sifresi='".$obj->{'sifre'}."'");<br ?--> $num_rows=mysql_num_rows($query); if($num_rows==0){ $return = array("sifreDurum"=>"false"); } else{ $return = array("sifreDurum"=>"true"); } //Veritabanından çekilen datayı json ile şifreleyip(encode), Web servise gönderiyoruz $outputArr = array(); $outputArr['Android'] = $return; echo json_encode($outputArr); mysql_close(); // MYSQL sunucusu ile bağlantımızı koparttık ?> |
insertMessage.php; mesaj girme formundan gelen değerlerin, veritabanına kayıt edilmesi yapılmaktadır.
1 2 3 4 5 6 |
<!--?php header('Content-Type: text/html; charset=utf-8'); //Veritabanımıza bağlanıyoruz.. mysql_connect("localhost","username","password")or die("baglanamadim"); mysql_query('SET NAMES utf8'); mysql_query('SET CHARACTER_SET utf8'); mysql_select_db("mesaj"); //RESTful Web servisinde varolan dataları çekiyoruz.. $json = file_get_contents('php://input'); $obj = json_decode($json); //Android tarafında değişkene verdiğimiz key değerlerini kullanarak , çektiğimiz değerleri veritabanına data eklemek için kullanıyoruz.. if($obj->{'deviceId'}!=null ){<br ?--> $sqlInser = "INSERT INTO mesaj (kullanici_sifresi,mesaj,date_added,deviceId) VALUES ('".$obj->{'sifre'}."','".$obj->{'mesaj'}."','".$obj->{'date'}."','".$obj->{'deviceId'}."')"; mysql_query($sqlInser); } mysql_close(); // MYSQL sunucusu ile bağlantımızı koparttık ?> |
getMessage.php; mysql ile kullanici_sifresi ve mesaj tablosunu birleştirerek, sadece kullanici_sifresi tablosunda şifresi bulunan kullanıcıların mesajlarını select sorgusuyla çekip, json_encode fonksiyonuyla jsonString hale getirdim.Böylelikle kullanici_sifresi tablosunda belirlediğiniz şifrelerle mesaj gönderen insanlar sadece mesaj gönderebilecek.Eğer şifreyi doğru girmediyse, mesajı bildirim ile gönderilmemesini sağlamış oldum.Bir nevi grup içinde, mesajlaşma sistemi yapmış oldum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!--?php header('Content-Type: text/html; charset=utf-8'); //Veritabanımıza bağlanıyoruz.. mysql_connect("localhost","username","password")or die("baglanamadim"); mysql_query('SET NAMES utf8'); mysql_query('SET CHARACTER_SET utf8'); mysql_select_db("mesaj"); $date=date('Y-m-d H:i:s'); $deviceIdresult=mysql_query("select deviceId from mesaj order by mesaj_id desc limit 1 "); $deviceRow= mysql_fetch_assoc($deviceIdresult); $result=mysql_query("select mesaj,mesaj_id,deviceId from mesaj as m INNER JOIN kullanici_sifre as k_sifre ON m.kullanici_sifresi=k_sifre.kullanici_sifresi where flag='0' order by mesaj_id desc"); $encode = array(); while($allRow = mysql_fetch_array($result)) { $new = array( 'mesaj_id' => $allRow['mesaj_id'],<br ?--> 'mesaj' => $allRow['mesaj'], 'deviceId' => $allRow['deviceId'] ); $encode[] = $new; } $outputArr = array(); $outputArr['Android'] = $encode; echo json_encode($outputArr); mysql_close(); // MYSQL sunucusu ile bağlantımızı koparttık ?> |
Mesajları kayıt yaparken mesaj tablosundaki her bir mesaj kaydının flag sütunundaki değerini 0 yapmıştım. getMessage.php de de flag değeri 0 ise kayıdı çek diye bir koşul yapmıştım.
updateFlagRow.php ise veritabanında mesaj tablosundaki , flag sütununun değeri 1 diye update ederek, gönderilmiş mesajın ,tekrar tekrar gönderilmemesi için bir tür önlem alıyorum.
1 |
<!--?php header('Content-Type: text/html; charset=utf-8'); //Veritabanımıza bağlanıyoruz.. mysql_connect("localhost","username","password")or die("baglanamadim"); mysql_query('SET NAMES utf8'); mysql_query('SET CHARACTER_SET utf8'); mysql_select_db("mesaj"); //RESTful Web servisinde varolan dataları çekiyoruz.. $json = file_get_contents('php://input'); $obj = json_decode($json); $sqlUpdate = "UPDATE mesaj SET flag='1' WHERE mesaj_id='".$obj->{'mesaj_id'}."'";</p> <p>mysql_query($sqlUpdate);</p> <p>mysql_close(); // MYSQL sunucusu ile bağlantımızı koparttık<br ?--> ?> |
getAllMessage.php; kullanici_sifresi tablosunda şifre ile kayıt olunmuş mesajların tamamını veritabanından çekip, json_encode fonksiyonuyla jsonString hale getiren kod:
1 2 3 4 5 6 7 8 9 10 11 |
<!--?php header('Content-Type: text/html; charset=utf-8'); //Veritabanımıza bağlanıyoruz.. mysql_connect("localhost","username","password")or die("baglanamadim"); mysql_query('SET NAMES utf8'); mysql_query('SET CHARACTER_SET utf8'); mysql_select_db("mesaj"); $result=mysql_query("select mesaj from mesaj as m INNER JOIN kullanici_sifre as k_sifre ON m.kullanici_sifresi=k_sifre.kullanici_sifresi order by mesaj_id desc"); $encode = array(); while($allRow = mysql_fetch_array($result)) { $new = array( 'mesaj' => $allRow['mesaj']<br ?--> ); $encode[] = $new; } $outputArr = array(); $outputArr['Android'] = $encode; echo json_encode($outputArr); mysql_close(); // MYSQL sunucusu ile bağlantımızı koparttık ?> |
İşte hepimizin günlük hayatında çokça kullandığı mesajlaşma servisiyle ilgili oluşturduğum projemin detayları yukarıda anlattığım şekildedir. Umarım yazımı keyif alarak okumuşsunuzdur. Yazımı okumak için vakit ayırdığınız için çok teşekkür ederim. Daha birçok keyifli proje ve yazılar ile beraber olacağız.
Bir başka yazımda eğlenceli bir şekilde buluşmak ümidi ile…
Son olarak ufak bir not: Bu yukarıda anlattığım projemin kodlarını indirmek isterseniz; yapmanız gereken tek şey Github linkine tıklamak.
Hayatınızın daha da kolaylaşması dileğiyle…
Güzel çalışma, emeğine sağlık 🙂
Merhaba burada yazılanları yapmama rağmen ne emulatorden nede normal telefondan istediğim sonucu alamadım . İnternet kapalıda olsa açıkta olsa şifre yerine bişeyler yazıp gönder dediğim zaman sürekli olarak şifre yanlış mesajını alıyorum… Acaba bu konuda yardımcı olabilir misiniz ? Şimdiden teşekkürler …
Güzel ve açıklayıcı bir çalışma olmuş emeğinize sağlık.
Bir sorum olacak;
yazmış olduğumuz kodların çalışmasını nasıl kontrol edebiliriz ?
yani, Android tarafından yazılan şifrenin belirttiğimiz web adresine gidip gitmediğini, veritabanında doğru yere bağlanıp bağlanmadığını ne şekilde kontrol edebiliriz ?
Yorumlarınız için teşekkürler. Sorularınıza gelirsek; “Android tarafından yazılan şifrenin belirttiğimiz web adresine gidip gitmediğini” Client ten yani Android tarafından gelen datayı Web tarafında; test amaçlı açtığın bir database tablosuna kayıt ederek anlayabilirsin.Sonrada veritabanı tablonun verilerine bakarak bu durumu kontrol edebilirsin
“veritabanında doğru yere bağlanıp bağlanmadığını ne şekilde kontrol edebiliriz” veritabanı bilgilerini yalnış yazmışsan zaten
mysql_connect(“localhost”,”username”,”password”)or die(“baglanamadim”); bu bölüme gelir ve “baglanamadim” hatası verir .Çünkü veritabanı bağlanma kontrolunu bu kodda ben yaptım.
Öncelikli emeğiniz için çok teşekkürler ama benim söyle bir problemim oldu;
uygulama sql den kendi eklediğim dataları çekebiliyorum ama uygulamadan mesaj göndermeye çalıştığımda sql e data eklemiyor.
{“Android”:{“sifreDurum”:”false”}} hatası veriyor
İlginiz için teşekkür ederim.passwordControl.php;kullanıcı giriş formundan gelen şifrenin doğru olup olmadığını kontrol eden servisden false yani şifreniz doğru değil cevabı almışsınız.Demekki, android uygulamasından girdiğiniz şifre bilgisi veritabanında bulunmamaktadır yada yalnış şifre girmişsiniz.
şifre yanlış olsa sql den veri çekebilir miyim ? veri çekebiliyorum ama gönderemiyorum
Merhaba, androidin son güncellemelerinden sonra broadcast receiver kullanımına kısıtlamalar geldi. Dolayısı ile arka planda servis olarak çalışıp broadcast mesajları yakalayan uygulama yapmakta zorlaştı. Gelen sms okumak, internet var mı , pil durumu, arama kaydetme gibi. İnternette epey araştırdım ama bulamıyorum. Bu yeni yapıya uygun örnekli bir bilgi paylaşmanız mümkün mü. Emeğinize sağlık.
Merhaba Cesur, önümüzdeki bir iki aylık süreç de bu konuyu ele alan bir makale paylaşacağım. Takip de kalmanı öneririm.