在 Android 8.0 中未显示使用 parse sdk 的推送通知

Posted

技术标签:

【中文标题】在 Android 8.0 中未显示使用 parse sdk 的推送通知【英文标题】:Push Notification not showing using parse sdk in Android 8.0 【发布时间】:2017-10-16 10:27:17 【问题描述】:

我正在开发 android 应用程序,我在自定义 Parse 推送通知类中注册了 FCM 推送通知。从 Parse Dashboard 发送 Push 时,它会出现在我的 Receiver 中,但未在我的屏幕通知栏中显示。下面给出了我的自定义类以及清单和代码。我也搜索了许多类似的问题,但没有运气。

我的清单:

<receiver android:name="com.parse.GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="com.kolbeh" />
            </intent-filter>
        </receiver>
        <meta-data android:name="com.parse.push.gcm_sender_id"
            android:value="id:854901#####" />

        <service android:name="com.parse.PushService" />

        <receiver
            android:name="dinewhere.fcm.CustomPushReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.parse.push.intent.RECEIVE" />
                <action android:name="com.parse.push.intent.OPEN" />
                <action android:name="com.parse.push.intent.DELETE" />
            </intent-filter>
        </receiver>

我的自定义接收器:

public class CustomPushReceiver extends ParsePushBroadcastReceiver 
    private final String TAG = CustomPushReceiver.class.getSimpleName();

    private NotificationUtils notificationUtils;

    private Intent parseIntent;

    public CustomPushReceiver() 
        super();
    

    @Override
    protected void onPushReceive(Context context, Intent intent) 
        //super.onPushReceive(context, intent);

        if (intent == null)
            return;

        try 
            JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));

            Log.e(TAG, "Push received: " + json);

            parseIntent = intent;

            parsePushJson(context, json);

         catch (JSONException e) 
            Log.e(TAG, "Push message json exception: " + e.getMessage());
        
    

    @Override
    protected void onPushDismiss(Context context, Intent intent) 
        super.onPushDismiss(context, intent);
    

    @Override
    protected void onPushOpen(Context context, Intent intent) 
        super.onPushOpen(context, intent);
        System.out.println("asdf");
    

    /**
     * Parses the push notification json
     *
     * @param context
     * @param json
     */
    private void parsePushJson(Context context, JSONObject json) 
        try 
            String message = json.getString("alert");

            Intent resultIntent = new Intent(context, MainActivity.class);
            resultIntent.putExtra("Chat", true);
            showNotificationMessage(context, "Hello", message, resultIntent);

         catch (JSONException e) 
            Log.e(TAG, "Push message json exception: " + e.getMessage());
        
    


    /**
     * Shows the notification message in the notification bar
     * If the app is in background, launches the app
     *
     * @param context
     * @param title
     * @param message
     * @param intent
     */
    private void showNotificationMessage(Context context, String title, String message, Intent intent) 

        notificationUtils = new NotificationUtils(context);

        intent.putExtras(parseIntent.getExtras());

        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

        notificationUtils.showNotificationMessage(title, message, intent);
    

我的 showNotificationMessage 方法:

 public void showNotificationMessage(String title, String message, Intent intent) 

        // Check for empty push message
        if (TextUtils.isEmpty(message))
            return;

        if (airportAssistUtil.isAppIsInBackground(mContext)) 
            // notification icon
            int icon = R.mipmap.ic_launcher_round;



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

            NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();

            PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                    mContext);
            Notification notification = mBuilder.setSmallIcon(icon).setTicker("Kolbeh").setWhen(0)
                    .setAutoCancel(true)
                    .setStyle(inboxStyle)
                    .setContentTitle("Kolbeh")
                    .setContentIntent(resultPendingIntent)
                    .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                    .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
                    .setContentText(message)
                    .build();

            mBuilder.setContentIntent(contentIntent);

            NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(count++, notification);
         
    

【问题讨论】:

【参考方案1】:

如果您的应用针对 Android O。那么您必须通过通知渠道显示通知。来自 android O 每个通知必须包含在一个 Channel Read here 内。

【讨论】:

感谢您在这里的回答。你能按照我的代码给我一个通知渠道的例子吗?我对此有点困惑。 如果您的应用针对 Android O ?然后是Example,用于探索 Android O Notification Channel。请通过它。还有一个来自 git 的Sample。 您是否按照我建议的示例进行操作? 非常感谢这份有用的文档。它真的帮了我很多。它是固定的。我在初始化时出错了。

以上是关于在 Android 8.0 中未显示使用 parse sdk 的推送通知的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 8.0 中未创建外部目录文件夹,但当目标 SDK 版本为 26 时,它在 6.0 和 7.0 设备中工作

使用 altBeacon 库在 Android 中未显示所有信标

OneSignal - Android React Native 中未显示弹出通知

Codeigniter v3.0 Flashdata 会话在 PHP 7.4 和 XAMPP 8.0 中未过期

Android:错误小吃栏在地图视图中未正确显示

android studio中未使用的导入