Awalnya, kami telah menggunakan GCM (Google Cloud Messaging) untuk mengirim pemberitahuan push ke perangkat Android, dan sekarang Google telah meluncurkan Firebase Cloud Messaging (FCM), versi GCM yang lebih baru dengan lebih banyak fitur
FCM adalah Layanan Perpesanan Cloud baru oleh Google di bawah merek Firebase, yang mewarisi infrastruktur inti GCM, ditambah SDK dan fitur baru untuk mempermudah pengembangan Perpesanan Cloud
Tutorial ini berguna untuk para developer PHP yang ingin mengirimkan notifikasi FCM(Firebase Cloud Messaging) dengan menggunakan PHP
Hei Technoz. semoga kamu baik-baik saja. Pada tutorial kali ini, kita akan melihat bagaimana cara mengirim push notification di android menggunakan php mysql. Kita semua tahu, notifikasi adalah hal yang ditampilkan di luar UI aplikasi kita. Kami menggunakan layanan Firebase Cloud Messaging (FCM) untuk mengirimkan notifikasi kepada pengguna. Jika Anda tidak tahu apa itu firebase, maka baca pengantar singkat di bawah ini. Jika tidak, Anda dapat melewati bagian itu
Firebase Cloud Messaging (FCM)
FCM adalah layanan yang dimiliki oleh Google. Memang sebelumnya bernama Google Cloud Messaging. Namun, Firebase adalah versi lanjutannya. Ini menyediakan banyak layanan seperti perpesanan cloud, basis data waktu nyata, Hosting, dll. Untuk tutorial ini, kami akan menggunakan perpesanan cloud untuk mengirim notifikasi ke perangkat android. Untuk mengetahui lebih lanjut, buka situs resmi Firebase
Tutorial ini adalah kombinasi dari dua hal. Salah satunya adalah registrasi, login pengguna menggunakan REST api dan lainnya menampilkan notifikasi ke pengguna yang dituju. Jadi, Anda mungkin merasa tutorial ini agak panjang. Oleh karena itu, tutorial ini saya bagi menjadi dua modul, agar lebih mudah dipahami dan rapi
1. Modul Android
Pertama, Mari kita beralih ke modul aplikasi android untuk mengirim pemberitahuan push di android menggunakan PHP MySQL
Notifikasi Gedung
Untuk membangun proyek untuk mengirim Pemberitahuan Push di Android menggunakan php mysql, Buka Android Studio dan mulai proyek baru atau gunakan proyek yang sudah ada, Anda ingin mengaktifkan pemberitahuan Firebase. Mulailah dengan aktivitas kosong baru. Pertama-tama kita harus membuat aplikasi dapat menampilkan notifikasi. Jadi, buat kelas baru <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>6 dan rekatkan kode berikut di dalamnya
package net.softglobe.fcmphpmysql; import android.content.Context; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; public class NotificationHelper { public static void displayNotification(Context context, String title, String text){ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, MainActivity.CHANNEL_ID) .setContentTitle(title) .setContentText(text) .setSmallIcon(R.drawable.user); NotificationManagerCompat notificationCompat = NotificationManagerCompat.from(context); notificationCompat.notify(1,mBuilder.build()); } }_Kode di atas berisi metode statis untuk menampilkan notifikasi. Kami dapat memanggil metode ini di mana saja untuk menampilkan notifikasi. Metode <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>7 mengambil tiga argumen. Pertama adalah konteks, yang memberikan konteks aplikasi, kedua adalah judul notifikasi dan ketiga adalah isi notifikasi. Kami menggunakan ikon png untuk notifikasi
Menambahkan Firebase ke Proyek
Kami sedang membangun sistem yang dapat mengirim notifikasi push di android ke perangkat yang dituju. Pertama, kita harus menambahkan Firebase di proyek kita. Ini jauh lebih sederhana. Buka menu proyek Alat->Firebase. Panel vertikal akan dibuka di sisi kanan yang memiliki banyak opsi yang tersedia untuk integrasi dalam proyek. Klik Cloud Messaging dan siapkan FCM. Klik tombol connect to Firebase. Ini akan meluncurkan browser di latar belakang di mana Anda harus mendaftar dengan akun Google Anda. Jadi, Anda akan masuk ke android studio
Kedua, klik tombol 'Siapkan perpesanan cloud'. lalu klik 'Terima Perubahan' dan dependensi yang diperlukan akan ditambahkan ke proyek Anda. Tunggu hingga proyek berhasil dibangun dan Anda selesai. Firebase ditambahkan dalam proyek Anda. Anda akan melihat centang hijau di panel kanan seperti yang ditunjukkan pada gambar di bawah
Menghasilkan token
Dengan demikian, setiap perangkat didaftarkan ke Firebase dengan token pendaftaran yang unik. Segera setelah kami akan menginisialisasi aplikasi, itu menghasilkan token. kita dapat menggunakannya untuk mengirim notifikasi ke perangkat itu saja. pertama-tama kami akan membuat token dan menampilkannya untuk memastikan bahwa kami telah berhasil menyiapkan firebase dan kami mendapatkan token. Jadi, mari kita pergi ke <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>_8 dan masukkan kode berikut di dalamnya
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>Kode di atas memiliki TextView yang akan menampilkan token yang dihasilkan
Sekarang untuk hal-hal latar belakang, buka <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>_9 dan masukkan kode berikut di dalamnya
package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }_Dalam metode package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }_0 di atas, kita telah mendapatkan instance dari firebase. Melalui itu, kami memanggil metode package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }1 yang memberikan hasil dalam bentuk variabel package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }2. Kita dapat memanggil metode package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }3 untuk mengetahui apakah tugas berhasil atau tidak. Jika berhasil, metode ini mengembalikan true, yang lain mengembalikan false. Akhirnya pada kesuksesan tugas, Kami mendapatkan token dengan menerapkan metode package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }4 dan package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }5 pada variabel tugas. dan mengatur token pada package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }_6
Kode di bawah ini terkait dengan notifikasi. Di android, versi O dan yang lebih baru diharuskan membuat saluran notifikasi sebelum menampilkan notifikasi yang sebenarnya. Karena itu, kami sedang memeriksa versi Android OS perangkat dan membuat saluran notifikasi yang sesuai. Coba jalankan aplikasi sekarang. Anda akan melihat token di package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Build; import android.os.Bundle; import android.widget.TextView; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; TextView tokentxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tokentxt = findViewById(R.id.tokentxt); FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ String token = task.getResult().getToken(); tokentxt.setText("Token: "+token); } else { tokentxt.setText("Token Not Generated"); } } }); //Creating notification channel for devices on and above Android O if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }6 seperti yang ditunjukkan pada gambar di bawah
Layar di atas menampilkan token yang dihasilkan. namun, saya tidak dapat menunjukkan token lengkap karena alasan keamanan 🙂 Tetapi Anda akan mendapatkan gambaran bagaimana itu akan ditampilkan. Saat string dihasilkan, kami mendapat konfirmasi bahwa firebase sudah diatur dengan benar. Token memainkan peran penting dalam mengirimkan pemberitahuan push di android menggunakan php mysql
Membangun Mekanisme Login/Pendaftaran
Menambahkan kode yang diperlukan
Sekarang, apa yang akan kita buat mekanisme login dan pendaftaran pengguna yang sederhana. Dengan demikian kami akan memilih salah satu dari pengguna terdaftar dan mengirimkan pemberitahuan dari halaman web. Untuk itu, kita harus membuat aktivitas login, Jadi, mari perbarui kode di tata letak <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>8 sebagai berikut
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>Itu semua tentang mendesain. Sekarang, mari kita buat tugas back end. Jadi, buka <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>_9 dan rekatkan kode berikut di dalamnya
package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; static String SHARED_PREF_NAME = "net.softglobe.fcmphpmysql"; EditText emailtxt,passwordtxt; ProgressBar progressBar; String token,email,password; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emailtxt = findViewById(R.id.tv_email); passwordtxt = findViewById(R.id.password); progressBar = findViewById(R.id.progress); //Generating Token FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ token = task.getResult().getToken(); } else { Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show(); } } }); button = findViewById(R.id.submitbtn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { email = emailtxt.getText().toString(); password = passwordtxt.getText().toString(); if (TextUtils.isEmpty(email)){ Toast.makeText(MainActivity.this, "Enter Email", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)){ Toast.makeText(MainActivity.this, "Enter Password", Toast.LENGTH_SHORT).show(); } else { LoginRegister(token,email,password); } } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } @Override protected void onStart() { super.onStart(); SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); boolean isLoggedIn = preferences.getBoolean("loggedIn",false); if (isLoggedIn){ Intent intent = new Intent(this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } private void LoginRegister(final String token, final String email, final String password) { class Login extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); progressBar.setVisibility(View.GONE); try { //converting response to json object JSONObject obj = new JSONObject(s); //if no error in response if (obj.getBoolean("error")) { Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); } else { SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("emailkey", email); editor.putBoolean("loggedIn", true); editor.apply(); Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } catch (JSONException e) { e.printStackTrace(); } } @Override protected String doInBackground(Void.. voids) { //creating request handler object RequestHandler requestHandler = new RequestHandler(); //creating request parameters HashMap<String, String> params = new HashMap<>(); params.put("email", email); params.put("password", password); params.put("token", token); //returing the response return requestHandler.sendPostRequest("//192.168.43.17/fcmphpmysql/api/index.php", params); } } Login ul = new Login(); ul.execute(); } }Jadi, hal baru apa yang telah kami tambahkan di file di atas? . kami juga mengirimkan <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>_2 parameter seperti email, kata sandi, dan token, yang akan disimpan dalam database menggunakan <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>1. Dalam metode <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>_4, kami mendapatkan respons dari server. Jika permintaan berhasil diproses, maka kami akan menyimpan detail pengguna saat ini di <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>5 dan membuka aktivitas profil baru. Jika Anda tidak mengetahui apa itu <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>_5, maka saya sarankan untuk melihat SharedPreferences di tutorial android, untuk mengetahuinya secara detail
Kami menggunakan metode override <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>_7, di mana kami telah membuat logika. Kami telah menyetel flag maksud yang akan mengirim pengguna ke ProfileActivity jika sudah masuk, melewati halaman masuk. Namun, Kami akan mengkodekan ProfileActivity nanti
Membangun mekanisme untuk menangani permintaan
Sebelum itu, mari kita buat kelas <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>8, yang kita gunakan pada kode di atas. Ini membantu untuk mengirim permintaan bersama dengan parameter POST. Dia kelasnya
package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }Di kelas di atas, Kami menggunakan kelas <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>_9, untuk membuat koneksi dan menggunakan HashMap untuk mengirim parameter <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>2 menggunakan key-value pair. Ini penting karena kami mengirimkan pemberitahuan push di android menggunakan php mysql
Catatan. Jika Anda baru menggunakan koneksi url dan mengirimkan parameter permintaan POST ke server, maka saya sarankan Anda untuk melihat Registrasi Masuk Android menggunakan tutorial PHP dan MySQL terlebih dahulu. Hal-hal ini dijelaskan secara rinci di sana
Sekarang, mari buat aktivitas kosong baru package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; static String SHARED_PREF_NAME = "net.softglobe.fcmphpmysql"; EditText emailtxt,passwordtxt; ProgressBar progressBar; String token,email,password; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emailtxt = findViewById(R.id.tv_email); passwordtxt = findViewById(R.id.password); progressBar = findViewById(R.id.progress); //Generating Token FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ token = task.getResult().getToken(); } else { Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show(); } } }); button = findViewById(R.id.submitbtn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { email = emailtxt.getText().toString(); password = passwordtxt.getText().toString(); if (TextUtils.isEmpty(email)){ Toast.makeText(MainActivity.this, "Enter Email", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)){ Toast.makeText(MainActivity.this, "Enter Password", Toast.LENGTH_SHORT).show(); } else { LoginRegister(token,email,password); } } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } @Override protected void onStart() { super.onStart(); SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); boolean isLoggedIn = preferences.getBoolean("loggedIn",false); if (isLoggedIn){ Intent intent = new Intent(this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } private void LoginRegister(final String token, final String email, final String password) { class Login extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); progressBar.setVisibility(View.GONE); try { //converting response to json object JSONObject obj = new JSONObject(s); //if no error in response if (obj.getBoolean("error")) { Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); } else { SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("emailkey", email); editor.putBoolean("loggedIn", true); editor.apply(); Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } catch (JSONException e) { e.printStackTrace(); } } @Override protected String doInBackground(Void.. voids) { //creating request handler object RequestHandler requestHandler = new RequestHandler(); //creating request parameters HashMap<String, String> params = new HashMap<>(); params.put("email", email); params.put("password", password); params.put("token", token); //returing the response return requestHandler.sendPostRequest("//192.168.43.17/fcmphpmysql/api/index.php", params); } } Login ul = new Login(); ul.execute(); } }1. Itu akan dibuka setelah pengguna mendaftar, atau pada login yang berhasil. Mari kode pertama package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; static String SHARED_PREF_NAME = "net.softglobe.fcmphpmysql"; EditText emailtxt,passwordtxt; ProgressBar progressBar; String token,email,password; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emailtxt = findViewById(R.id.tv_email); passwordtxt = findViewById(R.id.password); progressBar = findViewById(R.id.progress); //Generating Token FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ token = task.getResult().getToken(); } else { Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show(); } } }); button = findViewById(R.id.submitbtn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { email = emailtxt.getText().toString(); password = passwordtxt.getText().toString(); if (TextUtils.isEmpty(email)){ Toast.makeText(MainActivity.this, "Enter Email", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)){ Toast.makeText(MainActivity.this, "Enter Password", Toast.LENGTH_SHORT).show(); } else { LoginRegister(token,email,password); } } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } @Override protected void onStart() { super.onStart(); SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); boolean isLoggedIn = preferences.getBoolean("loggedIn",false); if (isLoggedIn){ Intent intent = new Intent(this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } private void LoginRegister(final String token, final String email, final String password) { class Login extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); progressBar.setVisibility(View.GONE); try { //converting response to json object JSONObject obj = new JSONObject(s); //if no error in response if (obj.getBoolean("error")) { Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); } else { SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("emailkey", email); editor.putBoolean("loggedIn", true); editor.apply(); Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } catch (JSONException e) { e.printStackTrace(); } } @Override protected String doInBackground(Void.. voids) { //creating request handler object RequestHandler requestHandler = new RequestHandler(); //creating request parameters HashMap<String, String> params = new HashMap<>(); params.put("email", email); params.put("password", password); params.put("token", token); //returing the response return requestHandler.sendPostRequest("//192.168.43.17/fcmphpmysql/api/index.php", params); } } Login ul = new Login(); ul.execute(); } }_2 seperti di bawah ini
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ProfileActivity" android:layout_margin="10sp" android:orientation="vertical"> <TextView android:id="@+id/welcome_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Welcome, " android:textSize="30sp" /> <Button android:id="@+id/logoutbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Logout" android:textAllCaps="false"/> </LinearLayout>Membuat halaman Profil
Sekarang, mari kodekan file java-nya package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; static String SHARED_PREF_NAME = "net.softglobe.fcmphpmysql"; EditText emailtxt,passwordtxt; ProgressBar progressBar; String token,email,password; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emailtxt = findViewById(R.id.tv_email); passwordtxt = findViewById(R.id.password); progressBar = findViewById(R.id.progress); //Generating Token FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ token = task.getResult().getToken(); } else { Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show(); } } }); button = findViewById(R.id.submitbtn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { email = emailtxt.getText().toString(); password = passwordtxt.getText().toString(); if (TextUtils.isEmpty(email)){ Toast.makeText(MainActivity.this, "Enter Email", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)){ Toast.makeText(MainActivity.this, "Enter Password", Toast.LENGTH_SHORT).show(); } else { LoginRegister(token,email,password); } } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } @Override protected void onStart() { super.onStart(); SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); boolean isLoggedIn = preferences.getBoolean("loggedIn",false); if (isLoggedIn){ Intent intent = new Intent(this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } private void LoginRegister(final String token, final String email, final String password) { class Login extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); progressBar.setVisibility(View.GONE); try { //converting response to json object JSONObject obj = new JSONObject(s); //if no error in response if (obj.getBoolean("error")) { Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); } else { SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("emailkey", email); editor.putBoolean("loggedIn", true); editor.apply(); Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } catch (JSONException e) { e.printStackTrace(); } } @Override protected String doInBackground(Void.. voids) { //creating request handler object RequestHandler requestHandler = new RequestHandler(); //creating request parameters HashMap<String, String> params = new HashMap<>(); params.put("email", email); params.put("password", password); params.put("token", token); //returing the response return requestHandler.sendPostRequest("//192.168.43.17/fcmphpmysql/api/index.php", params); } } Login ul = new Login(); ul.execute(); } }3dengan kode berikut di dalamnya
package net.softglobe.fcmphpmysql; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class ProfileActivity extends AppCompatActivity { TextView welcome; Button logout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); SharedPreferences preferences = getSharedPreferences(MainActivity.SHARED_PREF_NAME, MODE_PRIVATE); String email = preferences.getString("emailkey","NA"); welcome = findViewById(R.id.welcome_email); welcome.setText("Welcome, "+email); logout = findViewById(R.id.logoutbtn); logout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SharedPreferences preferences = getSharedPreferences(MainActivity.SHARED_PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.clear(); editor.apply(); Intent intent = new Intent(ProfileActivity.this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } }); } @Override protected void onStart() { super.onStart(); SharedPreferences preferences = getSharedPreferences(MainActivity.SHARED_PREF_NAME, MODE_PRIVATE); boolean isLoggedIn = preferences.getBoolean("loggedIn",false); if (!isLoggedIn){ Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } }Dalam file di atas, kami dengan mudah mengekstraksi email yang disimpan dari <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>5 dan menunjukkannya kepada pengguna. Selanjutnya, kami juga membuat tombol logout. Saat diklik, kami akan menghapus semua key-value pair di <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="FCM Tutorial" android:textSize="25sp" android:gravity="center_horizontal" android:textStyle="bold" android:layout_marginBottom="20sp"/> <EditText android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter email"/> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter password" android:inputType="textPassword"/> <Button android:id="@+id/submitbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login / Sign up" /> <ProgressBar android:id="@+id/progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:visibility="gone"/> </LinearLayout> </ScrollView>5 dan mengalihkan pengguna ke halaman login
Membangun Layanan untuk Menerima Notifikasi push
Di atas segalanya, karena kami menggunakan FCM untuk notifikasi, maka aplikasi kami harus memiliki beberapa layanan yang akan memicu acara notifikasi yang diterima dan menampilkan notifikasi. Jadi, untuk menyelesaikan tugas ini, buat kelas java baru package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; static String SHARED_PREF_NAME = "net.softglobe.fcmphpmysql"; EditText emailtxt,passwordtxt; ProgressBar progressBar; String token,email,password; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emailtxt = findViewById(R.id.tv_email); passwordtxt = findViewById(R.id.password); progressBar = findViewById(R.id.progress); //Generating Token FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ token = task.getResult().getToken(); } else { Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show(); } } }); button = findViewById(R.id.submitbtn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { email = emailtxt.getText().toString(); password = passwordtxt.getText().toString(); if (TextUtils.isEmpty(email)){ Toast.makeText(MainActivity.this, "Enter Email", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)){ Toast.makeText(MainActivity.this, "Enter Password", Toast.LENGTH_SHORT).show(); } else { LoginRegister(token,email,password); } } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } @Override protected void onStart() { super.onStart(); SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); boolean isLoggedIn = preferences.getBoolean("loggedIn",false); if (isLoggedIn){ Intent intent = new Intent(this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } private void LoginRegister(final String token, final String email, final String password) { class Login extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); progressBar.setVisibility(View.GONE); try { //converting response to json object JSONObject obj = new JSONObject(s); //if no error in response if (obj.getBoolean("error")) { Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); } else { SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("emailkey", email); editor.putBoolean("loggedIn", true); editor.apply(); Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } catch (JSONException e) { e.printStackTrace(); } } @Override protected String doInBackground(Void.. voids) { //creating request handler object RequestHandler requestHandler = new RequestHandler(); //creating request parameters HashMap<String, String> params = new HashMap<>(); params.put("email", email); params.put("password", password); params.put("token", token); //returing the response return requestHandler.sendPostRequest("//192.168.43.17/fcmphpmysql/api/index.php", params); } } Login ul = new Login(); ul.execute(); } }6 dan tempelkan kode berikut di dalamnya
//This method is a messaging service, which will be called when the application received the notification package net.softglobe.fcmphpmysql; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; public class MessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); if (remoteMessage.getNotification() != null){ String title = remoteMessage.getNotification().getTitle(); String text = remoteMessage.getNotification().getBody(); //calling method to display notification NotificationHelper.displayNotification(getApplicationContext(), title, text); } } }Perpanjangan di atas package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; static String SHARED_PREF_NAME = "net.softglobe.fcmphpmysql"; EditText emailtxt,passwordtxt; ProgressBar progressBar; String token,email,password; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emailtxt = findViewById(R.id.tv_email); passwordtxt = findViewById(R.id.password); progressBar = findViewById(R.id.progress); //Generating Token FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ token = task.getResult().getToken(); } else { Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show(); } } }); button = findViewById(R.id.submitbtn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { email = emailtxt.getText().toString(); password = passwordtxt.getText().toString(); if (TextUtils.isEmpty(email)){ Toast.makeText(MainActivity.this, "Enter Email", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)){ Toast.makeText(MainActivity.this, "Enter Password", Toast.LENGTH_SHORT).show(); } else { LoginRegister(token,email,password); } } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } @Override protected void onStart() { super.onStart(); SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); boolean isLoggedIn = preferences.getBoolean("loggedIn",false); if (isLoggedIn){ Intent intent = new Intent(this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } private void LoginRegister(final String token, final String email, final String password) { class Login extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); progressBar.setVisibility(View.GONE); try { //converting response to json object JSONObject obj = new JSONObject(s); //if no error in response if (obj.getBoolean("error")) { Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); } else { SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("emailkey", email); editor.putBoolean("loggedIn", true); editor.apply(); Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } catch (JSONException e) { e.printStackTrace(); } } @Override protected String doInBackground(Void.. voids) { //creating request handler object RequestHandler requestHandler = new RequestHandler(); //creating request parameters HashMap<String, String> params = new HashMap<>(); params.put("email", email); params.put("password", password); params.put("token", token); //returing the response return requestHandler.sendPostRequest("//192.168.43.17/fcmphpmysql/api/index.php", params); } } Login ul = new Login(); ul.execute(); } }_7. Kami harus menangani acara pesan yang diterima. Oleh karena itu, Kami mengganti metode ________18______8. Selanjutnya, kami mendapatkan detail judul dan isi pesan. Dengan detail ini, kami memanggil metode package net.softglobe.fcmphpmysql; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.InstanceIdResult; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; public class MainActivity extends AppCompatActivity { static final String CHANNEL_ID = "technopoints_id"; static final String CHANNEL_NAME = "technopoints name"; static final String CHANNEL_DESC = "technopoints desc"; static String SHARED_PREF_NAME = "net.softglobe.fcmphpmysql"; EditText emailtxt,passwordtxt; ProgressBar progressBar; String token,email,password; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); emailtxt = findViewById(R.id.tv_email); passwordtxt = findViewById(R.id.password); progressBar = findViewById(R.id.progress); //Generating Token FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (task.isSuccessful()){ token = task.getResult().getToken(); } else { Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show(); } } }); button = findViewById(R.id.submitbtn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { email = emailtxt.getText().toString(); password = passwordtxt.getText().toString(); if (TextUtils.isEmpty(email)){ Toast.makeText(MainActivity.this, "Enter Email", Toast.LENGTH_SHORT).show(); } else if (TextUtils.isEmpty(password)){ Toast.makeText(MainActivity.this, "Enter Password", Toast.LENGTH_SHORT).show(); } else { LoginRegister(token,email,password); } } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(CHANNEL_DESC); NotificationManager manager = getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } @Override protected void onStart() { super.onStart(); SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); boolean isLoggedIn = preferences.getBoolean("loggedIn",false); if (isLoggedIn){ Intent intent = new Intent(this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } private void LoginRegister(final String token, final String email, final String password) { class Login extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); progressBar.setVisibility(View.GONE); try { //converting response to json object JSONObject obj = new JSONObject(s); //if no error in response if (obj.getBoolean("error")) { Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); } else { SharedPreferences preferences = getSharedPreferences(SHARED_PREF_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("emailkey", email); editor.putBoolean("loggedIn", true); editor.apply(); Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(MainActivity.this, ProfileActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } } catch (JSONException e) { e.printStackTrace(); } } @Override protected String doInBackground(Void.. voids) { //creating request handler object RequestHandler requestHandler = new RequestHandler(); //creating request parameters HashMap<String, String> params = new HashMap<>(); params.put("email", email); params.put("password", password); params.put("token", token); //returing the response return requestHandler.sendPostRequest("//192.168.43.17/fcmphpmysql/api/index.php", params); } } Login ul = new Login(); ul.execute(); } }9 dari kelas package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }0, yang akan menampilkan notifikasi
Sekarang, kita tinggal melakukan langkah terakhir untuk modul android. Buka package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }1 dan Tempel kode di bawah tepat sebelum penutupan tag package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }2
<service android:name=".MessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>Di atas adalah layanan FCM yang melacak pesan yang diterima dari server cloud Firebase. Juga, tambahkan izin Internet di dalamnya, karena kita memerlukan akses internet
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>0Jadi, keseluruhan package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }_1 akan terlihat seperti berikut
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>_1Itu saja untuk aplikasi android. Sekarang, kita akan bergerak menuju modul sisi server. Ini sederhana, dan cepat. Pastikan Anda memiliki setidaknya pengetahuan dasar tentang PHP dan MySQL sebelum melangkah lebih jauh. Jika Anda merasa perlu mempelajari PHP, maka Anda dapat mengunjungi kategori tutorial PHP
2. Modul Server (PHP MySQL).
Kedua, Menyiapkan hal-hal sisi server agar aplikasi kami bekerja dengan cepat dan mengirim pemberitahuan push di android menggunakan php mysql
Menyiapkan basis data
Di sini, kita harus menunjukkan notifikasi kepada pengguna yang dituju. Jadi, untuk mengidentifikasi pengguna unik, kami akan membuat akun pengguna untuk mengimplementasikan pengiriman notifikasi ke pengguna unik. Jadi, buat database dengan nama apa pun pilihan Anda. Selanjutnya, mari buat tabel baru di dalamnya yang memiliki bidang seperti id, email, kata sandi, token. Anda dapat menggunakan kueri berikut untuk membuat tabel
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>_2Sekarang, kita akan bergerak menuju bagian api. Untuk itu, kita harus membuat file PHP yang akan login atau mendaftar pengguna dan menyimpan detailnya bersama dengan token yang dihasilkan. Selanjutnya, Kami akan menggunakan token tersebut untuk mengidentifikasi perangkat secara unik dan mengirimkan pemberitahuan ke perangkat tersebut
Membuat API PHP
Untuk mengirim notifikasi push di android menggunakan php mysql, kita harus membuat api PHP. Jadi buat folder fcmphpmysql di wamp jika Anda menggunakan Wampserver atau buat di htdocs, jika Anda menggunakan Xamppserver. Pertama-tama, buat file package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }_4 di dalamnya sebagai berikut, untuk koneksi dengan database
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>_3Sekali lagi buat folder baru di dalamnya, beri nama 'api'. Buat file package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }_5 di dalamnya. Masukkan kode berikut di dalamnya
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>_4File di atas akan menerima parameter POST yang dikirim oleh aplikasi. Parameter yang dibutuhkan adalah email, password dan token. Kode di atas akan mendaftarkan pengguna baru dan jika pengguna sudah ada, pengguna akan login. Saat mendaftar, token FCM akan disimpan di database dan akan terus diperbarui dengan setiap login. Ini akan mengirimkan respons package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }_6 yang sesuai ke aplikasi
Mengirim Permintaan ke Server FCM
Sekarang, kita selesai dengan pengaturan api. Untuk mengirim push notification di android menggunakan php mysql, kita harus mengirimkan permintaan server ke FCM. Jadi, kita hanya perlu membuat file terakhir dari tutorial ini yaitu, package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }7 di folder fcmphpmysql yang telah kita buat sebelumnya. Rekatkan kode berikut di dalamnya
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="//schemas.android.com/apk/res/android" xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tokentxt" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Token will be displayed here" android:textSize="20sp"/> </LinearLayout> </ScrollView>5Mari kita pahami apa yang kita lakukan di kelas atas. Bidang HTML di atas merancang formulir yang memiliki tiga bidang. Yang pertama adalah menu untuk memilih email pengguna, yang telah kami daftarkan melalui satu atau lebih perangkat. Kode PHP akan mengambil semua email dan menampilkan daftar secara dinamis. Bidang kedua dan ketiga masing-masing adalah judul dan badan pemberitahuan. Setelah menyerahkan formulir. kami mengambil token yang relevan dengan alamat email yang dipilih. Kami telah membuat fungsi package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }_8 yang menggunakan tiga parameter sebagai token, judul, dan pesan. Di dalamnya, kami membuat array variabel untuk mengirimkannya ke server Firebase
Kami menggunakan permintaan curl untuk tujuan itu. Dengan demikian, permintaan kami dengan parameter yang relevan akan dikirim ke server Firebase dan fungsi tersebut akan mengembalikan respons server sebagai objek package net.softglobe.fcmphpmysql; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.net.ssl.HttpsURLConnection; import static android.content.ContentValues.TAG; public class RequestHandler { //this method will send a post request to the specified url //in this app we are using only post request //in the hashmap we have the data to be sent to the server in keyvalue pairs public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) { URL url; Log.i("Received URL: ",requestURL); StringBuilder sb = new StringBuilder(); try { url = new URL(requestURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(15000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); OutputStream os = conn.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); writer.write(getPostDataString(postDataParams)); writer.flush(); writer.close(); os.close(); int responseCode = conn.getResponseCode(); if (responseCode == HttpsURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); sb = new StringBuilder(); String response; while ((response = br.readLine()) != null) { sb.append(response); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } //this method is converting keyvalue pairs data into a query string as needed to send to the server private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException { StringBuilder result = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> entry : params.entrySet()) { if (first) first = false; else result.append("&"); result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); result.append("="); result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } Log.i("post parameters: ",""+result.toString()); return result.toString(); } }6. Terakhir, Kami menampilkan pesan sukses atau gagal yang relevan kepada pengguna
Mengirim push notification di android menggunakan php mysql
Itu dia. Akhirnya, Kami telah selesai dengan proyek kami. Sekarang mari kita coba jalankan aplikasinya. Lihat layar di bawah ini untuk pengiriman notifikasi yang berhasil
Demikian Lihat push notification di android menggunakan php mysql sebagai berikut
Selamat. Anda telah membuatnya menjadi mungkin. Mari bertepuk tangan untuk dirimu sendiri. 🙂
Catatan. Jika Anda menjalankan aplikasi di emulator android dan tidak mendapatkan notifikasi, coba jalankan di perangkat nyata. Ini mungkin terjadi karena versi Layanan Google Play yang sudah usang diinstal pada emulator. Umumnya, kami tidak memperbarui layanan play pada emulator dan kami menggunakan versi yang lebih baru dalam pengembangan proyek. Jadi, ini mungkin menyebabkan masalah
Jika Anda memiliki pertanyaan tentang tutorial, tanyakan di bagian komentar di bawah. Saya, sebagai teman Anda yang membantu akan mencoba menyelesaikan semua masalah Anda. 🙂 Sebagai alternatif, Anda selalu dapat mengunduh kode sumber secara gratis dari tautan di bawah ini