Tutorial: Mengirim pemberitahuan push ke perangkat Android menggunakan Azure Notification Hubs dan Google Cloud Messaging (tidak digunakan lagi)

Peringatan

Mulai 10 April 2018, Google telah menghentikan Google Cloud Messaging (GCM). Server GCM dan API klien sudah tidak digunakan lagi dan akan segera dihapus setelah 29 Mei 2019. Selengkapnya, lihatPertanyaan yang Sering Diajukan untuk GCM dan FCM.

Gambaran Umum

Tutorial ini menunjukkan cara menggunakan Azure Notification Hubs untuk mengirim pemberitahuan push ke aplikasi Android. Anda membuat aplikasi Android kosong yang menerima pemberitahuan push menggunakan Google Cloud Messaging (GCM).

Penting

Google Cloud Messaging (GCM) telah dihentikan dan akan segera dihapus.

Penting

Topik ini menunjukkan pemberitahuan push dengan Google Cloud Messaging (GCM). Jika Anda menggunakan Firebase Cloud Messaging (FCM) dari Google, lihat Mengirim pemberitahuan push ke Android dengan Azure Notification Hubs dan FCM.

Kode lengkap untuk tutorial ini dapat diunduh dari GitHub di sini.

Dalam tutorial ini, Anda akan melakukan tindakan berikut:

  • Membuat proyek yang mendukung Google Cloud Messaging.
  • Membuat hub pemberitahuan
  • Menyambungkan aplikasi Anda ke hub pemberitahuan
  • Menguji aplikasi

Prasyarat

Membuat proyek yang mendukung Google Cloud Messaging

  1. Navigasikan ke Konsol Cloud Google, masuk dengan info masuk akun Google Anda.

  2. Pilih Buat Proyek pada toolbar.

    Create new project

  3. Untuk Nama proyek, masukkan nama untuk proyek Anda, dan klik Buat.

  4. Pilih tombol pemberitahuan pada toolbar, dan pilih proyek Anda dalam daftar. Anda melihat dasbor untuk proyek Anda. Anda juga dapat menavigasikan langsung ke dasbor dengan menggunakan URL: https://console.developers.google.com/home/dashboard?project=<YOUR PROJECT NAME>

    Select your project in alerts

  5. Catat Nomor proyek dalam petak peta Info proyek di dasbor.

    Project ID

  6. Di dasbor, pada petak peta API, pilih Buka gambaran umum API.

    API overview link

  7. Pada halaman API, pilih AKTIFKAN API DAN LAYANAN.

    Enable APIs and Services button

  8. Cari dan pilih Google Cloud Messaging.

    Search for and select Google Cloud Messaging

  9. Untuk mengaktifkan Google Cloud Messaging untuk project, pilih AKTIFKAN.

    Enable Google Cloud Messaging

  10. Pilih Buat info masuk pada toolbar.

    Create credentials button

  11. Pada halaman Tambahkan info masuk ke proyek Anda, pilih tautan Kunci API.

    Add credentials

  12. Pada halaman Kunci API, pilih Buat/Simpan. Dalam contoh berikut, opsi Alamat IP dipilih, dan 0.0.0.0/0 dimasukkan sebagai alamat IP yang diizinkan. Anda harus membatasi kunci API dengan tepat.

    API Key - Create button

  13. Salin Kunci API ke clipboard, dan simpan di suatu tempat.

    Copy API key

    Anda akan menggunakan nilai kunci API ini untuk memungkinkan Azure mengautentikasi dengan Google Cloud Messaging dan mengirim pemberitahuan push atas nama aplikasi Anda. Untuk menavigasikan kembali ke dasbor proyek, gunakan URL: https://console.developers.google.com/home/dashboard?project=<YOUR PROJECT NAME>

