При нажатии на уведомление не открывается приложение Android - PullRequest
0 голосов
/ 25 сентября 2018

Я использую onesignal и firebase для отправки уведомлений из блога WordPress в приложение для Android, и когда я нажимаю на уведомление, которое только что пришло, приложение откроется, только если оно будет работать в фоновом режиме.Если он полностью закрыт, нажатие на уведомление ничего не изменит.Как добиться нажатия на уведомление, которое открывает приложение, даже если приложение не было открыто в фоновом режиме?

Ниже приведен код, который обрабатывает уведомления:

 class nyonNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
        // This fires when a notification is opened by tapping on it.
        @Override
        public void notificationOpened(OSNotificationOpenResult result) {

            OSNotificationAction.ActionType actionType = result.action.type;
            JSONObject data = result.notification.payload.additionalData;
            String customKey;

            if (data != null) {
                customKey = data.optString("customkey", null);
                if (customKey != null)
                    Log.i("OneSignalnyon", "customkey set with value: " + customKey);
            }

            if (actionType == OSNotificationAction.ActionType.ActionTaken)
                Log.i("OneSignalnyon", "Button pressed with id: " + result.action.actionID);

            // The following can be used to open an Activity of your choice.
            // Replace - getApplicationContext() - with any Android Context.
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

Что ж, чтобы решить эту проблему, первым делом нужно более четко прочитать документацию (что я не делал), поэтому вот она:

По умолчанию OneSignal откроет или возобновит вашу активность в средстве запуска, когдауведомление прослушивается.Вы можете отключить это поведение, добавив тег метаданных com.onesignal.NotificationOpened.DEFAULT , установленный на DISABLE , внутри тега приложения в вашем AndroidManifest.xml .

Убедитесь, что вы зарегистрировали его в манифесте Android, например:

    <application ...>
       <meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />
    </application>

Создайте обработчик для открытых уведомлений, например:

public class MyNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {

    private final Context context;

    public MyNotificationOpenedHandler(Context context) {
        this.context = context;
    }

    @Override
    public void notificationOpened(OSNotificationOpenResult result) {

        if (result.action.type == OSNotificationAction.ActionType.Opened) {
            JSONObject data = result.notification.payload.additionalData;

            if (data == null) {
                return;
            }

            String category = data.optString("category", null);

            if (category == null) {
                return;
            }

            if (category.equals("global")) {
                Intent intent = new Intent(context, NotificationDetailsActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        }
    }
}

Следующий пункт:

Убедитесь, что вы инициализируете OneSignal с setNotificationOpenedHandler в методе onCreate в своем классе Application ,Вам нужно будет позвонить startActivity из этого обратного вызова.

Вам нужно будет расширить Класс приложения , например:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        OneSignal.startInit(this)
                .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
                .setNotificationOpenedHandler(new MyNotificationOpenedHandler(getApplicationContext()))
                .unsubscribeWhenNotificationsAreDisabled(true)
                .init();
    }
}

Установите имя приложения в манифесте Android, например:

    <application
        android:name=".MyApplication"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:theme="@style/AppTheme">

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

0 голосов
/ 10 октября 2018

Set " setNotificationOpenedHandler "

   OneSignal.startInit(this)
            .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
            .setNotificationOpenedHandler(new NotificationOpenedHandler())
            .init();

Добавьте этот класс к своей деятельности по запуску (убедитесь, что уведомление имеет "AdditionalData")

 public class NotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
    // This fires when a notification is opened by tapping on it.
    @Override
    public void notificationOpened(OSNotificationOpenResult result) {
        //OSNotificationAction.ActionType actionType = result.action.type;
        JSONObject data = result.notification.payload.additionalData;
        String customKey;
        if (data != null) {
            customKey = data.optString("Data", null);
            if (customKey != null)
            {
                Log.d("LOGGED", "notificationOpened: " +  customKey);
                if(customKey.equals("Notification"))
                {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
                else
                {
                    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
                //Toast.makeText(MainActivity.this, "Value is : " + customKey, Toast.LENGTH_SHORT).show();
            }
        }

Подробнее https://documentation.onesignal.com/docs/android-native-sdk#section--notificationopenedhandler-

0 голосов
/ 10 октября 2018

Код, который я использую для открытия приложения по щелчку уведомления, который работает совершенно нормально:

 Intent resultIntent = new Intent(getApplicationContext(), YourActivity.class);
 resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
 //if you want to send some data
 resultIntent.putExtra(AppConstants.NOTIFICATION, data);

Теперь вам нужно создать PendingIntent PendingIntent: согласно документам при создании ожидающих намерений означает, что выдаем ему право выполнять указанную вами операцию, как если бы другое приложение было вами.https://developer.android.com/reference/android/app/PendingIntent

PendingIntent resultPendingIntent = PendingIntent.getActivity(context, 0, intent,
                    PendingIntent.FLAG_CANCEL_CURRENT
            );

Теперь, когда вы создаете свое Уведомление, установите это ожидающее намерение setContentIntent (resultPendingIntent) для этого уведомления.

  Notification notification;
    notification = mBuilder.setSmallIcon(icon).setTicker(title).setWhen(0)
            .setAutoCancel(true)
            .setContentTitle(title)
            .setContentIntent(resultPendingIntent)
            .setStyle(inboxStyle)
            .setWhen(getTimeMilliSec(System.currentTimeMillis() + ""))
            .setSmallIcon(R.drawable.ic_app_icon)
            .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), icon))
            .setContentText(message)
            .setChannelId(CHANNEL_ID)
            .build();
0 голосов
/ 25 сентября 2018

Добавьте следующее в ваш AndroidManifest.xml, чтобы предотвратить запуск вашей основной деятельности

 <application ...>
      <meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />
    </application>
...