Push-уведомления не работают, когда приложение открыто? - PullRequest
2 голосов
/ 28 марта 2019

Я пытаюсь использовать FCM, и уведомления работают только тогда, когда я не использую приложение.

, когда я отправляю уведомление с устройства A на устройство B, тогда устройство B получает сообщение и выводит "showвсплывающее уведомление со звуком по умолчанию "и все хорошо ... (это происходит, когда устройство B не использует приложение).

когда я отправляю уведомление с устройства A на устройство B, тогда устройство B получаетсообщение в методе onMessageReceived (), но «не показывает всплывающее уведомление со звуком по умолчанию» .. (это происходит, когда устройство B использует приложение, я имею в виду, когда приложение открыто и используется).

это мой код FireIDService.java

public class FireIDService extends FirebaseInstanceIdService {

    private final String TAG = "FireIDService";

    @Override
    public void onTokenRefresh() {
        String tkn = FirebaseInstanceId.getInstance().getToken();
        Log.d("Not","Token ["+tkn+"]");
        sendRegistrationToServer(tkn);
    }


    private void sendRegistrationToServer(String token) {
        saveDeviceToken(token);
    }

    private void saveDeviceToken(String deviceToken) {
        //some code..
                    if(response.body().getStatus() == 1){
                        doStuff();
                    }
        //some code...
            }

            @Override
            public void onFailure(Call<SaveDeviceTokenResponse> call, Throwable t) {
                //code...
            }
        });
    }

    private void doStuff(){
        Intent intent = new Intent(this, SplashActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 1410 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setContentTitle("FCM Message")
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(1410 /* ID of notification */, notificationBuilder.build());
    }
}

FireBaseMsgService.java

public class FireBaseMsgService  extends FirebaseMessagingService{

    private final String TAG = "FireBaseMsgService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);


        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);


        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "test")
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setContentTitle(remoteMessage.getNotification().getTitle())
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_background))
                .setContentText(remoteMessage.getNotification().getBody())
                .setAutoCancel(true)
                .setColor(0xffff7700)
                .setVibrate(new long[]{100, 100, 100, 100})
                .setPriority(Notification.PRIORITY_MAX)
                .setSound(defaultSoundUri);

        Intent resultIntent = new Intent(this, SplashActivity.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(SplashActivity.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(
                        0,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

        notificationBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);


        mNotificationManager.notify(1, notificationBuilder.build());
    }

}

это то, что добавлено в файл AndroidManifest.xml

<service android:name=".FireIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
        <service android:name=".FireBaseMsgService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

и это класс Notify для выполнения

public class Notify extends AsyncTask<Void,Void,Void>{

    private String tkn;
    private String title;
    private String body;

    public Notify(String tkn, String title, String body){
        this.tkn = tkn;
        this.title = title;
        this.body = body;
    }

    @Override
    protected Void doInBackground(Void... voids) {

        Log.e("Token: ", tkn);
        Log.e("Title: ", title);
        Log.e("Body: ", body);

        try {

            URL url = new URL("https://fcm.googleapis.com/fcm/send");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            conn.setUseCaches(false);
            conn.setDoInput(true);
            conn.setDoOutput(true);

            conn.setRequestMethod("POST");
            conn.setRequestProperty("Authorization","key=KEY_HERE");
            conn.setRequestProperty("Content-Type", "application/json");

            JSONObject json = new JSONObject();

            json.put("to", tkn);


            JSONObject info = new JSONObject();
            info.put("title", title);   // Notification title
            info.put("body", body); // Notification body
            info.put("priority", "high");
            info.put("show_in_foreground", "true");

            json.put("notification", info);

            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(json.toString());
            wr.flush();
            conn.getInputStream();

        }
        catch (Exception e)
        {
            Log.d("Error",""+e);
        }


        return null;
    }

}

1 Ответ

1 голос
/ 28 марта 2019

Если вы используете Android 8.0+. Вам нужно указать channelId для уведомления. Когда ваше приложение находится в фоновом режиме (как уже упоминалось в первом случае), push-уведомление принимается в системном трее уведомлений, а не в FireBaseMsgService, и оно обрабатывается системой автоматически с помощью channelId, генерируемым самой системой. Когда ваше приложение находится на переднем плане (второй случай), ваш FireBaseMsgService выполняется и должен создать уведомление channelId

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...