Membuat hub pemberitahuan

  1. Masuk ke portal Azure.

  2. Pilih Semua layanan di menu sebelah kiri, lalu pilih Notification Hubs di bagian Seluler. Pilih ikon bintang di samping nama layanan untuk menambahkan layanan ke bagian FAVORITE di menu sebelah kiri. Setelah Anda menambahkan Notification Hubs ke FAVORIT, pilih di menu sebelah kiri.

    Azure portal - select Notification Hubs

  3. Pada halaman Notification Hubs, pilih Tambahkan pada toolbar.

    Notification Hubs - Add toolbar button

  4. Pada tab Dasar di halaman Notification Hub, lakukan langkah berikut ini:

    1. Di Langganan, pilih nama langganan Azure yang ingin Anda gunakan, lalu pilih grup sumber daya yang sudah ada, atau buat yang baru.

    2. Masukkan nama unik untuk namespace baru di Detail Namespace.

    3. Namespace berisi satu atau beberapa hub pemberitahuan, jadi ketikkan nama untuk hub di Detail Hub Pemberitahuan. Atau, pilih namespace yang sudah ada dari drop-down.

    4. Pilih nilai dari kotak daftar drop-down Lokasi. Nilai ini menentukan lokasi tempat Anda ingin membuat hub.

    5. Pilih Buat.

      Azure portal - set notification hub properties

  5. Pilih Pemberitahuan (ikon bel), lalu pilih Buka sumber daya. Anda juga dapat me-refresh daftar di halaman Notification Hubs dan memilih hub Anda.

    Azure portal - go to resource

  6. Pilih Kebijakan Akses dari daftar. Perhatikan bahwa dua string koneksi tersedia untuk Anda. Anda akan membutuhkannya nanti untuk menangani pemberitahuan push.

    Penting

    Jangan gunakan kebijakan DefaultFullSharedAccessSignature di aplikasi Anda. Kebijakan ini dimaksudkan untuk digunakan di ujung belakang Anda saja.

    Azure portal - notification hub connection strings

Mengonfigurasi pengaturan GCM untuk hub pemberitahuan

  1. Pilih Google (GCM) di PENGATURAN PEMBERITAHUAN.

  2. Masukkan Kunci API yang Anda dapatkan dari Google Cloud Console.

  3. Pilih Simpan pada toolbar.

    Azure Notification Hubs - Google (GCM)

Hub pemberitahuan Anda sekarang terkonfigurasi untuk berfungsi dengan GCM, dan Anda memiliki string koneksi untuk mendaftarkan aplikasi Anda untuk menerima dan mengirim pemberitahuan push.

Menyambungkan aplikasi Anda ke hub pemberitahuan

Membuat proyek Android baru

  1. Buka Android Studio, dan mulai proyek Android Studio baru.

    Android Studio - new project

  2. Pilih bentuk dan ukuran Telepon dan Tablet dan SDK Minimum yang ingin Anda dukung. Lalu, klik Berikutnya.

    Android Studio - project creation workflow

  3. Pilih Aktivitas Kosong untuk aktivitas utama, klik Berikutnya, lalu klik Selesai.

Menambahkan layanan Google Play ke proyek

  1. Di Android Studio, pilih Alat dari menu, lalu pilih Manajer SDK.

  2. Pilih versi target Android SDK yang digunakan dalam proyek Anda. Lalu pilih Tampilkan Detail Paket.

    Android SDK Manager - select target version

  3. Pilih Google API, jika belum diinstal.

    Android SDK Manager - Google APIs selected

  4. Beralih ke tab Alat SDK. Jika Anda belum menginstal Google Play Services, pilih Google Play Services seperti yang ditunjukkan dalam gambar berikut. Lalu pilih Terapkan untuk menginstal. Perhatikan jalur SDK karena jalur ini akan digunakan di langkah selanjutnya.

    Android SDK Manager - Google Play Services selected

  5. Jika Anda melihat kotak dialog Konfirmasi Perubahan, pilih OK. Penginstal Komponen akan menginstal komponen yang diminta. Pilih Selesai setelah komponen diinstal.

  6. Pilih OK untuk menutup kotak dialog Pengaturan untuk Proyek Baru.

  7. Buka file build.gradle di direktori aplikasi, lalu tambahkan baris berikut di bawah dependencies.

    implementation 'com.google.android.gms:play-services-gcm:16.0.0'
    
  8. Pilih ikon Sinkronkan Sekarang di toolbar.

    Sync with Gradle

  9. Buka file AndroidManifest.xml, lalu tambahkan tag berikut ke tag aplikasi.

    <meta-data android:name="com.google.android.gms.version"
         android:value="@integer/google_play_services_version" />
    

