【Debug-Notification】RemoteServiceException: Bad notification for startForeground...

5234 ワード

Android 5でフロント通知を書いた.0デバイスのテストは問題ありません.8.0に変更した後、エラーを報告します.
android.app.RemoteServiceException: Bad notification for startForeground:
 java.lang.RuntimeException: invalid channel for service notification: 
     Notification(channel=null pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE)

資料を表示:https://blog.csdn.net/misiyuan/article/details/78384819
Android 8だったのか.0は通知を細分化し,channelを導入したが,これは主に2つの面に影響を及ぼした:A.一般通知Notification;B.フロントサービス通知
私が出会ったのは後者です

A.一般通知Notification:


一般通知については、Android 8.0の適合について参照してください.https://blog.csdn.net/qq_34773981/article/details/78173376
主に伝統的な書き方に対して2箇所修正します.
①「NotificationManager」で「NotificationChannel」属性の追加を設定します.
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

// 【 Android8.0】 NotificationManager NotificationChannel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel channel = new NotificationChannel("notification_id", "notification_name", NotificationManager.IMPORTANCE_LOW);
    notificationManager.createNotificationChannel(channel);
}

②「Notification」で「setChannelId()」メソッド設定を使用して「channel_id」プロパティを追加する:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
...
...
// 【 Android8.0】 Notification Channel_ID, 
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    builder.setChannelId("notification_id");
}
...
builder.build();

ここで、手順1の「NotificationChannel」のコンストラクション関数のパラメータリストは、「channel_id」一意id、Stringタイプの順である.【channel_name】ユーザに見えるchannel名、Stringタイプ.【importance_level】通知の重要度.
importance_レベルには主に7つの階層があります.
IMPORTANCE_NONE:(0)通知を閉じます.どこにも表示されず、ブロックされたIMPORTANCE_MIN:(1)通知を開きます.ポップアップしない、ヒント音を出さない、ステータスバーにIMPORTANCEが表示されないLOW:(2)通知を開きます.ポップアップしない、ヒント音を出さない、ステータスバーにIMPORTANCEが表示されるDEFAULT:(3)通知を開きます.ポップアップしないで、ヒント音を出して、ステータスバーに【デフォルト】IMPORTANCE_を表示しますHIGH:(4)オープン通知.ポップアップ、プロンプト音、ステータスバーに表示されます
IMPORTANCE_MAX:(5)通知を開きます.ポップアップが表示され、プロンプト音が表示され、full screen intents(着信など)を使用できます.重要度最高IMPORTANCE_UNSPECIFIED:(-1000)は、ユーザが重要値を設定していないことを示す.この値は永続的なプリファレンスであり、実際の通知には関連付けられません.
このセクションの参考:①https://blog.csdn.net/Haienzi/article/details/81268022【タイトル:Android 8.0利用通知フロントサービス作成】②https://www.jianshu.com/p/f85ef58edf63【タイトル:Android Oreoは新しい特性を知らせて、この穴の老夫は先に踏んだ】
前世今生:
Android Oの前に、通知を「優先度」と呼び、Build時にsetPriority()を設定することで、5段階(-2~2)に分けられます.デフォルト:Notification.PRIORITY_DEFAULT
Android Oの後、通知を「重要性」と呼び、NotificationChannelのsetImportance()設定により、5ファイル(0~4)になります.デフォルト:NotificationManagement.IMPORTANCE_DEFAULT
通知音や振動のプロパティを設定しても、次の表のドキュメントを満たす必要があります.
Importance
Behavior
Usage
Examples
NONE
Don't show in the shade
Normally, Suppressing notification from package by user request
Blocked apps notification
MIN
No sound or visual interruption
Non-essential information that can wait or isn’t specifically relevant to the user
Nearby places of interest, weather, promotional content
LOW
No sound
Notification channels that don't meet the requirements of other importance levels
New content the user has subscribed to, social network invitations
DEFAULT
Makes a sound
Information that should be seen at the user’s earliest convenience, but not interrupt what they're doing
Traffic alerts, task reminders
HIGH
Makes a sound and appears on screen
Time-critical information that the user must know, or act on, immediately
Text messages, alarms, phone calls
 
このセクションの参照:https://www.jianshu.com/p/99bc32cd8ad6【タイトル:NotificationChannel適合ピットガイド】

B.フロントサービス通知:


前者が追加するコードと同じです.
フロント・サービスは、【startForeground()】メソッドでフロント・サービスの通知を通知欄にリストすることができ、従来の書き方では通常の通知Notificationの書き方と似ていますが、NotificationManagerを使用して表示通知を管理する必要はありません.でもAndroid 8では0以降、NotificationChannelを導入した後、NotificationManagerの使用場所が見つからなくても、「A.一般通知Notification---->①「NotificationManager」で「NotificationChannel」属性を追加するコードを設定して「startForeground();」を実行します.文の前に書きます.
Intent intent = new Intent(this, TestActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
...
...  
// 【 Android8.0】 Notification Channel_ID, 
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    builder.setChannelId("notification_id");
}
...
...


//  :
// 【 Android8.0】 NotificationManager NotificationChannel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
    NotificationChannel channel = new NotificationChannel("notification_id", "notification_name", NotificationManager.IMPORTANCE_LOW);
    notificationManager.createNotificationChannel(channel);
}

//  
startForeground(1, builder.build());


以下を参照してください.https://blog.csdn.net/Haienzi/article/details/81268022