Android O(8.0)Notificationが表示しないソリューション

6479 ワード

1、Android O(8.0)通知の変更
NotificationChannelはandroid 8.0新しい機能は、AppのtargetSDKVersion>=26で、channel通知チャネルが設定されていないと、通知が表示されなくなります.
Android Oは、android Oをターゲットとするプラットフォームであれば、ユーザーに通知を表示するために1つ以上の通知チャネルを実現する必要がある統一されたシステムを提供する通知チャネル(Notification Channels)を導入しています.例えば、チャットソフトウェアでは、チャットグループごとに通知チャネルを設定し、特定の音、ライトなどの構成を指定します.
2、Android Channel通知の互換支配
NotificationChannelの作成
  • NotificationChannelオブジェクトを作成し、Channelのid、name、および通知の重要度
  • を指定します.
  • NotificationMannagerのcreateNotificationChannelメソッドを使用してChannelを追加します.
  •         NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                //    channel    ,         
                NotificationChannel channel = new NotificationChannel("channel_id", "channel_name",
                        NotificationManager.IMPORTANCE_DEFAULT);
                //          
                channel.canBypassDnd();
                //   
                channel.enableLights(true);
                //      
                channel.setLockscreenVisibility(VISIBILITY_SECRET);
                //        
                channel.setLightColor(Color.RED);
                //  launcher     
                channel.canShowBadge();
                //      
                channel.enableVibration(true);
                //             
                channel.getAudioAttributes();
                //       
                channel.getGroup();
                //             
                channel.setBypassDnd(true);
                //      
                channel.setVibrationPattern(new long[]{100, 100, 200});
                //      
                channel.shouldShowLights();
                //    channel    ,         
                manager.createNotificationChannel(channel);
            }
            //   :  channel_id         channel id;        
            Notification notification = new NotificationCompat.Builder(this, "channel_id")
                    .setContentTitle("Title").setContentText("This is content").setWhen(System.currentTimeMillis())
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round)).build();
            manager.notify(0, notification);

    3、通知重要度レベルの設定
    このレベルは、NotificationChannelのコンストラクション関数で指定する必要があります.合計5つのレベルが必要です.範囲はNotificationManagement.IMPORTANCE_NONE(0) ~ NotificationManager.IMPORTANCE_HIGH(4)は、Android 7.1(API 25)以下のデバイスをサポートする場合は、次のようにNotificationCompatのsetPriorityメソッドを呼び出して設定する必要があります.
    builder.setPriority(NotificationCompat.PRIORITY_DEFAULT);

    Android 8.0以上はNotificationManagerを使用しています.IMPORTANCE_,Android 7.1以下はNotificationCompat.PRIORITY_定義された定数です.次は表の形でもっとよく展示します.
    ユーザー通知レベル
    Android8.0以上
    Android7.0以下
    非常レベル(通知音が表示され、プロンプト通知として表示されます)
    IMPORTANCE_HIGH
    PRIORITY_HIGHまたはPRIORITY_MAX
    ハイレベル(通知音が発生し、通知欄に通知がある)
    IMPORTANCE_DEFAULT
    PRIORITY_DEFAULT
    中間レベル(通知音はありませんが、通知欄に通知があります)
    IMPORTANCE_LOW
    PRIORITY_LOW
    低レベル(通知音がなくてもステータスバーに表示されません)
    IMPORTANCE_MIN
    PRIORITY_MIN
    これらの通知レベルは、Channel設定で変更できます.
    4、カスタムチャネル通知欄
     private void sendCustomNotification() {
            NotificationCompat.Builder builder = getNotificationBuilder();
            RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_custom_notifition);
            remoteViews.setTextViewText(R.id.notification_title, "custom_title");
            remoteViews.setTextViewText(R.id.notification_content, "custom_content");
    
            Intent intent = new Intent(this, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, -1,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.turn_next, pendingIntent);
            builder.setCustomContentView(remoteViews);
            getNotificationManager().notify(3, builder.build());
        }
    
    
    
    
        
    
            
    
            
    
        
    
        

    5、判断通知是否开启

    Api24以上,NotificationManagerCompat中提供了areNotificationsEnabled()方法。该方法中已经对API19以下,API19-24,API24以上,这三种情况做了判断。直接使用其返回值即可。返回true表示打开了消息通知,如果返回false则没有打开。

         private boolean isNotificationEnabled(Context context) {
            boolean isOpened = false;
            try {
                isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return isOpened;
        }

    6、ジャンプ通知設定画面
    ユーザーが通知を開いていない場合は、次のコードを使用して通知設定インタフェースにジャンプできます.
        private void gotoSet() {
            Intent intent = new Intent();
            if (Build.VERSION.SDK_INT >= 26) {
                // android 8.0  
                intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName());
            } else if (Build.VERSION.SDK_INT >= 21) {
                // android 5.0-7.0
                intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
                intent.putExtra("app_package", getPackageName());
                intent.putExtra("app_uid", getApplicationInfo().uid);
            } else {
                //   
                intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                intent.setData(Uri.fromParts("package", getPackageName(), null));
            }
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }