Merhaba Arkadaşlar,
Not: Firebase Push Notification dersi için tıklayınız.
Mobil Uygulama geliştirme dersleri ile sizlere yardımcı olmaya çalıştığımız mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize bugünde Google Cloud Messaging(GCM) ile Push Notification yani notifikasyon gönderme dersi ile devam ediyoruz.
Google servisi olan GCM telefonlarımız açık yada kapalı olsun client yani mobil cihazlar tarafından istek de bulunulmaksızın Notification göndermeye yarar.Yani bir nevi sunucudan cihaza bilgi ve uyarı gönderir. Birden fazla kullanım alanı olabilir. Mesajlaşma servisleri,bankalar,online hizmetler ve daha bir çok uygulama tarafından kullanılır. Hepimizin malumudur ki uygulamayı yazmak kadar kullandırtmakta çok önemlidir. Telefona indirilip kullanılmayan bir uygulama yazmayı hiç birimiz istemeyiz. GCM burda da işe yarıyor ve kullanıcıya Notification göndererek uygulamamızı hatırlatıyor ve kullanım oranlarını arttırıyor.Tabi şunuda unutmamak lazım, gereğinden fazla abartılı notification gönderimi ise kullanıcıyı bunaltır ve uygulamamızı silmesine neden olur.Bu ve bunun gibi bir çok kullanım alanı olan GCM Google tarafından ücretsiz olarak sunulmaktadır.
Bende bu dersimde sizlere detaylı bir anlatımla Google tarafındaki ayarları,uygulamaya entegre edilmesi ve PHP sunucudan notification gönderimini anlatacağım.Dolayısıyla diğer derslerimizden biraz daha uzun ve biraz daha ayrıntılı bir ders olacaktır.
Konuyu daha fazla uzatmadan başlıyorum.
[wpdm_file id=19]Google Ayarları
Öncelikle https://console.developers.google.com/project sayfasına girerek Create Project diyoruz.
Karşımıza aşağıdaki gibi bir ekran geliyor.
Project Name : Projemizin Adı
Project Id: Projenin id si. Kendimiz istenilen şartlarda oluşturabileceğimiz gibi Google’n oluşturduğu id’yide kullanabiliriz.Sonradan değiştirilemez.
1. ve 2 . alanıda check ledikten sonra Create tıklıyoruz ve projemizin oluşmasını bekliyoruz.Projemiz oluştuktan sonra bizi Proje sayfamıza yönlendiriyor. Açılan sayfada sol taraftaki APIs&auth sekmesinin altındaki APIs’e tıklıyoruz.
Açılan sayfadaki listeden Google Cloud Messaging for Android i buluyor ve tıklıyoruz.Karşımıza çıkan ekranda sol üstte yer alan OFF yazan butona tıklıyor ve On olmasını bekliyoruz.
Evet arkadaşlar daha sonra APIs&auth sekmesinin altındaki Credentials’a tıklıyoruz.Açılan sayfada Create New Key’e tıklıyor ve Server Key’e tıklıyoruz.
Karşımıza çıkan bu sayfada herhangi bir IP kısıtlaması yapmıyacaksak Text alanını boş bırakıyır ve Create diyoruz.
Açılan yeni sayfadaki API KEY sonraki aşamlarda işimize yarıyacak. Lazım olduğu zaman bu sayfadan alabiliriz API KEY’imizi.
PHP+MYSQL
Evet arkadaşlar şimdi gelelim işin zor ama zevkli kısmı olan PHP+MYSQL kullanarak server kısmını hazırlamaya.Öncelikle çalışma mantığını anlatayım. Uygulamamız ilk açıldığı zaman bizim belirttiğimiz URL’e her cihaz için ayrı olan GCM register id gönderirir. Ben bu register id leri databasime kaydederim. Notification göndereceğim zamanda ister istediğim register id li cihazlara istersem tüm cihazlara Notification gönderebilirim. Bunu yaparkende ben bu dersimde PHP+MYSQL kullanıcam siz isterseniz farklı platformlarda kullanabilirsiniz.(asp,jsp,mssql,oracle vs..) .
Bunun için öncelikle Mysql databasimizde “wp_gcm_kullanicilar” adinda bir tablo oluşturalım. Bunu yaparken Phpmyadmin kullanabilirsiniz. İşinizi çok kolaylaştırır.
CREATE TABLE `wp_gcm_kullanicilar` ( `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `registration_id` TEXT NOT NULL ) ENGINE = INNODB
Yukarıdaki kodu ile tablomuzu oluşturduk.
Database bağlantımızı sağlayacak baglanti.php dosyamızı hazırlayalım.
baglanti.php
<?php define('DB_NAME', '********'); /** MySQL veritabanı kullanıcısı */ define('DB_USER', '*********'); /** MySQL veritabanı parolası */ define('DB_PASSWORD', '*********'); /** MySQL sunucusu */ define('DB_HOST', 'localhost'); /** Yaratılacak tablolar için veritabanı karakter seti. */ define('DB_CHARSET', 'utf8'); $con=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME); // Check connection if (mysqli_connect_errno()) { echo "Bağlanırken hata oluştu : " . mysqli_connect_error(); } ?>
Evet arkadaşlar bağlantıyı oluşturduk şimdi gelelim Android cihazlardan uygulamamız ilk açıldığında gelecek olan GCM register id’leri kaydedecek php dosyamıza.
register.php
<?php require_once("baglan.php");//database bağlantısı gercekleştirdik if (isset($_GET["regId"])) { //Kontrol $regId = $_GET['regId']; //GET ile gelen regId değerini aldık $sql = "INSERT INTO wp_gcm_kullanicilar (registration_id) values ('$regId')"; //regId yi database kaydedicek sorgu if(!mysqli_query($con, $sql)){//sorguyu çalıştırdık die('MySQL query failed'.mysql_error()); } } mysqli_close($con);//mysql connection kapattık ?>
Arkadaşlar şimdi gelelim Notification göndereceğimiz php dosyasına. Html formdan aldığımız veriyi(mesajı) databasede GCM register id leri kayıtlı olan cihazlara notification göndereceğiz.Aslında biz direk kendi serverlarımızdan göndermiyoruz. Biz bilgileri GCM servicelerine gönderiyoruz. GCM serverlarıda gelen bilgilere göre register id li cihazlara bizim belirlediğimiz mesajı notification gönderiyor.
send.php
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!--Türkçe karakter sorunu yaşamamak için--> <title>GCM Send</title> </head> <body> <?php if(isset($_POST['submit'])){//kontrol require_once("baglan.php");//database bağlantısı gercekleştirdik $registatoin_ids = array();//registration idlerimizi tutacak array ı oluşturuyoruz $sql = "SELECT *FROM wp_gcm_kullanicilar";//Tüm kullanıcı gcm registration idlerini alıcak sql sorgumuz $result = mysqli_query($con, $sql);//sorguyu çalıştırıyoruz while($row = mysqli_fetch_assoc($result)){ array_push($registatoin_ids, $row['registration_id']);//databaseden dönen registration idleri $registatoin_ids arrayine atıyoruz } // GCM servicelerine gidecek veri //Arkadaşlar aşşağıdaki PHP kodlarıyla oynamıyoruz. Bu Google 'n bizden kullanmamızı istediği kodlar //Sadece registration_ids,mesaj ve Authorization: key değerlerini değiştiriyoruz $url = 'https://android.googleapis.com/gcm/send'; $mesaj = array("notification_message" => $_POST['mesaj']); //gönderdiğimiz mesaj POST 'tan alıyoruz.Androidde okurken notification_message değerini kullanacağız $fields = array( 'registration_ids' => $registatoin_ids, 'data' => $mesaj, ); //Alttaki Authorization: key= kısmına Google Apis kısmında oluşturduğumuz key'i yazacağız $headers = array( 'Authorization: key=AIzaSyBf--subbkkRuEKbmxn3pXZCpY4u9OuTL8', 'Content-Type: application/json' ); // Open connection $ch = curl_init(); // Set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Disabling SSL Certificate support temporarly curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); // Execute post $result = curl_exec($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } // Close connection curl_close($ch); echo $result; } ?> <form method="post" action="send.php"> <label>Mesajı giriniz: </label><input type="text" name="mesaj" /> <input type="submit" name="submit" value="Send" /> </form> </body> </html>
Yukarıda yaptığımız işlemleri kısaca toparlıcak olursak sistem şu şekilde işleyecek. Uygulama android cihazdan açıldığı zaman bizim register.php mize registeri_id yi post edicek. Biz post edilen id yi kaydedeceğiz ve notification göndermek istedimizde ise send .php yi çalıştıracağız. Mesajımızı yazıp gönderdiğimizde send.php database kayıtlı olan register_id leri ve mesajımızı GCM servisine gönderecek.GCM serviste gelen register_id li cihazlara mesajımızı Notification olarak gönderecek.
ANDROID
Gelelim android kısmına.
Öncelikle yeni bir proje oluşturuyoruz.Arkadaşlar ben bu dersimde oluşturduğum ve bu dersimde Google Play’e nasıl yükleneceğini anlattığım projem üzerinden devam edicem.Bu proje zaten basit bir Webview uygulamasıydı.Ben projeye Splash Screen ekleyerek gerekli başlangıç işlemlerini orda yapıcam. Yani bir nevi sıfırdan proje oluşturmuş olacağız.Oluşturduğumuz projeye Google Play Service Lib dosyasını ekliyoruz. Google Play Service lib ekleme konusunda detaylı anlatımımı bu dersimizde yapmıştım.Google Play Service dosyasını projemize import ettikten sonra Android Manifest dosyasında gerekli izinlerle gerekli ayarlamaları yapıyoruz. Benim Android Manifest dosyam aşşağıdaki gibi
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mobilhanem.webviewkullanimi" android:versionCode="2" android:versionName="1.1" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="com.example.gcm.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:label="@string/app_name" android:name=".SplashScreen" android:screenOrientation="portrait" android:theme="@android:style/Theme.Black.NoTitleBar" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:label="@string/app_name" android:name=".Anasayfa" android:screenOrientation="portrait" android:theme="@android:style/Theme.Black.NoTitleBar" > </activity> <receiver android:name="com.mobilhanem.gcm.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.mobilhanem.gcm" /> </intent-filter> </receiver> <service android:name="com.mobilhanem.gcm.GcmIntentService" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application> </manifest>
Başlangıç işlemlerini yaptığım yani kendi server’ıma register_id yi gönderdiğim java dosyaları ise aşağıdaki gibidir.Zaten kod üzerinde gerekli açıklamaları yaptım.
SplashScreen.java
import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.mobilhanem.gcm.RegisterApp; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.util.Log; import android.widget.Toast; public class SplashScreen extends Activity { private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; public static final String PROPERTY_REG_ID = "registration_id"; private static final String PROPERTY_APP_VERSION = "appVersion"; private static final String TAG = "Mobilhanem GCM"; GoogleCloudMessaging gcm; String regid; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash); if (checkPlayServices()) {//GOOGLE PLAY SERVİCE APK YÜKLÜMÜ gcm = GoogleCloudMessaging.getInstance(getApplicationContext());//GoogleCloudMessaging objesi oluşturduk regid = getRegistrationId(getApplicationContext()); //registration_id olup olmadığını kontrol ediyoruz if(regid.isEmpty()){//YENİ KAYIT //regid değerimiz boş gelmişse uygulama ya ilk kez acılıyor yada güncellenmiş demektir.Registration işlemleri tekrardan yapılacak. new RegisterApp(getApplicationContext(), gcm, getAppVersion(getApplicationContext())).execute(); //RegisterApp clasını çalıştırıyoruz ve değerleri gönderiyoruz }else{ //regid değerimiz boş gelmemişse önceden registration işlemleri tamamlanmış ve güncelleme olmamış demektir.Yani uygulama direk açılacak //Arkadaşlar eğer splash ekranının gözükmesini istiyorsanız thread kullanıp 2 3 sn bekletebilirsiniz.Daha sonra aşağıdaki işlemlere başlayabilirsiniz Toast.makeText(getApplicationContext(), "Bu cihaz önceden kaydedilmiş", Toast.LENGTH_SHORT).show(); Intent i = new Intent(getApplicationContext(),Anasayfa.class);//Anasayfaya Yönlendir startActivity(i); finish(); } } } private boolean checkPlayServices() { //Google Play Servis APK yüklümü //Yüklü Değilse Log basıp kapatıcak uygulamayı //Siz kullanıcıya uyarı verdirip Google Play Apk Kurmasını isteyebilirsiniz int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Log.i(TAG, "Google Play Servis Yükleyin."); finish(); } return false; } return true; } private String getRegistrationId(Context context) { //registration_id geri döner //Bu method registration id ye bakar. //Bu uygulamada registration id nin önceden olabilmesi için uygulamanın önceden açılmış ve registration işlemlerini yapmış olması lazım //Uygulama önceden acıldıysa registration_id SharedPreferences yardımı ile kaydedilir. final SharedPreferences prefs = getGCMPreferences(context); String registrationId = prefs.getString(PROPERTY_REG_ID, "");//registration_id değeri alındı if (registrationId.isEmpty()) {//eğer boşsa önceden kaydedilmemiş yani uygulama ilk kez çalışıyor. Log.i(TAG, "Registration id bulunamadı."); return ""; } int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); int currentVersion = getAppVersion(getApplicationContext());//yine SharedPreferences a kaydedilmiş version değerini aldık if (registeredVersion != currentVersion) {//versionlar uyuşmuyorsa güncelleme olmuş demektir. Yani tekrardan registration işlemleri yapılcak Log.i(TAG, "App version değişmiş."); return ""; } return registrationId; } private SharedPreferences getGCMPreferences(Context context) { return getSharedPreferences(SplashScreen.class.getSimpleName(), Context.MODE_PRIVATE); } private static int getAppVersion(Context context) { //Versiyonu geri döner try { PackageInfo packageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0); return packageInfo.versionCode; } catch (NameNotFoundException e) { // should never happen throw new RuntimeException("Paket versiyonu bulunamadı: " + e); } } }
SplashScreen uygulama ilk açıldığında önceden registration işlemlerinin yapılıp yapılmadığını kontrol eder. Eğer yapılmışsa uygulama normal açılır. Eğer yapılmamışsa uygulama RegisterApp.java dosyasını çağırarak registration işlemlerini başlatır.
RegisterApp.java
import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.mobilhanem.webviewkullanimi.Anasayfa; import com.mobilhanem.webviewkullanimi.SplashScreen; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; public class RegisterApp extends AsyncTask<Void, Void, String> { private static final String TAG = "Mobilhanem GCM"; Context ctx; GoogleCloudMessaging gcm;//Google Cloud referansı final String PROJECT_ID = "149270419021";//Bu değer Google Apı sayfasında Owerview menüsünde(Giriş sayfası) yukarıda yer alır. Project Number:987... şeklinde String regid = null; private int appVersion; public RegisterApp(Context ctx, GoogleCloudMessaging gcm, int appVersion){ //SplassScreen den gelen değerleri aldık this.ctx = ctx; this.gcm = gcm; this.appVersion = appVersion; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(Void... arg0) { // String msg = ""; try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(ctx);//GCM objesi oluşturduk ve gcm referansına bağladık } regid = gcm.register(PROJECT_ID);//gcm objesine PROJECT_ID mizi göndererek regid değerimizi aldık.Bu değerimizi hem sunucularımıza göndereceğiz Hemde Androidde saklıyacağız msg = "Registration ID=" + regid; sendRegistrationIdToBackend();//Sunuculara regid gönderme işlemini yapacak method storeRegistrationId(ctx, regid);//Androidde regid saklı tutacak method } catch (IOException ex) { msg = "Error :" + ex.getMessage(); } return msg; } private void storeRegistrationId(Context ctx, String regid) {//Androidde regid ve appversion saklı tutacak method //Burada SharedPreferences kullanarak kayıt yapmaktadır //SharedPreferences hakkında ayrıntılı dersi Bloğumuzda bulabilirsiniz. final SharedPreferences prefs = ctx.getSharedPreferences(SplashScreen.class.getSimpleName(), Context.MODE_PRIVATE); Log.i(TAG, "Saving regId on app version " + appVersion); SharedPreferences.Editor editor = prefs.edit(); editor.putString("registration_id", regid); editor.putInt("appVersion", appVersion); editor.commit(); } private void sendRegistrationIdToBackend() {//Sunucuya regid değerini gönderecek method //Arkadaşlar biz burda get methodu ile gönderdik . //Siz isterseniz post methoduda kullanabilirsiniz //HTTP Post ie ilgili dersimiz blog umuzda bulunmaktadır. URI url = null; try { url = new URI("http://www.mobilhanem.com/test/register.php?regId=" + regid); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); } HttpClient httpclient = new DefaultHttpClient(); HttpGet request = new HttpGet(); request.setURI(url); try { httpclient.execute(request); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void onPostExecute(String result) { //doInBackground işlemi bittikten sonra çalışır super.onPostExecute(result); Toast.makeText(ctx, "Registration Tamamlandı.Artık notification alabilirsiniz", Toast.LENGTH_SHORT).show(); Log.v(TAG, result); Intent i = new Intent(ctx,Anasayfa.class);//Anasayfaya Yönlendir i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); ctx.startActivity(i); } }
Buraya kadar olan kısım register işlemleri içindi. Şimdi ise Notification geldiği zaman uygulamamızın ne yapcağını ayarlamaya. Burda Servis ve BroadCastReciver sınıflarını kullandık. Servis sınıfı hakkında yazımız blog içinde mevcuttur. BroadCastReciver sınıfı hakkında ise en kısa zamanda yazacağım.
Arkadaşlar aşağıdaki kodlar Notification geldiği zaman çalışacaktır.
GcmBroadcastReceiver.java
import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.support.v4.content.WakefulBroadcastReceiver; public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Explicitly specify that GcmIntentService will handle the intent. ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); // Start the service, keeping the device awake while it is launching. startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); } }
Yukarıdaki kod Android ağını dinlemektedir. GCM servislerinden bir PUSH Notification gelirse uygulamayı uyandırır ve GCMIntentService’i çalıştırır.
GCMIntentService.java
package com.mobilhanem.gcm; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.mobilhanem.webviewkullanimi.R; import com.mobilhanem.webviewkullanimi.SplashScreen; import android.app.IntentService; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.util.Log; public class GcmIntentService extends IntentService { public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; NotificationCompat.Builder builder; public GcmIntentService() { super("GcmIntentService"); } @Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); //Gelen mesaj tipini alıyoruz String messageType = gcm.getMessageType(intent); String mesaj = intent.getExtras().getString("notification_message"); Log.d("mesaj--->>>",mesaj); if (!extras.isEmpty()) { // has effect of unparcelling Bundle if (GoogleCloudMessaging. MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { sendNotification("Send error: " + extras.toString()); } else if (GoogleCloudMessaging. MESSAGE_TYPE_DELETED.equals(messageType)) { sendNotification("Deleted messages on server: " + extras.toString()); } else if (GoogleCloudMessaging. MESSAGE_TYPE_MESSAGE.equals(messageType)) {//Herhangi bir sorun yoksa Notification mızı oluşturacak methodu çağırıyoruz sendNotification(mesaj); } } GcmBroadcastReceiver.completeWakefulIntent(intent); } private void sendNotification(String msg) { //Burda Status barda gösterilecek Notificationın ayarları yapılıyor(titreşim,bildirim,text boyutu vs..) mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setContentTitle("Mobilhanem") .setSmallIcon(R.drawable.ic_launcher) .setStyle(new NotificationCompat.BigTextStyle() .bigText(msg)) .setContentText(msg) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 }); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());//Notification gösteriliyor. } }
Evet arkadaşlar açıklamaları kod üzerinde yapmaya çalıştım. Bugüne kadar anlattığım dersler arasında beni en çok yoran dersti. İnşallah sizleri yormadan halledebilirsiniz.Ama bu dersimde altını çizerek söylüyorum örnek projeyi kesinlikle indirerek çalışın.İndirmeden anlamanız çok zor olacaktır. Ben projenin bu halini Google Play’e koyacağım ve ders eklediğim zaman notification ile bildireceğim.
Sormak istediğiniz veya eklemek istediğiniz bir yer olursa çekinmeden yorum bırakabilirsiniz.Sizlerden ricam facebook.com/mobilhanem sayfamızı beğenmenizdir. Birdahaki dersimde Androidde Custom Listview kullanımını anlatacağım.Birdahaki dersimize kadar kendinize iyi bakın.
NOT:Android Studio için Google Play Service import dersimiz için tıklayınız.
[wpdm_file id=19] 0
Emeğinize sağlık. GCM’de tek seferde en fazla 1000 cihaza gönderim yapılabiliyor.*** Bu konuda php kodlarınızda nasıl bir değişiklik yapılmalı ki limit sorunumuz olmasın ?
*** GCM allows us to send a notification to up to 1000 device at a time
Selamlar,
Bunu birden fazla yöntemle çözebiliriz.
Ben iki tanesinden bahsedicem bir tanesi php fonksiyonu olan “array_chunk” fonksiyonu. Elimizde arrayi istediğimiz uzunluktaki arraylere bölmeye yarayan fonksiyondur.Biz elimizdeki $registatoin_ids şu şekilde bölebiliriz.
$newArray = array_chunk($registatoin_ids, 1000);
foreach ($newArray as $inner_array) {
//Burdaki $inner_array artık boyutu 1000 olan arrayimiz
//Curl işlemlerini burda devam edicek ama burada tekli curl değil multi curl işlem gerekecek
//Yani Curl biri bitince diğeri başlaması lazım bunuda multi curl işlemleri ile yapıcağız
//Multi curl hakkında detaylı bilgiyi http://php.net/manual/tr/function.curl-multi-init.php bu adresten bakabilirsin
}
Bir diğeri ise databaseden çekerken limit koyup 1000’er 1000’er çekmek
$i = 0;
while(true){
$sql = “SELECT *FROM wp_gcm_kullanicilar Order By id ASC LIMIT ($i*1000),(($i+1)*1000)”;
//gelen cevabı myqli_num_rows ile saydır
if($saydir==1000){
multi CURL işlemleri
$i++;
}else{//1000 den küçükse son kayıt demektir
multi CURL işlemleri
break;//bu while döngüsünden cıkmaya yarar
}
}
Çok teşekkür ederim. Son olarak uygulamamızı kaldıranlar veya bildirimi iptal edenlerin registration_id’lerini, notification sonrası hata almamak için mysql’den nasıl silebiliriz?
Bildirim almak istemediği zaman sunucuyla bağlantı kurup bunu bildirebilirsin.Mysqlde wp_registration_id tablosunda bir alan enum bir değer açıp ‘1’,’0′ olarak açarsın kullanıcı notification istemezse bu değeri 0 yaparsın. Sorgulamayı yaparken değeri 1 olanları alırsın. Silindiğinde ise zaten bir hata almıyorsun kullanıcıya notification gitmiyor. Bir işlem yapmana gerek kalmaz. Uygulamayı tekrar kurduğunda zaten aynı registration_id yi dönecek.Bunun içinde registration_id yi kaydederken önceden kayıtlı olup olmadığını kontrol eder mükerrer kayıtı engellersin.
Çok faydalı oldu. Tekrar emeğiniz ve ilginiz için teşekkür ederim.
Önemli değil. Kolay gelsin…
Hocam merhaba, $registatoin_ids’leri böldükten sonra multi curl işlemlerini vermiş olduğunuz linkten faydalanarak yazmaya çalıştım ama yapamadım. Kaynak da bulamadım bunla ilgili. Kaç gündür uğraşıyorum, yardımcı olur musunuz ?
Saygılarımla
Merhabalar, PHP konularına bende pek bakmıyorum. O yüzden PHP konusunda pek yardımcı olamıyorum ama burdaki linkte baya anlatmış incelemende fayda var.
http://stackoverflow.com/questions/11242743/gcm-with-php-google-cloud-messaging
Kolay Gelsin..
Hocam merhaba çözdüm,
———————
foreach($groups as $group) {
$fields = array( ‘registration_ids’ => $group, ‘data’ => $message, );
// …
// rest of your curl code
}
multi curl’e gerek yok normal curller işi görüyor.
http://stackoverflow.com/questions/23113250/how-to-send-a-notification-to-millions-of-android-devices-in-php-using-gcm
Çözümü paylaştığın için çok teşekkür ederim. Diğer arkadaşlara hatta bana bile lazım olacaktır.
Kolay Gelsin..
Merhaba bu kodu nereye eklememiz gerek ?
PHP dosyasında send.php içine eklemen gereklidir
Send icerisinde nereye eklemem gerekli bende onu sormak istemiistim 🙂 kacinci satira veya hangi komutun altina 🙂 tesekkurler.
Merhabalar, denilen her şeyi eksiksiz yaptım. Güzelce de çalışıyor eyvallah ama kayıt işlemini yapmıyor. SQL’e baktığımda boş bir veri geliyor. Sorun nereden kaynaklanıyor anlamıyorum. Ayrıca SQL’i boşalttığım halde uygulamaya tekrar telefondan girdiğim zaman bu kayıtlı diyor. Ama SQL’e kayıt yapmıyor malesef. Acaba sorun nerede bunu bir türlü çözemedim, mobilehanem yazan yerleri de editledim site olarak, attığım php dosyasının yolu bile doğru. Cevap bekliyorum, iyi günler.
Sql in nerde kurulu localhosttamı?
Hayır internet sitemde kurulu. Her şey düzgün şekilde işliyor. Fakat regid almıyor sanırım. Skype ya da facebooktan görüşme imkanımız var mı saatlerdir bunun üzerinde uğraşıyorum çünkü. Ayrıca 1 cihazdan bi daha deneyemiyorum zaten kayıtlı diyor. Cidden kafa karıştırıcı.
İletişim bölümnden mesaj at
Gönderdim bekliyorum, teşekkürler.
Uygulama aktif bir şekilde iken, yani açıkken, bildirim alınmaması durumunu nasıl ayarlayabilirim ?
Aklıma gelen ilk yol şu:
“wp_gcm_kullanicilar” tablosunda bir sütun açar 1 veya 0 değeri tutarım. Kullanıcı notification istemediğini belirttiği zaman sunucuya istekde bulunur o registration_Id ye ait 1 olan değeri 0 yaparım. Notification göndeririken de değeri 1 olanlara gönderirim.
tabloda bu hatayı alyorum
Hata
SQL sorgunuzda bir hata olduğu görünüyor. MySQL sunucusu hata çıktısı aşağıdadır, eğer varsa, sorunu teşhis etmenizde ayrıca size yardımcı olabilir.
ERROR: Bilinmeyen Noktalama İşareti Dizgisi @ 40
STR: </
SQL: CREATE TABLE
wp_gcm_kullanicilar
(id
INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,registration_id
TEXT NOT NULL) ENGINE = INNODB
SQL sorgusu:
CREATE TABLE
wp_gcm_kullanicilar
(id
INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,registration_id
TEXT NOT NULL ) ENGINE = INNODBMySQL çıktısı:
#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘
wp_gcm_kullanicilar
(id
INT( 10 ) NOT NULL AUTO_INCR’ at line 1Burdaki back tırnakları nedense wp de yazamadım.Kendisi otomatik code diye çeviriyor.
GET_ACCOUNTS iznini almasak sorun olur mu ? Çalışır mı Kullanıcılar pek hoşlanmıyor bu izinden 🙂
Yok o izin olmadan çalışmaz.Muhtemel olarak register_id üretirken google accountuna ulaşmaya ihtiyaç duyardır.Sonuç olarak çalışmaz:)
Hocam merhaba.
Bu php dosyalarını tam olarak nereye atıyoruz ?
Linux bir sunucuya atacaksiniz.android kodlarindan ayri calisacak.
FileZilla ile hostingime atıp ordan çağırabilirim demi ?
Sabahtan beri deniyorum, cihaz kaydediliyor fakat bildirim gelmiyor.
(Projenin gereken yerlerini değiştirip kendi Project ID mi ve Api Key’imi ekledim)
Yardımcı olursanız sevinirim hocam 🙂
Evet filezilla veya herhangi bir ftp programıyla atıcaksın linux hostingine. Ben android tarafında değerleri get ile gönderdikten sonra daha cevabı beklemeden get başarı ile gittiyse direk cihaz kaydedildi diyorum.Ama kendim bir projede kullanılacak olsam sunucudan basarılı cevap geldiğinde register edildi mesajı veririm.
Merhaba, öncelikle örnek uygulamanız için teşekkürler.
Benim sunucu tarafıyla ilgili bir sorum olacak.
Örneğinizde birden fazla kullanıcıya aynı bildirimi gönderiyorsunuz.
Benim sormak istediğim; birden fazla kullanıcıya dinamik içerikli bildirimleri tek bir curl komutu çalıştırarak nasıl gönderebiliriz?
Örneğin 100 tane kullanıcım var. Kullanıcı isimleri; x, y, z …………
Gidecek bildirimlerde kullanıcılara özel içerikler olmasını istiyorum.
Örneğin;
x kullanıcısı için “Merhaba x”,
y kullanıcısı için “Merhaba y”
…
…
şeklinde mesajları tamponlayarak tek bir curl komutu ile tüm bildirimleri nasıl gönderebilirim?
Döngü içerisinde 100 kere curl komutu çalıştırmak muhtemelen performansı etkileyecektir. Ayrıca Google sunucuları ard arda bu kadar çok istek yapılmasını saldırı olarak algılar mı bilmiyorum.
Yardımcı olursanız sevinirim. İyi çalışmalar.
Sorunuz üzerine biraz araştırma yaptım ama elle tutulur bişi bulamadım.Farklı mesaj gönderme olur mu bende bilmiyorum. Farklı curl e google bişi demez.Ama sunucunuzu yorabilir. Bu konuyu bende merak ettim eğer bi çözüm bulabilirseniz bizimlede paylaşırsanız sevinirim.Siz soru sorarken ben size sormuş oldum:)
İlginiz için teşekkürler. Yabancı sitelerde de benzer şekilde anlatılmış. Bu kısmı şimdilik döngü içerisinde yapacağım 🙂
Tamamdır bende sizin gibi kullanacak olsam for içinde çoklu curl yapardım.
Kolay gelsin…
Merhaba dediğiniz şekilde bir mesaj gönderim kısmını bizzat kendim yaptım. ***http://www.abdullahbalta.com/2014/07/27/android-gcm-ile-push-notification-gonderme/ buradan inceleyebilirsiniz
Arkadas tek seferde tüm kullanıcılara farklı mesaj atmayı sormus.senin bu anlattıgın derste aynı http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/ dersiindeki gibi tek tek ayrı mesaj atıosun sorduğu bu değil.
ben soruyu yanlış algılamışım o zaman, tek seferde aynı mesajı atmayı yapabildim.
Tamamdır kardeşim.
Kolay Gelsin.
3 ay olmuş ama belki başkası görür, her döngü arasında sleep(2); diyerek 2 saniye durmak yararlı olucaktır. yoksa network hatası vs alabilirsiniz.
Emeğine sağlık kardeşim çok ihtiyaç duyduğum birşey ama bende mesaj gönderdiğimde Unauthorized Error 401 hatası veriyo. Tabi normal olarakta bildirimler gitmiyor yardımcı olurmusun acaba nerde yanlış yapmış olabilirm?
Api yi oluştururken izin verilen ip listeleri var. Orda Any IP allowed seçeneğini seçmen gerekir.
Eline koluna yüreğine sağlık. Bu konuda gördüğüm en yararlı kaynak tekrar teşekkürler.
Güzel yorum için ben teşekkür ederim.
Hocam elinize sağlık. Ben bu kadar detaylı değil de sadece on off butonu koyarak ve kullanıcıdan saat isteyerek her gün o saatte belirli bir yazıyı bildirim göndermesini istiyorum. Nasıl yapabilirim
Senin istediğin yapı bundan biraz daha detaylı:) Bunu yapmak zor değil ama daha çok uğraştırır. Kullanıcı istediği saati seçtiğinde sen bu saat bilgisini Android’den server’a yolluyacaksın ve bu bilgiyi veritabanında tutacaksın. Serverda ise her dakika çalışıp databaseden saatleri kontrol eden bir php dosyan olacak. Örneğin şuan saat 19:00 ise veritabanında 19:00 kayıtlı olan kullanıcıyı bulacak ve sadece ona bildirim gönderecek. Yani iş daha çok server tarafında . Burda sana tavsiyem dakikalar bazında çalışıp server yormaktansa en azından yarım saatte bir çalışan php dosyası ile 19:00 ile 19:30 arasındakilere göndermen senin için daha iyi olacaktır.
Ben hiç servera göndersin istemiyorum. Hatırlatıcı, alarm gibi düşünün. Metin sabit, sadece kullanıcı açık veya kapalı diye seçecek, açık ise belirtilen saatte hatırlatacak.
O zaman Google Cloud Messaging ile alakası yok sorunun Alarm Manager aratacaksın. Benim Alarm Manager ile yazdığım bir ders yok malesef.İnternetten araştırman gerekecek.
Local Notification olarak arat daha kolay.
Local Notification aratması sorunun çözümü değil.Belirli saatlerde notification göndermesi için Alarm Manager kullanmalı. Notification çıkarmak zaten Google cloud messaging deki Notification göstermekten farklı değil.
Hocam çok güzel örnek olmuş fakat google ı aradan çıkarsak, kendi sunucumuzdan doğrudan gönderme şansımız yok mu? Nodejs bu işi yapabilir diye umuyorum ki web tabanlı çok güzel yapıyor. Bu konuda bilginiz var mı? Teşekkür ederim.
Öncelikle yorum için teşekkür ederim. Ben kullanmadım node.js konu hakkındada pek bir bilgim yok. Ama Google Cloud Messaging ile de gayet kolay. Node.js ile nasıl kolay mı zor mu pek bilmiyorum.
Database’deki kullanıcı sayısı 1000’i geçtiğinde
Number of messages on bulk (1012) exceeds maximum allowed (1000) şeklinde bir hata veriyor ve mesajı göndermiyor nasıl çözebiliriz
Google tek seferde 1000 tane notification göndermeye izin veriyor. 1000 üzerinde notification için php curl ile göndermen gerekir notificationları.
Hocam değerli dersleriniz ve bilgilerinizi paylaştığınız için çok teşekkür ederim. Öncelikle bloğunuzdaki tüm derslerinizi takip etmeye çalışıyorum. Amatörce merak sardığım bu işte bir noktada takıldım. GCM ve webview’i birleştirdim ancak login uygulamasını bu uygulamalarla birleştiremedim. Amacım bir kullanıcı önce login olsun daha sonra notification alsın. Nasıl yapabileceğimle ilgili küçük de olsa bilgi verirseniz sevinirim. Teşekkürler..
Öncelikle yorum için ben teşekkür ederim.Bence login uygulama ile başla .Yani demek istediğim önce login uygulamasını indir. Onu çalıştırdıktan sonra açılan activitye webview koy. Sonrasında ise Push Notification olayını ekle .Bu sıra ile gidersen entegre etmen kolay olacaktır.
Hocam bildirim uygulamasını denemek için illa Google Play Store’da olması mı gerekiyor uygulamanın. Yani Emülatör üzerinden deneme yapamayız değil mi?
Uygulamanın Google Play Store’da olması lazım değil ama cihazında Google Play yüklü olması gerekiyor.Android in kendi emülatörlerinde Google Play olmadığı için test edemezsin . Bunun çözümü ise Genymotion emülatör kullanmak.Genymotion emülatöre Google Play yükleyip bunu deneyebilirsin. Genymotion dersim için link paylaşıyorum.
http://www.mobilhanem.com/android-genymotion-emulator-kurulumu-ve-google-play-yukleme/
Önceden belirlediğimiz sabit bir mesajı bir event gerçekleştiğinde gönderebilmek için send.php dosyasını nasıl düzenlemeliyiz ?.
Send.php içindeki
$mesaj = array(“notification_message” => $_POST[‘mesaj’]); kısmındaki
$_POST[‘mesaj’] yerine “Yazacağın mesaj şeklinde static mesaj set edebilirsin”
1-Türkçe karakter kullanıldığında bildirim boş olarak gidiyor. Bunun çözümü var mıdır ?
2- Denemelerimde ortalama bildirim gönderilme süresi 17 saniye çıktı. Bildirim gönderildiğinde örneğin 1000 kişilik bir üye grubunda bildirimi ilk alan ile son alan arasında ne kadar bir süre fark olur ?
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
bu satırdaki 9000 neyi ifade ediyor?
regid uygulama içinde kontrol ediliyor fakat versiyon değiştirip güncelleme yapılınca regid değeri database için primary key olmadığından bir cihaz için birden çok kayıt yapabiliyor…Doğru mudur? Bu bizim için bir problem değil midir ?
Merhaba , soru gerçekten siteye gelmiş en güzel sorulardan bir tanesi öncelikle ben teşekkür ederim:) Konuya açıklık getirelim. Google dökümanlarında, versiyon değişimlerinde eski registration id’nin değişebileceğini söylemiş. Yani registration id nin değişmesi demek cihaza notification gelmemesi demek. Biz bunu handle edip Databasimize yeni registration id yi kaydetmemiz, eskisini güncellememiz gerekir. Eskisi ile güncellemeyip yeni kayıt açmamizda bir problem olmaz ama sağlıklı olan eskisinin yerine yenisi ile güncellemek. Bunuda şöyle yapabiliriz .Sharedpref de regId’yi tutarken yanında versiyon bilgisinide tutabilirsin. Baktın ki sharedpref deki versiyon ile mevcut versiyon tutmuyor yeni bir webservis ile eski regId ile yeni regId ni database’e gönderip eskisinin yerine yenisini kaydedebilirsin.
Merhaba ;), 2 cihaz içinde aynı sorunla karşılaşınca sormak istedim uygulamaya güncelleme verdiğimde kayıt edilen regid değerlerinin değişmediğini gördüm..Eğer bir değişiklik varsa kontrol edip kayıt etmek tabiki doğru olan;aksi halde gereksiz işlem yapmılmış olacak…Sanırım uygulama tarafında değilde register.php de sql ile bunu çözmek doğru olacaktır…
diger bir konu ise gonderilen mesajda karakter sayisi fazla ise notification expand olabilmeli,bunu eklemekte fayda var..
Merhaba ben bu projeyi yaptım çalışıyor ama bir şey eksik.Uygulamayı açıyorum farklı bir activity butona basınca bu activity e ekledim php ile bağladım üyeleri fln görebiliyorum üye kayıt oluyor isim ve e-mail ile fakat sonrasında uygulamayı kapattıp tekrar açtığımda aynı activityi açıyorum tekrar kayıt kısmına tıkladığımda kayıt kısmı açılıyor ben oraya eğer üye daha önce kayıt oldu ise o isim ile direk başka bir activity e yönlendirmek istiyorum.Algoritma şöyle
1-Ana Aktivitiyi aç
2-kullanıcı Bildirim Sistemine Giriş yap butonuna bassın
3-Kullanıcının e-mailini kontrol et
4-eğer kayıtlı ise direk bildirimler kısmına gönder yoksa kayıt ekranını aç?
nasıl yapabilirim bilgisi olan ?
Sorduğun sorunun bu konuyla pek alakası bulunmuyor. Kişi kayıt olduğunda bilgilerini Sharedpreferences yada Sqlite kullanarak kaydedersin. Kayıt sayfası acıldıgında buradan kontrol edip kayıt varsa Bildirimler sayfasına gönderirsin yoksa Kayıt sayfasında bırakır Kayıt olmasını sağlarsın.
Bu iki dersim işine yarıyacaktır.
http://www.mobilhanem.com/android-sharedpreferences-kullanarak-login-ekran-yapimi/
http://www.mobilhanem.com/android-login-ekran-yapimi-2-kayit-islemi/
Peki, gelen bildirimi açtığında kullanıcı onu bir layouta yönlendirebilirmiyiz ? yani bildirimin olduğu bir layouta giricek kullanıcı sonra geri bastığında anamenüye dönecek.
İşte bunun konuyla alakası bulunuyor:) Bunu yapabilirsin zor değil.
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0);
Burda SplashScreen Yerine açtırmak istediğin sayfayı yazabilirsin.
eyw abi yaptım onuda şimdide şöyle bir sorun var.257 kullanıcı vardı sql de kayıtlı.bir bildirim yolladım telefon çıldırdı bildirim arka arkaya 20 30 kere sesi geldi sonra bir kere titredi.her telefonda aynısı oldu 20-30 kere ses geldi bildirim sesi.sonra mesaj geldi
Demek ki bişeyleri yanlış yapmışsın.Büyük ihtimal yanlışın PHP kodlarında. Bildirimi birden fazla defa gönderiyorsun. PHP kodlarını kontrol et. Kullanıcı sayısı kadar mı gönderiyorsun acaba?
Mesajın uzunluğu bişeyi değiştirirmi abi hani default bir karakter sayısı varmı? atıyorum her gönderimde 8 karakter sınırı var gibi.benimkisi 40-50 karakter oldu onu parça parça göndermiş olabilirmi ?
Hayır 40-50 karakterlik bir mesajı çok rahat gönderir. Karakterle alakalı bir durum değil.
send.php’den yolladğımda 500 tane alt alta multicast log u çıkıyor ama 3 farklı log var;
{“registration_id”:”APA91bGPnI6jxJsbngmXXdymmxcucbfHpTk9IliCOm13XzohsKn32OxHD3h8yjGmQ0hEZz0OmamRFUEvF0EOMUw1Pa8FYtWcXPAxJF9SIDymhzJlbdQ3z0nWEDMRAQV6hIy8xRFkmnlAiPuoXZ_3xKiBn99NTAt5disAD4BEeCZtg9XoCuZzMTw”,”message_id”:”0:1430476173852969%37b8606af9fd7ecd”}
2.şekil
{“message_id”:”0:1430476173853603%37b8606af9fd7ecd”},
3.şekil;
{“registration_id”:”APA91bGPnI6jxJsbngmXXdymmxcucbfHpTk9IliCOm13XzohsKn32OxHD3h8yjGmQ0hEZz0OmamRFUEvF0EOMUw1Pa8FYtWcXPAxJF9SIDymhzJlbdQ3z0nWEDMRAQV6hIy8xRFkmnlAiPuoXZ_3xKiBn99NTAt5disAD4BEeCZtg9XoCuZzMTw”,”message_id”:”0:1430476173863943%37b8606af9fd7ecd
4.şekil
{“message_id”:”0:1430476173870998%37b8606af9fd7ecd”},{“message_id”:”0:1430476173872419%37b8606af9fd7ecd”},{“message_id”:”0:1430476173870992%37b8606af9fd7ecd”},{“message_id”:”0:1430476173871965%37b8606af9fd7ecd”},{“message_id”:”0:1430476173871966%37b8606af9fd7ecd”},{“message_id”:”0:1430476173871969%37b8606af9fd7ecd”},{“message_id”:”0:1430476173871971%37b8606af9fd7ecd”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”
EDIT: SOrun galiba şurda abi, Manifest dosyasında permission kısmında
kısmında ben bunu direk yazmışım example yerine paket id sini girmem gerekicek.
Sorun çözüldü mü bu şekilde?
Evet
konu için teşekürler. bildirimleri ben son dakika haber olarak atmak için kullanıcam bunun için bildirime tıklandıgında sitenin manşet sayfasına gitmesini istiyorum. bunu nasıl yaparım?
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0);
Burda SplashScreen Yerine açtırmak istediğin sayfayı yazabilirsin.
mesaj göndermek istediğim zaman şöyle hata alıyorum abi
“registration_ids” field cannot be empty
Google a gönderdiğin reqistration_ids boş gidiyor. Ya kaydederken hata alıyorsun yada geri çekerken . Mysqlden kontrol et ilgili alan boş mu dolu mu?
bu sorunu halletim abi şöyle bir konudan bahsetmek istiyorum;
ben mesajyı gönderdim telefondan o bildirime tıklandımı başlığını yazdıgım habere gitsin istiyorum. SplashScreen ile tek bir sayfaya gönderebildim.
Sen her sayfa için ayrı activity mi oluşturmayı düşünüosun? Elbette tek sayfayı açıcaksın onun içinde haberin id sine göre ilgili haberi açtıracaksın. Bu id yide sharedpref gibi bir yapıda tutabilirsin.Notification gösteririken haberin id sini kaydet SharedPrefe sonra o sayfa acıldıgı zaman id sini cek ilgili haber göster.
bu olayın bir kaynak kodu varmı abi? nasıl yapacam pek bişi anlamadım 🙂
Sitedeki derslerde yok.Başka yerde var mı bilmiyorum.
http://www.mobilhanem.com/android-google-play-hesabi-acma-ve-apkyi-google-playe-yukleme-resimli/ konusunda bir sıkıntı yaşıyorum herşeyi doğru yaptığımı varsayıyordum lakin kartımın limitinde sorun oldugu içn kabul edilmedi ve tekrar başvurmak için verdignz linke tıkladıgmda direk panel geliyor farklı bir maille denemek istemiyorum kendi mailim ile tekrar farklı kredi kartı ile denemek istiyorum bunu nasıl yaparm
Merhaba Uygulamamda Parse ile push notification bildirimi gönderebiliyorum fakat benim sormak istediğim push bildirimine onclick olayını nasıl yapabilirim…clickledikten sonra gönderdiğim datayı farklı bir activity içinde nasıl gösterebilirim…şuan bildirime tıklanınca sadece mainactivity’i gösteriyor.
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0);
Burda SplashScreen Yerine açtırmak istediğin sayfayı yazabilirsin.
Merhabalar, öncelikle anlatımınız için teşekkür ederim. her şeyi yaptım. hiç hata yok. apk yı telefona attığım zaman ‘malesef durdu’ uyarısı veriyor. ne yapmam lazım ?
Emülatörde calısıyor mu ?
hayır
Siz direk burdaki kaynak kod üzerinden mi çalısıyorsunuz? Log Cat çıktısı paylaşma sansınız var mıdır?
düzenlemeleri yapıyorum. birebir aynısı değil . webview kısmını çıkardım. sadece push notification kısmı lazım bana . logcat kısmınıda akşam paylaşabilirim. bu konuda çok büyük bi sıkıntıdayım. yardım edebilirseniz çok müteşekkir olurum
Pc de internet bağlantısı yok. Emülatörde google play servisi de yok sanırım. Fakat kodlardan anladığım kadarıyla bunların kontrollerini yapıp uyarı vermesi gerekiyor. Uygulamayı direk kapatması…
Genymotion kullan . Emülatörle uğrasma .
http://www.mobilhanem.com/android-genymotion-emulator-kurulumu-ve-google-play-yukleme/
Ayrıca bu uygulama sadece Google Cloud Messaging dersi içeriyor . Sen tam bir uygulama yazacaksan bu kontrolleri eklemen gerekir. İnternet var mı yok mu? Google Play Yüklü mü değil mi vs..
üstad takıldığım nokta uygulama açılır açılmaz malesef durdu deyip kapanıyor…
Senin bu dediğinin yüzlerce farklı sebebi olabilir. Her uygulama hata verdiğinde bu şekilde kapatır. Projene Google Play Service import ettin mi?
eveet . admob geçiş dersinde anlattığınız gibi
Peki bu paylaştığınız Log çıktısı gerçek cihazda mı çalıştırınca aldınız emülatör de mi?
emülatörde
Emülatörde Google Play yüklü olmadığı için bu hatayı alıyorsun. Gerçek cihazda calıstırıp Log Paylasırsan daha mantıklı olur.
gerçek cihazda çalıştırıp log çıktısı nasıl alıcam
Cihazı kabloyla bilgisayara bağlıcaksın. Sonra Run dediğinde sana çalıştırmak istediğin cihazı soracak. Orada bilgisayara bağladığın gerçek cihazı seçeceksin.
sorun php dosyasında imiş . ondan dolayı direk kapanıyormuş. herşey için çok teşekkür ederim
Çözüm bulmana sevindim. Kolay gelsin..
Merhaba, Öncelikle Teşekkür ederim eline sağlık. Herşeyi yaptım, phpde echolattırdığımda aşağıdaki gibi sonuçta alıyorum, fakat cihaza herhangi bir şekilde bildirim gelmiyor ne yapmalıyım? Teşekkürler
“success”:1,”failure”:0,”canonical_ids”:0,”results”:[{“message_id”:”0:1431944525654327%3c47560df9fd7ecd”}]}
Buraya kadar sorunsuz calıstıysa cok büyük ihtimal Android kısmında sorun var.
Log.d(“mesaj—>>>”,mesaj);
Bu kısımdan Log alamıyor musun?
Merhaba, manifest.xml’de küçük bi hata varmış ondan dolayı olmuyormuş, teşekkür ederim.
Merhabalar, generateNotification fonksiyonum resimde göründüğü şekildedir. Fakat; Gelen bildirime tıkladığım zaman MainActivity.java class’ını çağırmak yerine: bildirimi temizliyor. Bunu (benim kaynak koduma göre) nasıl çözebilirim?
Teşekkür ediyorum 🙂
Senin koduna göre bilmiyorum ama hatan bence Panding Intent kısmında.
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, SplashScreen.class), 0);
Burda Açtırmak istediğin Activity ile SplashScreen değiştir bakalım çözülüyor mu?
Açmak istediğim sayfa değil, Ana Activity olmak zorunda burada 🙂
Ana activity adını yazarak sorunu çözüm 🙂
SQLite hakkında bir problem yaşıyorum şuanda. Onun hakkında yardımcı olabilir misiniz acaba?
AnaActivity olmak zorunda değil. Oraya istediğin Activityi yazarak açabilirsin. Ama senin uygulamanda farklı kontroller vardır Login vs gibi ona bişey diyemem. Ama normal şartlarda Orada istediğin Activityi açtırabilirsin.
http://www.mobilhanem.com/android-sqlite-database-kullanimi-select-insert-update-delete/ bu dersimde Sqlite hakkında bilgiler bulabilirsin. Çözüm olmazsa konu altından sorabilirsin.
Mysql veritabanında birbirinin aynı registration id birden fazla olursa sorun olur mu ?. Bunları teke indirmek gerekli midir ?
birden fazla olması durumunda aynı kişiye birden fazla bildirim gideceğini düşünüyorum. Sorun bu olur. O yüzden registration id’yi tuttuğun alanı Unique yapıp mükerrer kayıtı engelleyebilirsin.
Mükerrer kayıtları manuel olarak sildikten sonra o sütunu unique yapmak istediğimde aşağıdaki uyarı geliyor :
Hata
SQL sorgusu:
ALTER TABLE `wp_gcm_kullanicilar` ADD UNIQUE (
`registration_id`);
MySQL çıktısı: #1170 – BLOB/TEXT column ‘registration_id’ used in key specification without a key length
Bunu nasıl çözebilirim ?
reqistration_id alanını Text olarak değilde varchar olarak tutarsan sorun çözülecektir diye düşünüyorum.
Sizin bu makalenizden yararlanarak gerçekleştirmiş olduğum LYS sonuç alarm projem sınav sonuçları açıklandığında tamamlanmış olacak. Diğer projelerimde bu düzenlemeyi dikkate alarak yapacağım. Teşekkür ediyorum. Emeğinize sağlık. İncelemek isterseniz uygulamam google playde :
https://play.google.com/store/apps/details?id=com.lys_sonuc_alarm
Merhaba varchar ile de unique olmuyor. Registration_id sütununu unique yapmak için ne kullanmak lazım ?
Varchar ile unique olur. Önceki kayıtlarında tekrar eden değerler olduğu için unique yapamamış olabilirsin.
@integer/google_play_services_version kısmının altı kırmızı çizgi ile çizili bu yüzden uygulama çalışmıyor. @integer/google_play_services_version altı neden hatalı olabilir.
Google Play Services import edememişsiniz.
{“multicast_id”:9137775754851854025,”success”:0,”failure”:1,”canonical_ids”:0,”results”:[{“error”:”MismatchSenderId”}]}’
Hatanın sebebi nedir?
Emeğinize sağlık bu konu gerçekten çok önemliydi sizde çok iyi bir şekilde izah etmişsiniz .)
Yukarıda com.example.gcm yerine siz kendi package adresini vermelisiniz
Kendi site adresimiz mi?
,”success”:0,”failure”:1
büyük ihtimal api ayarlarını doğru yapmamışsın.
oncelikle mukkemmel bir ders oldugunu soylemem gerekli ancak ben bildirimleri cok gec aliyorum nereden baksaniz 20 dk gec geliyor bunun sebebi ne olabilir ?
Yorum için teşekkür ederim.Geç gelmesinin sebebi Google ile alakalı bir durum. Sizin sunucudan çıktıktan sonra Telefona gelene kadar sizin yapacak birşeyiniz olmuyor. Ama 20 dakika geç gelmesi pekde mantıklı değil. Benim denemelerimde hemen geliyor.
bende emuletorden kaynaklı oldugunu dusundum baska emuletorlerde denenedim ancak onda da aynı sekilde success result u almam 1 sn ye bile sürmüyor ancak bildirim oldukca geç geliyor.. Aklıma takılan bir sürü futbol skorunu gönderen uygulamanın olması ve bir cogu skoru ligtv yanından önce gönderiyor bunu nasıl yapıyorlar ? demem o ki client tarafında bir hatam olabilir mi Gcmbroadcastim yavas algılıyor veya onHandleIntent methodum gec işlem yapıyor olabilir mi ? Regıster kaydında da hiç bir beklemem yok çünkü
Gerçek bir cihazda test etme şansınız oldu mu? Belki simülatörden kaynaklı olabilir gibi geldi.
Merhaba bana böyle bir değer dönüyor ama bildirim gelmiyor sıkıntı neyden kaynaklanmış olabilir
(id=0:1439205975029375%be313eb766d6cf16)
Bide uygulamayı google playde paylaşmasak olabilir mi ?
Google Playde paylaşmasanda Push Notification atabilirsin.
Merhaba öncelerde sorduğum sorunun cevabını buldum ama notification kısmına gelen mesaj null değer alıyor. Onu server tarafından gelen değerle nasıl doldurabiliriz. Teşekkürler.
Burda “notification_message” kısmı sunucudan gönderdiğiniz mesaj değişken değeri ile aynı olmalıdır.
Güzel kaynak fakat hatalarla dolu. Lütfen düzeltmeleri yapınız !
Hatalı kısımları paylaşırsanız düzeltiriz. Burdaki kaynak kodların hiç biri çalışmadan buraya yüklenmiyor. Siz kendi projenize entegre ederken sorunlarla karşılaşmış olabilirsiniz.
Android studio kullanıyorum import edince hatalar alıyorum R. yi görmüyor yada servisleri
Neyi import edince?
Merhaba uygulamamda telefon nosu adı ve soyadını almak istiyorum GCM de telefon ID Ve Mail adresini aldım ama telefonno ve adını alamadım bilgisi olan arkadaş varmıdır
Nasıl alamadın yani. Tam olarak ne yapmak istediğini açıklarsan yardımcı olmaya çalışalım.
Telefonuda aldım ama durumda kayıtlıysa. Php panel hazırlamak lazım şimdide buna
İlla Php olcak diye birşey yok ama en kolay PHP ile hazırlarsın diye düşünüyorum.
Panel işinide hallettim bilgim var zaten php kısmını yaparken kodları tamamen çözdüm 🙂
şimdi ben push yollarken title yide yolluyorum ama bir türlü alamadım String leri 2 tane yapıyorum hata veriyor çözemedim bi türlü yani burayıda “.setContentTitle”
Push Notification﹕ Received: Bundle[{message=mesajımmmm, title=başlıkkk,
üsttekini görüyorum altta ama yazdırmaya gelince hoşaf oluyor 🙂
public void sendNotification(Bundle extras) {
bu şekilde çözdüm
Çözümü paylaştığın için teşekkürler. Yanlız direk sorduğun sorunun altına cevap Yanıtla diyerek cevap verirsen daha toplu olur.
Kolay Gelsin.
Error:(94, 13) error: cannot access HttpRequest
class file for org.apache.http.HttpRequest not found
Böyle bi hata alıyorum nasıl çözebilirim?
2 hata var ilki yetki yok diyor ikinciside class yok diyor
İnternet izni vermemişsin.
Merhaba push olarak link yollamak istiyorum yani webview olarak mesaja tıklanınca yolladığım link açılsın konu hakkında bilgisi olan varmıydı php ile yolluyorum ama if elselerle uğraştım java da çözemedim
Aynen istediğimiz link açılsa çok güzel olur
Evet yollayabilirsin. Php ile mesaj gibi linki yollarsın. Linki yolladıktan sonra kişi notificationa tıkladığı zaman webview sayfasını açtırırsın. Orda yolladığın linki actırabilirsin.
Notificationa tıklandıgında istediğin sayfayı açtırmak istiyorsan:
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, SplashScreen.class), 0);
Yukardaki kodda SplashScreen.class yerine webview’in içinde bulunduğu classı actıracaksın.
Evet örnek var mı ?
Hayır sitemizde direk istediğin gibi çalısan bir örnek yok.
Anlayan yok yani
Chat kısmından bana yazsana
{“multicast_id”:8035945768882311296,”success”:0,”failure”:2,”canonical_ids”:0,”results”:[{“error”:”InvalidRegistration”},{“error”:”InvalidRegistration”}]}
Hatasını alıyorum 🙁
Kayıtlı degil diyor uygulamayı yüklediğin ve kodu db den çeken bir sistemin olduğuna dikkat et
Kullandığın script mysql den veri çekiyor mu toplu gönderen script var galiba. Phpmyadmin den bak kayıtlar oluyor mu
Evet kayıtlar oluyor. Ve veritabanından bilgileri çekiyor. Sanırım anroid kısmında problem var.
com.example.gcm yerine kendi sitemizi mi yazıyoruz?
Ücret karşılığı yardımcı olmak istersen http://www.eraykoseoglu.com ‘dan ulaşabilirsin.
ellerine sağlık aşamaları düzgün takip edip uygulayınca çalışıyor.
Bundan ekstra olarak daha kapsamlı daha özelleştirilebilir dersler bekliyoruz..
İnsallah fırsat buldukca yayınlayacağız. Yorum için teşekkürler.
Kaynak kodları aynen içeri aktardım fakat böyle hatalar alıyorum. Atladığım bir aşama mı var? Neyi yanlış yapıyorum bir türlü çözemedim
Google Play Libsi eklememişsin.
Curl failed: Unknown SSL protocol error in connection to android.googleapis.com:443 hatası alıyorum 4-5 aydır çalışıyodu bugün bu hatayı veriyor nasıl düzeltebilirim, bildirim gönderdiğim php dosyasından kaynaklanıyor
Örnek için teşekkürler, gayet açıklayıcı ve net olmuş. Sorum şu, benim veri tabanımda kullanıcı tipi olarak 10’dan fazla tip var. Her bir tür için belirli push notification atmak istiyorum, nasıl yapabilirim. Mesela a grubuna bu notification’u alırken b grubu almayacak, ve belirli bir görev dahilinde olacak. Hastane sistemini örnek olarak verecek olursam, diyelim ki dahiliye servisinde hastanın birinin ilaç zamanı geldi ki bu da sistem saatiyle anlaşılacak ve bu durumda otomatik olarak bir notification gönderilecek, yardımlarınız için şimdiden teşekkürler.
Bunu Android tarafında değil PHP tarafında halledeceksin.
PHP de tüm kullanıcıları çektiğim satır var
yerine
şeklinde yapmalısın.
Tabiki burda group kısmını sen kendi veritabanındaki kayıtlara göre yapmalısın.
merhaba elinize sağlık. asp.net le registeredID leri nasıl alırız ?
Merhaba veritabanına ekleme işini halletim fakat regId kısmı boş geliyor bu google cloud manager la alakalı olabilir mi ? proje numarası doğru proje number kısmını ekledim sizin kodları çalıştırıyorum ama regId boş değer veritanına ekleniyor.
regId yi external storage ile halletim ama bu sefer buluttan bildirim gelmiyor cihaza send kısmı çalışmıyor galiba
regId yi external storage ile nasıl hallettin ki?
Merhaba send kısmını şimdi çalıştırdım ama sadece titreşim geliyor ekrana birşey düşmüyor nereye bakmam gerekiyor ?
Ekrana zaten birsey gelmiyor. Status bara geliyor. Status bar ı aşağı çekersen orada görürsün Notification ı
Eğer yinede gelmiyorsa
NotificationCompat.Builder
içindeki
.setContentTitle(“Mobilhanem”)
.setSmallIcon(R.drawable.ic_launcher)
.setStyle(new NotificationCompat.BigTextStyle() .bigText(msg))
.setContentText(msg)
Bu kısımları iyice kontrol et.
Merhabalar, öncelikle elinize saglık harika bir örnek uygulama olmuş. Ben bu uygulamayı note2 de denedim ve çalıştırdım. Sorunum şu: uygulama boyutu yaklaşık 8-10Mb. Bu uygulama boyutunu nasıl minimum seviyeye düşürebilirim ?
Yapamayanlar için, https://www.codester.com/items/1557/android-webview-application-template?ref=techtasys
Buradan hazır webview + push notification sistemi kodlarını satın alıp dokümantasyonu ile kolayca editleyip uygulamanızı hazırlayabilirsiniz.
merhaba projeyi uyguladım çalışıyor ancak veritabanına gelen bir id yok. şöyle bir mesaj alıyorum.
02-05 10:23:59.055 23503-23503/? I/Haber5N GCM: Registration id bulunamadı.
02-05 10:24:04.115 23503-23503/com.rasimakar.haber5n I/dalvikvm: Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
02-05 10:24:04.115 23503-23503/com.rasimakar.haber5n W/dalvikvm: VFY: unable to resolve virtual method 575: android/content/res/TypedArray;.getChangingConfigurations ()I
02-05 10:24:04.115 23503-23503/com.rasimakar.haber5n I/dalvikvm: Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
02-05 10:24:04.115 23503-23503/com.rasimakar.haber5n W/dalvikvm: VFY: unable to resolve virtual method 597: Landroid/content/res/TypedArray;.getType (I)I
02-05 10:24:04.205 23503-23503/com.rasimakar.haber5n E/com.parse.PushService: Could not start the push service. Make sure that the XML tag is in your AndroidManifest.xml as a child of the element.
02-05 10:24:04.280 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:library_loader_hooks.cc(112)] Chromium logging enabled: level = 0, default verbosity = 0
02-05 10:24:04.280 23503-23503/com.rasimakar.haber5n I/BrowserProcessMain: Initializing chromium process, renderers=0
02-05 10:24:04.285 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:url_util.cc(429)] AddStandardScheme is not supported
02-05 10:24:04.285 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:url_util.cc(429)] AddStandardScheme is not supported
02-05 10:24:04.285 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:url_util.cc(429)] AddStandardScheme is not supported
02-05 10:24:04.285 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:url_util.cc(429)] AddStandardScheme is not supported
02-05 10:24:04.310 23503-23721/com.rasimakar.haber5n W/chromium: [WARNING:proxy_service.cc(888)] PAC support disabled because there is no system implementation
02-05 10:24:04.670 23503-23503/com.rasimakar.haber5n I/dalvikvm: Could not find method android.security.NetworkSecurityPolicy.getInstance, referenced from method com.google.android.gms.ads.internal.t.e.a
02-05 10:24:04.670 23503-23503/com.rasimakar.haber5n W/dalvikvm: VFY: unable to resolve static method 1032: Landroid/security/NetworkSecurityPolicy;.getInstance ()Landroid/security/NetworkSecurityPolicy;
02-05 10:24:04.680 23503-23503/com.rasimakar.haber5n I/dalvikvm: Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.nb.a
02-05 10:24:04.685 23503-23503/com.rasimakar.haber5n W/dalvikvm: VFY: unable to resolve virtual method 424: Landroid/content/pm/PackageManager;.getPackageInstaller ()Landroid/content/pm/PackageInstaller;
02-05 10:24:04.715 23503-23743/com.rasimakar.haber5n I/OMXClient: Using client-side OMX mux.
02-05 10:24:04.720 23503-23503/com.rasimakar.haber5n I/OMXClient: Using client-side OMX mux.
02-05 10:24:04.875 23503-23503/com.rasimakar.haber5n I/Ads: Starting ad request.
02-05 10:24:04.875 23503-23503/com.rasimakar.haber5n I/Ads: Use AdRequest.Builder.addTestDevice(“595CF596D3F04D38FEA78959B140622F”) to get test ads on this device.
02-05 10:24:04.885 23503-23503/com.rasimakar.haber5n I/Ads: Please set theme of AdActivity to @android:style/Theme.Translucent to enable transparent background interstitial ad.
02-05 10:24:04.910 23503-23503/com.rasimakar.haber5n I/Ads: Starting ad request.
02-05 10:24:04.910 23503-23503/com.rasimakar.haber5n I/Ads: Use AdRequest.Builder.addTestDevice(“595CF596D3F04D38FEA78959B140622F”) to get test ads on this device.
02-05 10:24:04.920 23503-23503/com.rasimakar.haber5n I/Ads: Please set theme of AdActivity to @android:style/Theme.Translucent to enable transparent background interstitial ad.
02-05 10:24:05.185 23503-23503/com.rasimakar.haber5n I/Choreographer: Skipped 66 frames! The application may be doing too much work on its main thread.
02-05 10:24:05.830 23503-23755/com.rasimakar.haber5n W/Ads: There was a problem getting an ad response. ErrorCode: 1
02-05 10:24:05.890 23503-23503/com.rasimakar.haber5n W/Ads: Failed to load ad: 1
02-05 10:24:06.815 23503-23514/com.rasimakar.haber5n I/Ads: No fill from ad server.
02-05 10:24:06.965 23503-23503/com.rasimakar.haber5n W/Ads: Failed to load ad: 3
Hocam bu kaynak kodları Android Studio ‘ya import etmek istediğimde Settings.jar bulunamadı diye hata veriyor. Nasıl çözebiliriz.
İndirdiğim Kaynak kodunu Android Studio ya import ettiğimde resimdeki gibi bir hata alıyorum. sorun nedir acaba yardımcı olur musunuz?
Şuan uygulamada hiç bir hata yok fakat emulatorde çalıştırdığımda Google Play Service yok diyor. Derslerinizdeki Google Play Services ekleme işlemini de yaptım. Fakat hala aynı sorun var.
Sorun dersle yada kodunla alakalı değil. Emülatörde google play services olmadığı için calısmayacaktır. Gerçek cihazda çalışır.
Peki Genymotion emülatorlerine google play servislerini nasıl ekleyebilirim. yardımcı olur musunuz?
Abi gerçek cihazda dene . Genymotion dersimiz var orda anlatmıştım ama ordaki gapps(google appslerde ) artık servis dışı kalmış. Ama dersimi incelersen anlayacaksın ne demek istediğimi.
Tamam Hocam şimdi gerçek cihazda deniyorum sonucu iletecem
Taha Hocam gerçek cihazda denedim Uygulama durduruldu dedi açmadı. Buradaki Kaynak kodu indiriyorum Google Play Services dersinizdeki gibi servisleri ekliyorum. Zaten daha önceki oluşturduğum uygulamalarada ordaki dersinizden bakarak eklemiştim. onlarda problem olmadı ama bunda sıkıntı çıkıyor. Lütfen yardımcı ol hocam bu bildirim işini halletmeme
Ne zaman crash oluyor. Uygulama çalışır çaılşmaz mı yoksa notification gönderdiğin zaman mı? Crash olunca logcat çıktısını paylaşır mısın?
{“multicast_id”:4955136517638728213,”success”:0,”failure”:1,”canonical_ids”:0,”results”:[{“error”:”MismatchSenderId”}]} bunu nasıl duzeltebilirim yardımcı olurmusun
Tamam Hocam şimdi gerçek cihazda deniyorum sonucu iletecem eywallah.
Google Play services eklememiş yada hatalı eklemişsin. Kontrol etmelisin.
“registration_ids” field cannot be empty hatası alıyorum.
Bu hatayı nerede alıyorsun?
Send.php dosyasında veri gönderirken.
http://i.hizliresim.com/a243gg.png
Burda iki ihtimal var. Ya registration_id leri database kaydedemiyorsun yada kaydettiğin datayı geri çekemiyorsun.
registration_id leri database e kaydedemiyor. Sebebi ne olabilir ? Herşeyi adım adım yaptım.
Database e regid yi yazamadığı için kendim LogCat den regid yi aldım ve database e yazdım. Send.php den herhangi birşey yazdığım zaman
{“multicast_id”:4913781799887818213,”success”:0,”failure”:1,”canonical_ids”:0,”results”:[{“error”:”MismatchSenderId”}]} uyarısını aldım bu kez de 🙂
Bunu bende aldığımda eski verileri silip tekrardan almıstım reg_id leri sorun çözülmüştü.
Merhaba,
Örnek kod çok güzel çalışıyor ancak takıldığım bir konu var.
Kullanıcı uygulamayı kaldırıp yeniden kurduğunda, register işlemi sırasında yeni bir regid üretiyor ve bizde bu yeni regid’yi de veritabanına yeni bir kullanıcıymış gibi ekliyoruz ancak tahminimce aslında yeni bir regid atamıyor sadece aynı regid’ye yeniden hashing yapıyor ve bize yeni bir regid gibi görünüyor, çünkü push notification gönderdiğimizde o kullanıcıya birden fazla bildirim gidiyor. (kaç defa kaldırıp kurduysa o sayıda bildirim geliyor)
Tahminimce bunun 2 çözümü olabilir,
1- Kullanıcı uninstall yaptığında bir event tetiklenmeli bizde o kaydı veritabanımızdan kaldırmalıyız?
2- Kullanıcı uninstall yapıp yeniden install yaptığında, yeni oluşam kaydın aslında eskiden var olan bir kayıt olduğunu fark edip regid’yi güncellemeliyiz?
ama nasıl?
Yardımınız için şimdiden teşekkürler.
Aynı cihazdan aynı uygulama reg_id üretilir farklı reg_id üretmez. Diyelim ki üretti bir uygulamaya iki tane aynı Push atacağını sanmıyorum.
çözüm için unique olan device_id yi kullanabilirsin. reg_id ile birlikte device_id sini alabilirsin. Aynı device_id den baska reg_id geldiğinde güncellersin. Ama uninstall u tetikleyen bir yapı yok.
Merhaba,
Kodu çok güzel açıklamışsın ama benim gibi acemiler için gerçekten bu bildirim işi çok zor 🙂 benim sorunum uygulamayı açtığımda register yapıyor veritabanına ekliyor. Ama bildirim gönderdiğimde telefona bildirim gelmiyor buradaki hatayı nasıl kontrol edebilirim? Eğer bir log dosyasını görmek isterseniz o log dosyasını nerde söylebilir misiniz?
yardımlarınız için simdiden teşekkurler
tekrar merhaba sorunu çözdüm. manifest dosyasındaki bazı satırları atlamışım
Çok teşekkürler eline meğine sağlık.
Teşekkür ederim.
Hocam
GcmIntentService classında
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
//Gelen mesaj tipini alıyoruz
String messageType = gcm.getMessageType(intent);
String mesaj = intent.getExtras().getString(“notification_message”);
intentden gelen extras lar gelmiyor ve mesajı Log.e ile yazdırmaya çalıştığımızda null hatası veriyor
sebebini çözemedim
uygulama çok güzel çalışıyor. Fakat bildirime tıklandığında uygulama açılıyor ama yazı uygulama içerisnde yok. uygulamaya kaydedemezmiyiz ? kullanıcı bildirime tıkladığında uygulama açılsın ve gelen yazıyı görsün ?
Evet yapabilirsin. Gelen mesajı SharedPreference içine kaydedersin. Sonrasına PendingIntent olarak bir Activity açtırırsın ve o activity içinde SharedPreference içinde kaydettiğin değeri gösterirsin.
Hocam eline sağlık, “Evet yapabilirsin. Gelen mesajı SharedPreference içine kaydedersin. Sonrasına PendingIntent olarak bir Activity açtırırsın ve o activity içinde SharedPreference içinde kaydettiğin değeri gösterirsin.” örnek kodla açılayabilirmisin?
verdiğiniz AndroidManifest.xml, SplashScreen.java , RegisterApp.java , GcmBroadcastReceiver.java , GCMIntentService.java kodlarının hangi satırlarını kendi uygulamamıza eklememiz gerekiyor?
uygulamam tamamen hazırlandı. bu verdiğiniz kodların hangi bölümünü eklemem gerekiyor?
Öncelikle teşekkür ederim paylaşımınız çok güzel.
2 sorum var:
1- Bildirime tıklayınca activity nasıl açtırabiliriz? şuan bildirim gelince otomatikmen activity açılıyor.
2- bildirime tıklayınca bildirimi nasıl cancel yaparız?
Yorum için teşekkür ederim.
1- PendingIntent contentIntent = PendingIntent.getActivity(this, 0,new Intent(this, SplashScreen.class), 0);
bu kısımda SplashScreen yerine açtırmak istediğin Activity yazabilirsin.
2-
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setContentTitle("Mobilhanem")
.setSmallIcon(R.drawable.ic_launcher)
.setStyle(new NotificationCompat.BigTextStyle()
.setAutoCancel(true)
.bigText(msg))
.setContentText(msg)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });
Android Notification iptal etmek için yukarıdaki setAutoCancel(true) eklemeyi yapacağız.
Merhaba uygulama sorunsuz olusturuldu fakat anlamadigim olay su elimde 3 tane telefon var playstoredan uygulamayi 3 ünede yükledim ama telefonlardan sadece 1 tanesi bildirimleri alabiliyor sizce nedeni nedir ?
Güzel anlatım teşekkürler tek denemede oldu malum parse kapatılacak olduğu için mecbur kendi sistemimize geçtik.
OneSignal dersimizide inceleyebilirsin. Ordada server tarafında uğraşmanıza ggerek kalmıyor.
evet kullandım onuda ama bi zaman sonra o da desteğini çekerse uğraşmıyım diye bunu kullanıcam sağol
Herşeyi yaptım send.php yi çalıştırdığımda iletiyi yazıyorum gönder dediğimde hiçbişey olmuyor. browser ekranındaki herşey de kayboluyor sebebi ne olabilir yardımcı olursanız çok sevinirim. İyi günler
Sebebi Php de hata yapıyor olman. Php dosyanı iyice incele.
onu hallettim. şuanki sorun push notification gönderiliyor ama telefonda hiçbir etkisi olmuyor. reg_id yi de kaydediyorum db ye
Anlatım için teşekürler, uygulama hatasız açılıyor user mysql’e kaydoluyor. send.php den mesaj succes=1 ile gidiyor fakat telefona notification gelmiyor. project Id ve uygulama api keylerini kendiminkiyle değiştirdim projede ve php de ve uygulamayı android studiodan run diyerek çalıştıruyorum yani google playe yüklemedim. Neden olabilir?
Peki bu şekilde çeşitli formatlarda materyaller gönderebilirmiyiz. bir uygulama ile pc üzerinden uygulamayı kullananlara html, excel veya jpg formatlı olarak en kolay şekilde hangisi göderilebilir. Uygulamayı eclipse ile phonegap aracılığıyla web view şeklinde yaptım tek eksiğim, elimdeki bu öğeleri uygulama kullanıcılarına gönderebilmek kaldı. yardımcı olursanız sevinirim
Notifikasyon ile göndermek istediğin excel,jpg vs linklerini gönderip açıldığında bu linkten download edebilirsin.
Çok ayrıntılı ve başarılı bir anlatım olmuş teşekkürler. Program çalıştı ancak
if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType))
kısmında DEPRECATED yani geçersiz ve ya önerilmeyen bir kullanım olduğunu söylüyor. Bunun yerine ne kullanabiliriz. Teşekkürler.
Merhaba performans ve birçok şeyi göz önüne aldığımızda bu tarz bir yazılım geliştirmemi yoksa firebase üzerinden mi yazılım geliştirmemizi tavsiye edersiniz?
Firebase google n en son cıkardığı teknoloji ve onun kullanılmasını tavsiye ediyor. Dolayısıyla Firebase daha mantıklıdır.
Hocam çok açıklayıcı bi yazı olmuş.Fakat gelen bildirime tıklayınca gidecegi sayfayı nasıl ayarlayacaz.
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, SplashScreen.class), 0);
Burda splashScreen yerine actırmak istediğin activty’i yazabilirsin.
S.A. Kolay gelsin ;
Hocam push bildirim ekranında görünüyor. Fakat bildirim ekranına tıkladıktan sonra uygulama açıldıktan sonra da nasıl bildirimi gösterebiliriz?
Uygulama açıkken push gelirse alert ile yazdırıyorum ama uygulama kapalıyken bildirim panelinden tıklayınca alert çalışmıyor . Yardımlarınızı bekliyorum Teşekkürler…
Gelen Bildirimi SharedPreference kullanarak kaydedebilirsin. Sonra uygulama acıldıgında gösterebilirsin. Yada uygulama acıldıgında webservice bağlantısı kurup son gelen notification mesajını servisten çekip gösterebilirsin.
Yardımlarınız ve Paylaşımlarınız için Teşekkürler.
Merhaba,
Anlatım harika. Büyük emek vermişsiniz. Çok teşekkürler. Ben de ilk aşamada çalıştırdım, mysql e birkaç id kaydettim ve send.php den bunlara bildirim gönderdim. Daha sonra Google tarafında HTTP referrers (web sites) ekledim. Yalnızca izin verdiğim domain altında çalışan php sayfasından bildirim gönderilebilsin istedim. O andan sonra her ne yaptıysam (kısıtlamayı kaldırdım, yeni API Key ler oluşturdum, projeyi dahi yeniden oluşturdum) bir türlü send.php de şu uyarıyı aşamadım. Unauthorized Error 401. Sebebi hakkında fikriniz var mı?
Maksimum 1.000 bildirim gönderiliyor. 1.000 üzerinde şöyle bir hata veriyor Number of messages on bulk (1237) exceeds maximum allowed (1000)
Bu sayısı nereden arttırabilirim?
Bu sayıyı arttıramazsın. Gönderceğin bildirimleri curl ile parça parça gönderebilirsin.
Bu kadar hızlı cevap beklemiyordum. Curl olayı çok mantıklı. Hiç aklıma gelmemişti. Teşekkürler.
Merhaba. sistemi locale kurdum ve ip adresim üzerinden uygulama registration_id leri mysql e gönderiyor ancak send.php den mesaj gönderirken, Unauthorized Error 401 hatası alıyorum. Proje kimliği ve Proje numarası diye 2 bölüm var. Ben Proje numarası nı ekledim. Key i de send.php yi ekledim. Kodlarda bunun dışında herhangi bir değişiklik yapmadım.
Hata neden olabilir.
Aklıma gelenler; google proje sayasında yapmadığım bir ayar olabilir mi veya send işlemini değiştirmiş olabilir mi google
http://stackoverflow.com/questions/37633188/firebase-401-unauthorized-error-fcm
Bu adresteki işlemi yapınca düzeldi. İp adresime izin verdim. Teşekkürler
webView kısmına cihaz idsinide ekleyebilir miyiz?
Anasayfa.java daki
private String Url = “http://siteadresi.com?kod=”;
kod kısmına sqlle kayıt olan cihaz id yi eklemek istiyorum. Zaten bu id yi alıp yolluyoruz. Yardımcı olur musunuz?
Sorduğum sorunun cevabını buldum. Benzer bişi yapmaya çalışanlar için cevap şu adreste. https://sorucevap.mobilhanem.com/sorular/registration-id-yi-webview-e-ekleme/
Merhaba, anlatım için çok teşekkürler öncelikle. Uygulama ile ilgili sorunum var yardımcı olursanız çok sevinirim.
send butonuna bastığımda –> registration_ids” field cannot be empty hatasını alıyorum. registration id’ler veri tabanına kaydolmuyor. reg id değerini log cat ile alıp burada yerine koyunca
–> http://192.168.42.255/gcmphp/register.php?regId=” + regid
yani bu satırı tarayıcıma yazınca regid veri tabanına kaydediliyor ve bildirim alabiliyorum. Fakat regid değerlerini db’den silip uygulamayı çalıştırdığımda –> httpclient.execute(request); satırında Connection to http://localhost refused şeklinde bir exception veriyor.
Umarım sorunumu anlatabilmişimdir. Çözüm olabilecek her fikre ihtiyacım var. Yardım eder misiniz?
Yenilik Ararken Gözüme carptı fcm den 1000 1000 yollamak için bu kodu kullana bilirsiniz Ben kullanıyorum sıkıntı cıkmıyor.
Merhaba bu bildirimler ile Mesajlaşma servisleri nasıl yazabiliriz yani kullanıcıya bildirim gönderme işini hallettik ama her kullanıcıya ayrı mesela sipariş verdiğinde o kullanıcıya bildirim gitmesi cevap atması yani bi karşılıklı mesajlaşma işlemini nasıl yapabiliriz
Artık bu yöntem google cloud message kapatılmasından dolayı depracet olmuş keşke konu başında belirtilseydi. Not var ama dikkat den kaçabiliyor.