Menambahkan pustaka Azure Notification Hubs

  1. Di file Build.Gradle untukaplikasi, tambahkan baris berikut di bagiandependensi.

    implementation 'com.microsoft.azure:notification-hubs-android-sdk:0.6@aar'
    implementation 'com.microsoft.azure:azure-notifications-handler:1.0.1@aar'
    
  2. Tambahkan repositori berikut setelah bagian dependensi.

    repositories {
        maven {
            url "https://dl.bintray.com/microsoftazuremobile/SDK"
        }
    }
    

Memperbarui proyek AndroidManifest.xml

  1. Untuk mendukung GCM, terapkan layanan pendengar ID Instans dalam kode yang digunakan untuk mendapatkan token pendaftaran menggunakan API ID Instans Google. Dalam tutorial ini, nama kelasnya adalah MyInstanceIDService.

    Tambahkan definisi layanan berikut ke file AndroidManifest.xml, di dalam tag <application>. Ganti tempat penampung <your package> dengan nama paket aktual Anda yang ditampilkan di bagian atas file AndroidManifest.xml.

    <service android:name="<your package>.MyInstanceIDService" android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.gms.iid.InstanceID"/>
        </intent-filter>
    </service>
    
  2. Setelah aplikasi menerima token pendaftaran GCM dari Instans API ID, aplikasi menggunakan token untuk mendaftar ke Azure Notification Hub. Pendaftaran di latar belakang dilakukan menggunakan IntentService bernama RegistrationIntentService. Layanan ini bertanggung jawab untuk memulihkan token pendaftaran GCM.

    Tambahkan definisi layanan berikut ke file AndroidManifest.xml, di dalam tag <application>. Ganti tempat penampung <your package> dengan nama paket aktual Anda yang ditampilkan di bagian atas file AndroidManifest.xml.

    <service
        android:name="<your package>.RegistrationIntentService"
        android:exported="false">
    </service>
    
  3. Menentukan penerima untuk menerima pemberitahuan. Tambahkan definisi penerima berikut ke file AndroidManifest.xml, di dalam tag <application>. Ganti tempat penampung <your package> dengan nama paket aktual Anda yang ditampilkan di bagian atas file AndroidManifest.xml.

    <receiver android:name="com.microsoft.windowsazure.notifications.NotificationsBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="<your package name>" />
        </intent-filter>
    </receiver>
    
  4. Tambahkan izin terkait GCM yang diperlukan berikut ini di bawah <application> tag. Ganti <your package> dengan nama paket yang ditampilkan di bagian atas file AndroidManifest.xml.

    Untuk informasi selengkapnya tentang izin ini, lihat Menyiapkan aplikasi Klien GCM untuk Android.

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    
    <permission android:name="<your package>.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="<your package>.permission.C2D_MESSAGE"/>
    

