Как получить уведомления OneSignal при закрытии приложения?

#android #push-notification #onesignal

#Android #push-уведомление #onesignal

Вопрос:

Я внедрил Push-уведомление Onesignal в своем приложении, но я не получаю push-уведомление, когда мое приложение закрыто.Вот мой код для реализации.

LoginActivity.java

 public class LoginActivity extends BaseActivity {

    private static final int REQUEST_MARK_READ = 165;
    private ListView userListView;
    private static final String TAG = LoginActivity.class.getSimpleName();
    private static ArrayList<String> userids=new ArrayList<>();
    private static boolean activityStarted;

    public static void start(Context context) {
        Intent intent = new Intent(context, LoginActivity.class);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (activityStarted amp;amp; getIntent() != null amp;amp; (getIntent().getFlags() amp; Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0)
        {
            finish();
            return;
        }
        activityStarted = true;
        setContentView(R.layout.activity_login);
        if (SharedPreferencesUtil.hasQbUser()) {
            try {
                Onesignal();
                recreateChatSession();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return;
        }
        Onesignal();

        userListView = _findViewById(R.id.list_login_users);
        TextView listHeader = (TextView) LayoutInflater.from(this)
                .inflate(R.layout.include_list_hint_header, userListView, false);
        listHeader.setText(R.string.login_select_user_for_login);

        userListView.addHeaderView(listHeader, null, false);
        userListView.setOnItemClickListener(new OnUserLoginItemClickListener());
        buildUsersList();
    }


    public void Onesignal()
    {
          /*5 oct 2016*/
        OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
            @Override
            public void idsAvailable(String userId, String registrationId) {
                registrationId= NotificationUtilities.getRegistrationId(getApplicationContext());

                userids.add(userId);
                String text = "OneSignal UserID:n"   userId   "nn";

//                try {
//                    OneSignal.postNotification(new JSONObject("{'contents': {'en':'"  PrivateChatImpl.chat_message  "'}, 'include_player_ids': ['"   userId   "']}"), null);
//                } catch (JSONException e) {
//                    e.printStackTrace();
//                }

                try {
                    OneSignal.postNotification(new JSONObject("{'contents': {'en':'"   PrivateChatImpl.chat_message.size()   "','en':'Unread Messages'}, 'include_player_ids': ['"   userId   "']}"),
                            new OneSignal.PostNotificationResponseHandler() {
                                @Override
                                public void onSuccess(JSONObject response) {

                                    Log.i("OneSignalExample", "postNotification Success: "   JsonResponse());
                                }

                                @Override
                                public void onFailure(JSONObject response) {
                                    Log.e("OneSignalExample", "postNotification Failure: "   JsonResponse());
                                }
                            });
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                if (registrationId != null)
                    text  = "Google Registration Id:n"   registrationId;
                else
                    text  = "Google Registration Id:nCould not subscribe for push";

            }
        });


         /*5 oct 2016*/
    }

    public String JsonResponse()
    {
        String jsonResponse = null;
        try {

            URL url = new URL("https://onesignal.com/api/v1/notifications");
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setUseCaches(false);
            con.setDoOutput(true);
            con.setDoInput(true);

            con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            con.setRequestProperty("Authorization", "Basic NGEwMGZmMjItY2NkNy0xMWUzLTk5ZDUtMDAwYzI5NDBlNjJj");
            con.setRequestMethod("POST");

            String strJsonBody = "{"
                        ""app_id": "05b29c2d-ea2a-487f-88e8-63438bd58831","
                        ""include_player_ids": " userids ","
                        ""data": {"foo": "bar"},"
                        ""contents": {"en": "English Message"}"
                      "}";


            System.out.println("strJsonBody:n"   strJsonBody);

            byte[] sendBytes = strJsonBody.getBytes("UTF-8");
            con.setFixedLengthStreamingMode(sendBytes.length);

            OutputStream outputStream = con.getOutputStream();
            outputStream.write(sendBytes);

            int httpResponse = con.getResponseCode();
            System.out.println("httpResponse: "   httpResponse);

            if (  httpResponse >= HttpURLConnection.HTTP_OK
                    amp;amp; httpResponse < HttpURLConnection.HTTP_BAD_REQUEST) {
                Scanner scanner = new Scanner(con.getInputStream(), "UTF-8");
                jsonResponse = scanner.useDelimiter("\A").hasNext() ? scanner.next() : "";
                scanner.close();
            }
            else {
                Scanner scanner = new Scanner(con.getErrorStream(), "UTF-8");
                jsonResponse = scanner.useDelimiter("\A").hasNext() ? scanner.next() : "";
                scanner.close();
            }
            System.out.println("jsonResponse:n"   jsonResponse);

        } catch(Throwable t) {
            t.printStackTrace();
        }

        return jsonResponse;
    }
 

MyShopApplication.java

 public class MyShopApplication extends Application {
    private Tracker mTracker;
        private static MyShopApplication INSTANCE;

        final GooglePlayServicesHelper googlePlayServicesHelper = new GooglePlayServicesHelper();
        @Override
        public void onCreate() {
        super.onCreate();
        INSTANCE=this;
        HttpService.getInstance().setUp(getApplicationContext());
        FacebookSdk.sdkInitialize(getApplicationContext());
            sharedPreferences = getSharedPreferences(AppConstants.USER_PREFERENCES, Context.MODE_PRIVATE);

//            OneSignal.startInit(this).init();
//        OneSignal.enableNotificationsWhenActive(true);
//        OneSignal.setLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.DEBUG);

            /* 5 october 2016 */

//            OneSignal.setLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.WARN);
            OneSignal.startInit(this)
                    .setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
                    .setNotificationReceivedHandler(new ExampleNotificationReceivedHandler())
                    .autoPromptLocation(true)
                    .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.None)
                    .disableGmsMissingPrompt(true)
                    .init();

            /*11 oct 2016*/
            OneSignal.clearOneSignalNotifications();
            OneSignal.syncHashedEmail(sharedPreferences.getString(AppConstants.USER_EMAIL, ""));
            /*11 oct 2016*/


            /*Registering for push notifications happens automatically on Android using OneSignal.
             You don't need to write anything!*/

            /* 5 oct 2016*/


        Crashlytics crashlyticsKit = new Crashlytics.Builder()
                .core(new CrashlyticsCore.Builder()/*.disabled(BuildConfig.DEBUG)*/.build())
                .build();

        Fabric.with(this, crashlyticsKit, new Crashlytics(), new Crashlytics());

        GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
        analytics.setLocalDispatchPeriod(15);//setting dispatching to 15mins, Default is 30 mins
        // To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG
        mTracker = analytics.newTracker(R.xml.global_tracker);
        mTracker.enableAutoActivityTracking(true);


    }




    /* 5 october 2016 */

    private class ExampleNotificationOpenedHandler 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("OneSignalExample", "customkey set with value: "   customKey);
            }

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

            // The following can be used to open an Activity of your choice.

             Intent intent = new Intent(getApplicationContext(),
                     com.baniaclothing.rang.quickblox.ui.activity.LoginActivity.class);
             intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
             startActivity(intent);

            // Add the following to your AndroidManifest.xml to prevent the launching of your main Activity
            //  if you are calling startActivity above.
         /*
            <application ...>
              <meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />
            </application>
         */
        }
    }
    /* 5 october 2016 */

    /* 5 october 2016 */
    private class ExampleNotificationReceivedHandler implements OneSignal.NotificationReceivedHandler {
        @Override
        public void notificationReceived(OSNotification notification) {
            JSONObject data = notification.payload.additionalData;
            String customKey;

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

    /* 5 october 2016 */
}
 

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

Manifest_file

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.baniaclothing.rang" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />


    <!-- Creates a custom permission so only this app can receive its messages. -->
    <permission
        android:name="com.baniaclothing.rang.quickblox.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.baniaclothing.rang.permission.C2D_MESSAGE" />
    <!-- This app has permission to register and receive data message. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <application
        android:name=".MyShopApplication"
        android:allowBackup="true"
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >

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

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

        <activity
            android:name=".quickblox.ui.activity.LoginActivity"
            android:label="@string/login_title"
            android:screenOrientation="portrait" />

        <service
            android:name=".NotificationExtenderExample"
            android:exported="false">
            <intent-filter>
                <action android:name="com.onesignal.NotificationExtender" />
            </intent-filter>
        </service>

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


    </application>

</manifest>
 

NotificationExtenderExample

 public class NotificationExtenderExample extends NotificationExtenderService {

    final static String GROUP_KEY_EMAILS = "group_key_emails";


    @Override
    protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) {
        OverrideSettings overrideSettings = new OverrideSettings();
        overrideSettings.extender = new NotificationCompat.Extender() {
            @Override
            public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
                // Sets the background notification color to Green on Android 5.0  devices.
                return builder.setColor(new BigInteger("FF00FF00", 16).intValue())
                              .setGroup(GROUP_KEY_EMAILS)
                              .setGroupSummary(true);
            }
        };

        OSNotificationDisplayedResult displayedResult = displayNotification(overrideSettings);
        Log.d("OneSignalExample", "Notification displayed with id: "   displayedResult.androidNotificationId);

        return true;
    }
}
 

