2

私は自分のアプリでFCMを使用しています。私はFirebaseのドキュメントに従って、すべてが期待どおりに動作しているようです。Android Firebase通知(FCM)

アプリが強制終了されたとき、バックグラウンドとフォアグラウンドでメッセージ通知を受け取ることができます。

ここで、いくつかのアプリの設定を追加して、ユーザーを完全に制御したいと考えています。

  • ユーザーはアプリが殺されているとき、私はそれを行う方法についてのアイデアを持っているユーザーは、アプリの設定

から通知音を変更することができます

  • アプリの設定からすべての通知を無効にすることができますまたはフォアグラウンドで使用することができます。 FirebaseMessagingServiceのsharedprefsにアクセスして、通知を表示し、使用する着信音を確認するかどうかを確認しています。これらのパラメータを設定する一般的な方法がない限り、すべての通知からの「登録解除」や、私が気づいていないアプリのデフォルトの通知着信音を変更するのですか?

    しかし、通知はデバイスのシステムトレイに配信されているので、アプリがバックグラウンドであるときに受け取った通知について、どのようにすればいいのかわかりません。 誰もが何らかのアイデアを持っているか、いくつかのドキュメントを指し示すことができます...私はこれに関する情報を見つけることはできませんか?

  • +0

    1回通知はシステムトレイにプッシュされ、実際にはインテントエクストラにデータが保存され、通知はシステムトレイからタップされるとランチャーアクティビティから取得できます。 –

    +0

    アプリが殺された場合やバックグラウンドであっても共有設定から通知ビューとカスタムサウンドを表示したい場合は、 – rafsanahmad007

    答えて

    1

    デフォルトでは、通知はすべてのユーザーに影響します。ユーザーがすべての通知(または特定のサブセットの通知)をオプトアウトできるようにするには、topic messagingを使用する必要があります。デフォルトでは、すべてのユーザーに対してsubscribeToTopic()と呼ばれます。通知がオプトアウトされた場合、 d unsubscribeToTopic()に電話してください。

    トピックに通知を送信すると、登録されたユーザーのみが通知を受信します。

    notification payload support documentationは、アプリのres/rawディレクトリにバンドルされている任意のサウンドで、Androidの着信音を無効にするsoundパラメータを含める方法を説明しています。

    これらの機能のどちらがコンソールでサポートされていることを指摘していますが、独自のFirebase Cloud Messaging Server

    1

    firebase通知サービスは、2オブジェクトの第一は、「データ」および第2回で持っているとされる「通知」を作成することを要求しなければなりませんあなたがfirebaseコンソールからpushを送信しているときに、それは "通知"オブジェクトにデータを送ります。 FirebaseMessagingService.classで通知を処理すると、NotificationBuilderでカスタム通知が作成されます。アプリケーションがバックグラウンドになると、「通知」オブジェクトから通知を作成することはできません。あなたのカスタムメイド通知は通知トレイに表示されません。バックエンドから通知をプッシュし、通知コンテンツを「データ」オブジェクトに送信する必要があります。毎回通知をカスタマイズすることができます。 詳細についてはhttps://firebase.google.com/docs/cloud-messaging/android/send-multiple

    0

    ユーザーはアプリの設定からすべての通知を無効にすることができます。

    あなたが自分の言ったとおりに共有設定を使用できます。一般的な方法については@ianhanniballakeの答えを調べるべきです。

    ユーザーがデフォルトの着信音のためのアプリの設定

    から通知音を変更することができますが、このlinkを参照してください。このリンクの3番目の答えは、サウンドセレクタをアプリケーションの設定アクティビティから呼び出す方法についても説明しています。カスタムサウンドが必要な場合はthisを参照してください。

    もちろん、ユーザーにサウンドを選択するように尋ねないように、ユーザーの設定を保存する必要があります。

    サービスを使用しているのでもう1つのことは、再生するサウンドを見つけるために毎回共有の環境設定にアクセスする必要がないため、任意の変数に選択肢を保存することができます。ユーザーが通知音を変更するたびに、リスナーを設定するか、{サービスの停止→更新設定→サービスの再起動}のいずれかを設定できます。サービスが始まるたびに設定が読み込まれることを確認してください。

    0

    this AndroidHiveチュートリアルでは、特定のアプリの着信音の変更方法と、アプリがフォアグラウンドにあり、アプリがバックグラウンドのときに通知を処理する方法を見つけることができます。

    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
        ...... 
    
        // Check if message contains a notification payload. 
        if (remoteMessage.getNotification() != null) { 
         Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody()); 
         handleNotification(remoteMessage.getNotification().getBody()); 
        } 
    } 
    

    通知タイプのメッセージが送信されると、アプリがバックグラウンドのときに通知が自動的に表示されます。アプリケーションがフォアグラウンドにある場合、handleNotification()メソッドは通知メッセージを処理します。

    private void handleNotification(String message) { 
        if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) { 
         // app is in foreground, broadcast the push message 
         Intent pushNotification = new Intent(Config.PUSH_NOTIFICATION); 
         pushNotification.putExtra("message", message); 
         LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification); 
    
         // play notification sound 
         NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext()); 
         notificationUtils.playNotificationSound(); 
        }else{ 
         // If the app is in background, firebase itself handles the notification 
        } 
    } 
    

    ここでは、Sound-

    // Playing notification sound 
    public void playNotificationSound() { 
        try { 
         Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE 
           + "://" + mContext.getPackageName() + "/raw/notification"); 
         Ringtone r = RingtoneManager.getRingtone(mContext, alarmSound); 
         r.play(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
    } 
    
    0

    カスタム通知を扱うあなたのアプリがバックグラウンドで動作しているか、殺されたときFirebaseはあなたonMessageReceivedを呼び出すことはありません、あなたはあなたの通知をカスタマイズすることはできません。システムによって生成された通知が表示されます。あなたのすべての例でonMessageReived

    a)はフォアグラウンド

    b)の背景

    c)を呼び出すためにfirebaseライブラリを作るために

    はあなたがJSONキー "通知" を入れてはいけません

    を殺しましたfirebase apiへのあなたの要求は、代わりに "データ"を使用してください、以下を参照してください。例えば

    次のメッセージが、これは

    { 
        "to": "/topics/test", 
        "data": { 
         "text":"text", 
         "title":"", 
         "line1":"testline", 
         "line2":"test" 
        } 
    } 
    

    は、このリンクを参照して動作しますonMessagereceived()

    { 
        "to": "/topics/test", 
        "notification": { 
        "title" : "title", 
        "text": "data!", 
        "icon": "ic_notification" 
        } 
    } 
    

    けどを呼び出すことはありません。https://firebase.google.com/docs/cloud-messaging/concept-options それは例えばfirebaseメッセージタイプ の詳細な説明があります:

    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
    
        Log.d(TAG, "From: " + remoteMessage.getFrom()); 
    
        // Check if message contains a data payload. 
        if (remoteMessage.getData().size() > 0) { 
         Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
        } 
    
        if(remoteMessage.getData().get("state").toString().equals("Request")){ 
         sendNotification(remoteMessage.getData().get("body").toString(), remoteMessage.getData().get("message").toString(), remoteMessage.getData().get("state").toString(),Activity_name.class); 
        } 
    } 
    
        private void sendNotification(String messageBody, String data, String state,Class<?> activityCompat) { 
         int requestID = (int) System.currentTimeMillis(); 
         Intent intent = new Intent(this, activityCompat); 
         Bundle bundle = new Bundle(); 
         bundle.putString("message", data); 
         bundle.putString("state", state); 
         intent.putExtras(bundle); 
         PendingIntent pendingIntent = PendingIntent.getActivity(this, requestID, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    
         NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
           .setSmallIcon(R.drawable.small_logo) 
           .setContentTitle("Title") 
           .setContentText(messageBody).setContentIntent(pendingIntent) 
           .setAutoCancel(true) 
           .setStyle(new NotificationCompat.BigTextStyle() 
             .bigText(messageBody)) 
           .setTicker(messageBody); 
    
         NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
         notificationBuilder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL; 
         Notification notification = notificationBuilder.build(); 
    
         notificationManager.notify((int) Calendar.getInstance().getTimeInMillis(), notification); 
    
        } 
    
    +0

    どうすれば、アプリケーションが強制終了されると、onMessageReceived()が呼び出されることを保証できますか?文書はありますか? –

    関連する問題