Menambahkan kode

  1. Di Tampilan Proyek, perluasapp>src>main>java. Klik kanan folder paket Anda di bawah java, pilih Baru, lalu pilih Kelas Java. Tambahkan kelas baru bernama NotificationSettings.

    Android Studio - new Java class

    Perbarui ketiga tempat penampung ini dalam kode berikut untuk kelas NotificationSettings:

    • SenderId: Nomor proyek yang Anda peroleh sebelumnya di Google Cloud Console.

    • HubListenConnectionString: String koneksiDefaultListenAccessSignature untuk hub Anda. Anda bisa menyalin string koneksi tersebut dengan mengeklik Kebijakan Akses pada halaman Pengaturan hub Anda di portal Microsoft Azure.

    • HubName: Gunakan nama hub pemberitahuan Anda yang muncul di halaman hub di portal Microsoft Azure.

      NotificationSettings kode:

      public class NotificationSettings {
         public static String SenderId = "<Your project number>";
         public static String HubName = "<Your HubName>";
         public static String HubListenConnectionString = "<Your default listen connection string>";
      }
      
  2. Tambahkan kelas baru lainnya yang bernama MyInstanceIDService. Kelas ini adalah penerapan layanan Instans pendengar ID.

    Kode untuk kelas ini memanggil IntentService untuk memulihkan token GCM di latar belakang.

    import android.content.Intent;
    import android.util.Log;
    import com.google.android.gms.iid.InstanceIDListenerService;
    
    public class MyInstanceIDService extends InstanceIDListenerService {
    
        private static final String TAG = "MyInstanceIDService";
    
        @Override
        public void onTokenRefresh() {
    
            Log.i(TAG, "Refreshing GCM Registration Token");
    
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }
    };
    
  3. Tambahkan kelas baru lainnya ke proyek Anda yang bernama RegistrationIntentService. Kelas ini menerapkan IntentService yang menangani pemulihan token GCM dan pendaftaran ke hub pemberitahuan.

    Gunakan kode berikut untuk kelas ini.

    import android.app.IntentService;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.preference.PreferenceManager;
    import android.util.Log;
    
    import com.google.android.gms.gcm.GoogleCloudMessaging;
    import com.google.android.gms.iid.InstanceID;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    
    public class RegistrationIntentService extends IntentService {
    
        private static final String TAG = "RegIntentService";
    
        private NotificationHub hub;
    
        public RegistrationIntentService() {
            super(TAG);
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            String resultString = null;
            String regID = null;
    
            try {
                InstanceID instanceID = InstanceID.getInstance(this);
                String token = instanceID.getToken(NotificationSettings.SenderId,
                        GoogleCloudMessaging.INSTANCE_ID_SCOPE);
                Log.i(TAG, "Got GCM Registration Token: " + token);
    
                // Storing the registration id that indicates whether the generated token has been
                // sent to your server. If it is not stored, send the token to your server,
                // otherwise your server should have already received the token.
                if ((regID=sharedPreferences.getString("registrationID", null)) == null) {
                    NotificationHub hub = new NotificationHub(NotificationSettings.HubName,
                            NotificationSettings.HubListenConnectionString, this);
                    Log.i(TAG, "Attempting to register with NH using token : " + token);
    
                    regID = hub.register(token).getRegistrationId();
    
                    // If you want to use tags...
                    // Refer to : https://azure.microsoft.com/documentation/articles/notification-hubs-routing-tag-expressions/
                    // regID = hub.register(token, "tag1", "tag2").getRegistrationId();
    
                    resultString = "Registered Successfully - RegId : " + regID;
                    Log.i(TAG, resultString);
                    sharedPreferences.edit().putString("registrationID", regID ).apply();
                } else {
                    resultString = "Previously Registered Successfully - RegId : " + regID;
                }
            } catch (Exception e) {
                Log.e(TAG, resultString="Failed to complete token refresh", e);
                // If an exception happens while fetching the new token or updating the registration data
                // on a third-party server, this ensures that we'll attempt the update at a later time.
            }
    
            // Notify UI that registration has completed.
            if (MainActivity.isVisible) {
                MainActivity.mainActivity.ToastNotify(resultString);
            }
        }
    }
    
  4. Di kelas MainActivity Anda, tambahkan pernyataan import berikut di awal kelas.

    import com.google.android.gms.common.ConnectionResult;
    import com.google.android.gms.common.GoogleApiAvailability;
    import com.google.android.gms.gcm.*;
    import com.microsoft.windowsazure.notifications.NotificationsManager;
    import android.util.Log;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.content.Intent;
    
  5. Tambahkan anggota privat berikut di bagian atas kelas. Kode ini memeriksa ketersediaan Google Play Services seperti yang direkomendasikan oleh Google.

    public static MainActivity mainActivity;
    public static Boolean isVisible = false;
    private GoogleCloudMessaging gcm;
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    private static final String TAG = "MainActivity";
    
  6. Di kelas MainActivity Anda, tambahkan metode berikut ke ketersediaan Google Play Services.

    /**
        * Check the device to make sure it has the Google Play Services APK. If
        * it doesn't, display a dialog that allows users to download the APK from
        * the Google Play Store or enable it in the device's system settings.
        */
    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                Log.i(TAG, "This device is not supported by Google Play Services.");
                ToastNotify("This device is not supported by Google Play Services.");
                finish();
            }
            return false;
        }
        return true;
    }
    
  7. Di kelas MainActivity Anda, tambahkan kode berikut yang memeriksa Google Play Services sebelum memanggil IntentService untuk mendapatkan token pendaftaran GCM Anda dan mendaftar ke hub pemberitahuan Anda.

    public void registerWithNotificationHubs()
    {
        Log.i(TAG, " Registering with Notification Hubs");
    
        if (checkPlayServices()) {
            // Start IntentService to register this application with GCM.
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }
    }
    
  8. Dalam metode OnCreatedari kelas MainActivity, tambahkan kode berikut untuk memulai proses pendaftaran saat aktivitas dibuat.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mainActivity = this;
        NotificationsManager.handleNotifications(this, NotificationSettings.SenderId, MyHandler.class);
        registerWithNotificationHubs();
    }
    
  9. Tambahkan metode tambahan ini ke MainActivity untuk memverifikasi status aplikasi dan melaporkan status di aplikasi Anda.

    @Override
    protected void onStart() {
        super.onStart();
        isVisible = true;
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        isVisible = false;
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        isVisible = true;
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        isVisible = false;
    }
    
    public void ToastNotify(final String notificationMessage) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, notificationMessage, Toast.LENGTH_LONG).show();
                TextView helloText = (TextView) findViewById(R.id.text_hello);
                helloText.setText(notificationMessage);
            }
        });
    }
    
  10. Metode ToastNotify ini menggunakan kontrol "Halo Dunia"TextView untuk melaporkan status dan pemberitahuan secara terus-menerus di aplikasi. Dalam tata letak activity_main.xml Anda, tambahkan ID berikut untuk kontrol tersebut.

    android:id="@+id/text_hello"
    
  11. Tambahkan subkelas untuk penerima yang Anda tetapkan di AndroidManifest.xml. Tambahkan kelas baru lainnya ke proyek Anda yang bernama MyHandler.

  12. Tambahkan pernyataan impor berikut di bagian atas MyHandler.java:

    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.NotificationCompat;
    import com.microsoft.windowsazure.notifications.NotificationsHandler;
    import android.net.Uri;
    import android.media.RingtoneManager;
    
  13. Tambahkan kode berikut untuk kelas MyHandler, yang menjadikannya subkelas dari com.microsoft.windowsazure.notifications.NotificationsHandler.

    Kode ini mengambil alih metode OnReceive, sehingga penghandel yang melaporkan pemberitahuan yang diterima. Selain itu, penghandel mengirimkan pemberitahuan push ke manajer pemberitahuan Android menggunakan metode sendNotification() tersebut. Metode sendNotification() ini harus dijalankan ketika aplikasi sedang tidak berjalan dan pemberitahuan telah diterima.

    public class MyHandler extends NotificationsHandler {
        public static final int NOTIFICATION_ID = 1;
        private NotificationManager mNotificationManager;
        NotificationCompat.Builder builder;
        Context ctx;
    
        @Override
        public void onReceive(Context context, Bundle bundle) {
            ctx = context;
            String nhMessage = bundle.getString("message");
            sendNotification(nhMessage);
            if (MainActivity.isVisible) {
                MainActivity.mainActivity.ToastNotify(nhMessage);
            }
        }
    
        private void sendNotification(String msg) {
    
            Intent intent = new Intent(ctx, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
            mNotificationManager = (NotificationManager)
                    ctx.getSystemService(Context.NOTIFICATION_SERVICE);
    
            PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0,
                    intent, PendingIntent.FLAG_ONE_SHOT);
    
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(ctx)
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setContentTitle("Notification Hub Demo")
                            .setStyle(new NotificationCompat.BigTextStyle()
                                    .bigText(msg))
                            .setSound(defaultSoundUri)
                            .setContentText(msg);
    
            mBuilder.setContentIntent(contentIntent);
            mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
        }
    }
    
  14. Di Android Studio pada bilah menu, klik Build>Rebuild Project untuk memastikan tidak ada kesalahan di kode Anda.