Logcat

   10-14 08:56:55.683 4581-4581/com.baniaclothing.rang I/REgistraationId:: dKV-blhGGI4:APA91bFpbOMERKf_IlZ3JI9P2ngOY5EXFF7kaUyuuHSL1SGsi5qLPDGDoyJPKyA1OvK5Jd_4TfHjWQJjO-SqQY5g7tTY2ThGOusbBJwH-8-IDhxsqYeUJzvfQtJl8cvW9qOhsnTnswp7
10-14 08:56:56.287 4581-6086/com.baniaclothing.rang I/System.out: strJsonBody:
10-14 08:56:56.287 4581-6086/com.baniaclothing.rang I/System.out: {"app_id": "000000000-0000-0000-0000-0000000000","include_player_ids": [ecbef570-f713-4fb0-ada2-e7b9b864344b],"data": {"foo": "bar"},"contents": {"en": "English Message"}}
10-14 08:56:56.686 4581-6086/com.baniaclothing.rang I/System.out: httpResponse: 400
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/System.out: jsonResponse:
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/System.out: {"status":400,"error":"There was a problem in the JSON you submitted: unexpected character at line 1, column 74 [parse.c:652]"}
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/OneSignalExample: postNotification Success: {"status":400,"error":"There was a problem in the JSON you submitted: unexpected character at line 1, column 74 [parse.c:652]"}
 

