2

Ich habe benutzerdefinierte Benachrichtigung mit RemoteViews Widget implementiert. Ich habe es auf Android 5.0.2 und Android 6.0 getestet. Es hat gut funktioniert. Aber nach einiger Zeit stürzte es jedes Mal ab, wenn es von GCM benachrichtigt wurde.android.app.RemoteServiceException: Ungültige Benachrichtigung vom Paket gesendet. RemoteViews konnte nicht erweitert werden für: StatusBarNotification

Absturz Dump -

Process: package.name, PID: 27743 
android.app.RemoteServiceException: Bad notification posted from package package.name: Couldn't expand RemoteViews for: StatusBarNotification(pkg=package.name user=UserHandle{0} id=1524095391 tag=null key=0|package.name|1524095391|null|10247: Notification(pri=0 contentView=package.name/0x7f040033 vibrate=null sound=null defaults=0x0 flags=0x10 color=0x00000000 category=recommendation vis=PUBLIC)) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Mein Layout für RemoteViews haben Imageview innerhalb Linearlayout und benutzerdefinierte Textview-Klassen, die Textview erweitern.

Mein Code Benachrichtigung für die Erstellung ist

private void showCustomNotification(ABCNotification notification) { 
     RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.layout_notification); 
     PendingIntent contentPendingIntent = PendingIntent.getBroadcast(mContext, 0, notification.getContentIntent(), PendingIntent.FLAG_UPDATE_CURRENT); 

       NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext); 
       builder.setSmallIcon(R.drawable.ic_notification).setAutoCancel(true).setContentIntent(contentPendingIntent); 

       // Set Notification Priority 
       builder.setPriority(notification.getNotificationPriority()); 

       // Set Notification Category 
       builder.setCategory(notification.getNotificationCategory()); 

       // Set Notification Visibility 
       builder.setVisibility(notification.getNotificationVisibility()); 

notificationView.setTextViewText(R.id.tv_notification_title, notification.getTitle()); 
     notificationView.setTextViewText(R.id.tv_notification_message, notification.getMessage()); 
     notificationView.setTextViewText(R.id.tv_notification_subtext, notification.getSubtext()); 
     Notification notif = builder.build(); 
       if (null != notif) { 
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { 
         notif.bigContentView = notificationView; 
        } 
        notif.contentView = notificationView; 
        NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); 
        notificationManager.notify(mNotificationId, notif); 
       } 
    } 

mein Layout für RemoteViews so etwas wie dieses habe ich fast die ganze Lösung auf Stack-Überlauf gesehen

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:paddingBottom="4dp" 
      android:paddingTop="4dp"> 

      <com.abc.ui.customviews.fonts.TextViewYMRegular 
       android:id="@+id/tv_notification_title" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginBottom="8dp" 
       android:ellipsize="end" 
       android:singleLine="true" 
       android:textColor="@color/black" 
       android:textSize="16sp" /> 

      <com.abc.ui.customviews.fonts.TextViewYMMedium 
       android:id="@+id/tv_notification_message" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginBottom="8dp" 
       android:textColor="@color/black" 
       android:textSize="14sp" /> 

      <com.abc.ui.customviews.fonts.TextViewYMMedium 
       android:id="@+id/tv_notification_subtext" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textColor="@color/black" 
       android:textSize="12sp" /> 
     </LinearLayout> 

</LinearLayout> 

ist. Nichts scheint zu funktionieren.

Lustiger Teil ist, es war perfekt vor. Aber irgendwann fing es an zu stürzen. Alles in 2 Stunden.

+1

Sie können keine benutzerdefinierten 'View's für' RemoteViews' verwenden. Sie können nur die hier aufgeführten Klassen verwenden (https://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout). Beachten Sie, wo angegeben wird "Nachkommen dieser Klassen werden nicht unterstützt". –

+1

Danke Mike. Es scheint, benutzerdefinierte TextViews waren das Problem. Jetzt ist es behoben. :-) –

Antwort

4

Wie von Mike kommentiert, können wir keine benutzerdefinierten Ansichten verwenden, selbst wenn sie direkte Nachkommen von systemeigenen Ansichten sind.

Ich war mit TextViewYMRegular, die TextView erweitert wurde. Ich habe alle benutzerdefinierten TextViews in native geändert.

Wir können nur die Klassen listed here mit RemoteViews verwenden.