Menguji aplikasi Anda

Jalankan aplikasi ponsel

  1. Jalankan aplikasi dan perhatikan bahwa ID pendaftaran dilaporkan untuk pendaftaran yang sukses.

    Testing on Android - Channel registration

  2. Masukkan pesan pemberitahuan yang akan dikirim ke semua perangkat Android yang telah terdaftar di hub.

    Testing on Android - sending a message

  3. Tekan Kirim Pemberitahuan. Perangkat apa pun yang menjalankan aplikasi akan menampilkan AlertDialog instans dengan pesan pemberitahuan push. Perangkat yang sedang tidak menjalankan aplikasi tetapi sebelumnya terdaftar untuk pemberitahuan push menerima pemberitahuan di Manajer Pemberitahuan Android. Pesan pemberitahuan dapat dilihat dengan menggeser ke bawah dari sudut kiri atas.

    Testing on Android - notifications

Menguji kirim pemberitahuan push dari portal Microsoft Azure

Anda dapat menguji penerimaan pemberitahuan push di aplikasi Anda dengan mengirimkannya melalui portal Microsoft Azure.

  1. Di bagian Pemecahan Masalah, pilih Uji Kirim.

  2. Untuk Platform, pilih Android.

  3. Pilih Kirim untuk mengirim uji pemberitahuan.

  4. Pastikan Anda melihat pesan pemberitahuan di perangkat Android.

    Azure Notification Hubs - Test Send