Примечание — Пожалуйста, игнорируйте ненужные вызовы методов в файлах Java.Я только что показал код, связанный с Push-уведомлением OneSignal.
Почему я не получаю уведомление, когда мое приложение закрыто?

Ответ №1:

Если вы закрываете свое приложение, переводя его в состояние «Принудительная остановка», большинство событий, включая сообщения GCM / FCM для push-уведомлений, не будут получены. Приложение может быть переведено в это состояние следующими способами.

  • В настройках> Приложения нажимается «Принудительная остановка».
  • Длительное нажатие кнопки «Назад» на некоторых устройствах.
  • Использование стороннего убийцы задач, такого как Greenify.
  • Приложение закрыто на некоторых устройствах Huawei, Xiaomi или Sony из-за их пользовательских настроек Android. Для предотвращения этого можно изменить следующие настройки устройства.
    • Huawei — Перейдите в настройки> «Защищенные приложения», проверьте свое приложение.
    • Xiaomi — Убедитесь, что свойство «Автозапуск» включено для вашего приложения в настройках.
    • Sony — Нажмите на значок батареи. Перейдите в раздел Управление питанием> Режим ВЫНОСЛИВОСТИ> Приложения, активные в режиме ожидания> Добавить свое приложение.

Чтобы подтвердить, что состояние вашего приложения является проблемой, отправьте несколько уведомлений и проверьте следующую запись GCM logcat.

 W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.onesignal.example (has extras) }
 

Некоторые производители устройств переводят приложения из белого списка в принудительно закрытое состояние. Например, такие, как Gmail и Whatsapp.

Более подробную информацию см. В документации OneSignal по этому вопросу.

Комментарии:

1. Я проверил эту проблему, но это не проблема, мои настройки телефона абсолютно верны .

2. Можете ли вы проверить свой logcat на GCM наличие указанной выше записи при отправке уведомления? Можете ли вы протестировать свое приложение на другом устройстве Android? Добавьте версию ОС и номер модели протестированных вами устройств, а также способ закрытия приложения.

3. в logcat не отображается запись, касающаяся GCM

4. Я не включил никакого кода для регистрации GCM. И мой logcat также ничего не показывает относительно GCM

5. Я обновил свой Logcat в вопросе, просто взгляните на него.