OSNotificationPayload не может быть преобразован в JSONObject - PullRequest
0 голосов
/ 16 января 2019

СИТУАЦИЯ:

В моем Quasar гибридном приложении мне нужно реализовать некоторые собственные функции для получения фоновых уведомлений .

Я отправляю push-уведомление, используя OneSignal , из моего API.

В полезную нагрузку я добавляю notification_type, который сообщает, является ли уведомление тихим или нет (должно отображаться в телефоне или нет).

Когда я получаю уведомление, мне нужно прочитать эту полезную нагрузку, но мне не удается.

КОД:

Это служба уведомлений:

package com.myapp.app;

import android.util.Log;
import org.json.JSONObject;

import com.onesignal.OSNotificationPayload;
import com.onesignal.NotificationExtenderService;
import com.onesignal.OSNotificationReceivedResult;

public class NotificationService extends NotificationExtenderService {
   @Override
   protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) {

     if (receivedResult != null) {

        JSONObject data = receivedResult.payload;
        // check data - if notification_type is 'silent' than return true otherwise return false
        return false;
     }
   }
}

ОШИБКА:

error: incompatible types: OSNotificationPayload cannot be converted to JSONObject
        JSONObject data = receivedResult.payload;

enter image description here

СПИСОК ЛИТЕРАТУРЫ:

Вот несколько примеров из репозитория OneSignal Android SDK:

https://github.com/OneSignal/OneSignal-Android-SDK/blob/master/Examples/AndroidStudio/app/src/main/java/com/onesignal/example/NotificationExtenderExample.java

Это касается фоновых уведомлений, но в этом случае они не читают содержимое receivedResult.

Вот хороший пример, которому я следую:

https://www.programcreek.com/java-api-examples/?code=AppHero2/Raffler-Android/Raffler-Android-master/app/src/main/java/com/raffler/app/service/NotificationService.java#

В этом случае он читает данные следующим образом: JSONObject additionalData = receivedResult.payload.additionalData;

API:

Так я отправляю push-уведомления из моего Laravel API

private function send_notification_curl($order) {
    $content      = array(
        "en" => "notification message...",
    );
    $fields = array(
        'data' => array(
            'order_id' => $order->id,
            'notification_type' => 'silent'
        ),
        'contents' => $content,
        // some other params...
    );

    $fields = json_encode($fields);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://onesignal.com/api/v1/notifications");
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charset=utf-8',
        'Authorization: Basic my_key'
    ));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
}

ВОПРОС:

Как мне прочитать содержание receivedResult?

Можно ли преобразовать его в объект json?

Знаете ли вы, почему я получаю эту ошибку?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Попробуйте этот пример кода

        JSONObject data = result.notification.payload.additionalData;
        String message=result.notification.payload.body!=null?result.notification.payload.body:"";
        String title=result.notification.payload.title!=null?result.notification.payload.title:"";
0 голосов
/ 16 января 2019

Ответ от @Khalid Taha правильный.

Однако для моего конкретного случая я мог бы использовать JSONObject. Что было не так, так это то, как я это использовал.

Если я получаю доступ к данным таким образом, это работает:

JSONObject additionalData = receivedResult.payload.additionalData;

и тогда я могу получить отдельные параметры, например:

final String notificationType = additionalData.optString("notification_type");

Вероятно, свойство additionalData является встроенным свойством Уведомлений.

0 голосов
/ 16 января 2019

Полезная нагрузка имеет тип OSNotificationPayload, а не JSONObject, поэтому ее необходимо прочитать следующим образом:

OSNotificationPayload object = receivedResult.payload;

Затем вы читаете значения из этого объекта.

...