Pemberitahuan push biasanya dikirim dalam layanan ujung belakang seperti Mobile Apps atau ASP.NET menggunakan pustaka yang kompatibel. Jika pustaka tidak tersedia untuk ujung belakang, Anda juga dapat menggunakan REST API secara langsung untuk mengirim pesan pemberitahuan.

Berikut ini adalah daftar beberapa tutorial lain yang mungkin ingin Anda lihat untuk mengirim pemberitahuan:

Pemberitahuan push di emulator

Sebelum menguji pemberitahuan push di dalam emulator, pastikan gambar emulator Anda mendukung level Google API yang Anda pilih untuk aplikasi. Jika gambar tidak mendukung Google API asli, Anda mungkin mendapatkan pengecualian SERVICE_NOT_AVAILABLE (LAYANAN TIDAK TERSEDIA).

Pastikan juga Anda telah menambahkan akun Google Anda ke emulator yang sedang berjalan di bawahAkun>Pengaturan. Jika tidak, upaya Anda untuk mendaftar di GCM dapat mengakibatkan pengecualian AUTHENTICATION_FAILED (AUTENTIKASI GAGAL).

(Opsional) Mengirim pemberitahuan push langsung dari aplikasi

Biasanya, Anda akan mengirim pemberitahuan menggunakan server backend. Untuk beberapa kasus, Anda mungkin ingin bisa mengirim pemberitahuan push langsung dari aplikasi klien. Bagian ini menjelaskan cara mengirim pemberitahuan dari klien menggunakan Azure Notification Hub REST API.

  1. Di Tampilan Proyek Android Studio, perluas tata letak>App>scr>main>res. Buka file tata letak activity_main.xml dan klik tab Teks untuk memperbarui konten teks file. Perbarui dengan kode di bawah ini, yang menambahkan kontrol baru Button dan EditText untuk mengirim pesan pemberitahuan push ke hub pemberitahuan. Tambahkan kode ini di bagian bawah, tepat sebelum </RelativeLayout>.

    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/send_button"
    android:id="@+id/sendbutton"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:onClick="sendNotificationButtonOnClick" />
    
    <EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/editTextNotificationMessage"
    android:layout_above="@+id/sendbutton"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="42dp"
    android:hint="@string/notification_message_hint" />
    
  2. Di Tampilan Proyek Android Studio, perluas nilai>App>scr>main>res. Buka file strings.xml dan tambahkan nilai string yang direferensikan oleh kontrol baru Button dan EditText. Tambahkan baris berikut di bagian bawah file, tepat sebelum</resources>.

    <string name="send_button">Send Notification</string>
    <string name="notification_message_hint">Enter notification message text</string>
    
  3. Di file NotificationSetting.java Anda, tambahkan pengaturan berikut ke kelas NotificationSettings.

    Perbarui HubFullAccess dengan string koneksi DefaultFullSharedAccessSignature untuk hub Anda. String koneksi ini dapat disalin dari portal Microsoft Azure dengan mengeklik Kebijakan Akses di halaman Pengaturan hub pemberitahuan Anda.

    public static String HubFullAccess = "<Enter Your DefaultFullSharedAccess Connection string>";
    
  4. Pada file MainActivity.java Anda, tambahkan pernyataan import berikut di awal file.

    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import android.util.Base64;
    import android.view.View;
    import android.widget.EditText;
    
  5. Di file MainActivity.java Anda, tambahkan anggota berikut di bagian atas kelasMainActivity.

    private String HubEndpoint = null;
    private String HubSasKeyName = null;
    private String HubSasKeyValue = null;
    
  6. Membuat token Tanda Tangan Akses Bersama (Shared Access Signature/SaS) untuk mengautentikasi permintaan POST untuk mengirim pesan ke hub pemberitahuan Anda. Pilah data kunci dari string koneksi lalu buat token SaS, seperti yang disebutkan dalam referensi Konsep Umumdari REST API. Kode berikut adalah contoh penerapan.

    Dalam MainActivity.java, tambahkan metode berikut ke kelas MainActivity untuk memilah string koneksi Anda.

    /**
        * Example code from https://msdn.microsoft.com/library/azure/dn495627.aspx
        * to parse the connection string so a SaS authentication token can be
        * constructed.
        *
        * @param connectionString This must be the DefaultFullSharedAccess connection
        *                         string for this example.
        */
    private void ParseConnectionString(String connectionString)
    {
        String[] parts = connectionString.split(";");
        if (parts.length != 3)
            throw new RuntimeException("Error parsing connection string: "
                    + connectionString);
    
        for (int i = 0; i < parts.length; i++) {
            if (parts[i].startsWith("Endpoint")) {
                this.HubEndpoint = "https" + parts[i].substring(11);
            } else if (parts[i].startsWith("SharedAccessKeyName")) {
                this.HubSasKeyName = parts[i].substring(20);
            } else if (parts[i].startsWith("SharedAccessKey")) {
                this.HubSasKeyValue = parts[i].substring(16);
            }
        }
    }
    
  7. Dalam MainActivity.java, tambahkan metode berikut ke kelas MainActivity untuk membuat token autentikasi SaS.

    /**
        * Example code from https://msdn.microsoft.com/library/azure/dn495627.aspx to
        * construct a SaS token from the access key to authenticate a request.
        *
        * @param uri The unencoded resource URI string for this operation. The resource
        *            URI is the full URI of the Service Bus resource to which access is
        *            claimed. For example,
        *            "http://<namespace>.servicebus.windows.net/<hubName>"
        */
    private String generateSasToken(String uri) {
    
        String targetUri;
        String token = null;
        try {
            targetUri = URLEncoder
                    .encode(uri.toString().toLowerCase(), "UTF-8")
                    .toLowerCase();
    
            long expiresOnDate = System.currentTimeMillis();
            int expiresInMins = 60; // 1 hour
            expiresOnDate += expiresInMins * 60 * 1000;
            long expires = expiresOnDate / 1000;
            String toSign = targetUri + "\n" + expires;
    
            // Get an hmac_sha1 key from the raw key bytes
            byte[] keyBytes = HubSasKeyValue.getBytes("UTF-8");
            SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA256");
    
            // Get an hmac_sha1 Mac instance and initialize with the signing key
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(signingKey);
    
            // Compute the hmac on input data bytes
            byte[] rawHmac = mac.doFinal(toSign.getBytes("UTF-8"));
    
            // Using android.util.Base64 for Android Studio instead of
            // Apache commons codec
            String signature = URLEncoder.encode(
                    Base64.encodeToString(rawHmac, Base64.NO_WRAP).toString(), "UTF-8");
    
            // Construct authorization string
            token = "SharedAccessSignature sr=" + targetUri + "&sig="
                    + signature + "&se=" + expires + "&skn=" + HubSasKeyName;
        } catch (Exception e) {
            if (isVisible) {
                ToastNotify("Exception Generating SaS : " + e.getMessage().toString());
            }
        }
    
        return token;
    }
    
  8. Dalam MainActivity.java, tambahkan metode berikut ke kelas MainActivity untuk menangani klik tombol Kirim Pemberitahuan dan mengirim pesan pemberitahuan push ke hub menggunakan REST API bawaan.

    /**
        * Send Notification button click handler. This method parses the
        * DefaultFullSharedAccess connection string and generates a SaS token. The
        * token is added to the Authorization header on the POST request to the
        * notification hub. The text in the editTextNotificationMessage control
        * is added as the JSON body for the request to add a GCM message to the hub.
        *
        * @param v
        */
    public void sendNotificationButtonOnClick(View v) {
        EditText notificationText = (EditText) findViewById(R.id.editTextNotificationMessage);
        final String json = "{\"data\":{\"message\":\"" + notificationText.getText().toString() + "\"}}";
    
        new Thread()
        {
            public void run()
            {
                try
                {
                    // Based on reference documentation...
                    // https://msdn.microsoft.com/library/azure/dn223273.aspx
                    ParseConnectionString(NotificationSettings.HubFullAccess);
                    URL url = new URL(HubEndpoint + NotificationSettings.HubName +
                            "/messages/?api-version=2015-01");
    
                    HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
    
                    try {
                        // POST request
                        urlConnection.setDoOutput(true);
    
                        // Authenticate the POST request with the SaS token
                        urlConnection.setRequestProperty("Authorization",
                            generateSasToken(url.toString()));
    
                        // Notification format should be GCM
                        urlConnection.setRequestProperty("ServiceBusNotification-Format", "gcm");
    
                        // Include any tags
                        // Example below targets 3 specific tags
                        // Refer to : https://azure.microsoft.com/documentation/articles/notification-hubs-routing-tag-expressions/
                        // urlConnection.setRequestProperty("ServiceBusNotification-Tags",
                        //        "tag1 || tag2 || tag3");
    
                        // Send notification message
                        urlConnection.setFixedLengthStreamingMode(json.length());
                        OutputStream bodyStream = new BufferedOutputStream(urlConnection.getOutputStream());
                        bodyStream.write(json.getBytes());
                        bodyStream.close();
    
                        // Get response
                        urlConnection.connect();
                        int responseCode = urlConnection.getResponseCode();
                        if ((responseCode != 200) && (responseCode != 201)) {
                            BufferedReader br = new BufferedReader(new InputStreamReader((urlConnection.getErrorStream())));
                            String line;
                            StringBuilder builder = new StringBuilder("Send Notification returned " +
                                    responseCode + " : ")  ;
                            while ((line = br.readLine()) != null) {
                                builder.append(line);
                            }
    
                            ToastNotify(builder.toString());
                        }
                    } finally {
                        urlConnection.disconnect();
                    }
                }
                catch(Exception e)
                {
                    if (isVisible) {
                        ToastNotify("Exception Sending Notification : " + e.getMessage().toString());
                    }
                }
            }
        }.start();
    }
    

Langkah berikutnya

Dalam tutorial ini, Anda mengirim pemberitahuan siaran ke semua perangkat Android Anda yang terdaftar dengan ujung belakang. Untuk mempelajari cara mengirim pemberitahuan push ke perangkat Android tertentu, lanjutkan ke tutorial berikut: