NotificationCompat.setStyle () non può get Notification.MediaStyle

Ho scoperto che il setStyle di MediaStyle non funziona quando sto utilizzando NotificationCompat.builder(this) per fare una notifica.

Voglio dire, quando si utilizza questo su NotificationCompat.Builder(this) :

  • Android non riconosce il riconoscimento vocale solo un risultato?
  • Come risolvere questa applicazione gradle: errore dexDebug?
  • Errore: l'esecuzione non è rioutput per l'attività, finita con valore di output non zero
  • Modifica il colore della forma in un Android XML
  • exception durante l'utilizzo di annotazioni di jackson e ormlite in un unico object
  • Come posso interrompere MediaStore.ACTION_IMAGE_CAPTURE duplicare le immagini
  •  .setStyle(new Notification.MediaStyle() .setMediaSession(mySession)) 

    Dice che vuole get NotificationCompat.style invece di Notification.MediaStyle .

    Puoi aiutarmi a risolvere questo problema? C'è qualche sostituzione per la NotificationCompat?

    Grazie.

  • Android - Come rigenerare la class R?
  • Errore: solo il thread originale che ha creato una gerarchia di visualizzazione può toccare le sue viste in Xamarin
  • Elimina il log di chiamata in android per un numero particolare
  • Come impostare il colore disabilitato del button con AppCompat?
  • Eccezionale exception dalle nuove mappe google v2
  • Aggiungi clickListner per il button all'interno di un cardView popolato utilizzando un recyclerView
  • 5 Solutions collect form web for “NotificationCompat.setStyle () non può get Notification.MediaStyle”

    Non esiste un `NotificationCompat.MediaStyle` nel pacchetto v4, ma esiste nel pacchetto v7. Assicurati di importre: importzione android.support.v7.app.NotificationCompat; invece del pacchetto v4. Funziona per me da v22.2.0 della libreria appcompat.

    A partire dalla versione 26.0.0, il pacchetto v7 è deprecato . Tuttavia, tutte le funzionalità sono state aggiunte a v4! Sìì! 🎉

    fonte

    Guillermo è corretto, MediaStyle esiste solo nel pacchetto di supporto v7, ma purtroppo potrebbe rivelarsi problematico per la correzione del pacchetto, in quanto questo potrebbe essere solo parte del tuo problema.

    Primo context …
    Ogni chiamata per configurare NotificationBuilder restituisce l'istanza del constructor, che a sua volta consente all'operatore di effettuare le chiamate di configuration della catena come segue:

      // NOTE: To re-iterate, the import you would be using is: import android.support.v7.app.NotificationCompat; NotificationCompat.Builder myBuilder = new NotificationCompat.Builder(currContext) .setSmallIcon(R.drawable.ic_notification_small) .setLargeIcon(BitmapFactory.decodeResource(currContext.getResources(), R.drawable.ic_notification_large)) .setStyle(new NotificationCompat.MediaStyle().setMediaSession(sessionCompat.getSessionToken())); 

    Questo è un model molto normale e conveniente, l'unico problema è che l'istanza Builder restituito è di tipo android.support.v4.app.NotificationCompat.Builder e non l'android.support.v7.app.NotificationCompat.Builder che sei aspettando.

    Quindi la correzione è ingannevolmente semplice … mantenere esplicitamente l'istanza del Builder v7 quando fai queste chiamate 🙂

      // NOTE: To re-iterate, the import you would be using is: import android.support.v7.app.NotificationCompat; NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(currContext); mBuilder.setSmallIcon(R.drawable.ic_notification_small); mBuilder.setLargeIcon(BitmapFactory.decodeResource(currContext.getResources(), R.drawable.ic_notification_large)); mBuilder.setStyle(new NotificationCompat.MediaStyle().setMediaSession(sessionCompat.getSessionToken())); 

    Aggiornare

    Questo problema è ora risolto se si effettua la connessione in Revisione di supporto della libreria di Android 22.2.1 (luglio 2015):

    • Fornito di un'API [n] per la class NotificationCompat.MediaStyle

    Vecchia soluzione alternativa

    Ecco la mia soluzione per " Non c'è NotificationCompat.MediaStyle nella libreria di supporto ".

    Evita la duplicazione della logica dell'applicazione e rende facile MediaStyle la soluzione se / quando NotificationCompat support MediaStyle .

    Scopo: questo consente di utilizzare MediaStyle in API 21+ (che offre layout di notifica compatta ed espansa, con pulsanti) o un layout di notifica ordinario sulle versioni precedenti di Android (solo un layout con pulsanti).

    Nota: se il tuo objective è quello di mettere i pulsanti sulla schermata di block in più versioni di Android, puoi utilizzare questo approccio per implementare notifiche di block per API 21+ e implementare anche un widget di block delle API più vecchie.

    Procedura: In primo luogo, crea un nuovo pacchetto di compatibilità di build di notifica, partendo da un'interface per alternare le implementazioni sottostanti. Culla di NotificationCompat.Builder , spogliata alle funzioni necessarie:

     public interface NotificationBuilder { public NotificationBuilder setWhen(long when); public NotificationBuilder setUsesChronometer(boolean b); public NotificationBuilder setSmallIcon(int icon); // ... /** Sets MediaStyle with setShowActionsInCompactView(). */ public NotificationBuilder setMediaStyleActionsInCompactView(int... actions); public Notification build(); } 

    In secondo luogo, eseguire un'implementazione basata su NotificationCompat.Builder :

     public class V20Builder implements NotificationBuilder { private NotificationCompat.Builder builder; public V20Builder(Context context) { builder = new NotificationCompat.Builder(context); } @Override public NotificationBuilder setWhen(long when) { builder.setWhen(when); return this; } @Override public NotificationBuilder setUsesChronometer(boolean b) { builder.setUsesChronometer(b); return this; } @Override public NotificationBuilder setSmallIcon(int icon) { builder.setSmallIcon(icon); return this; } // ... @Override public NotificationBuilder setMediaStyleActionsInCompactView(int... actions) { // Noop for Android API V20-. return this; } @Override public Notification build() { return builder.build(); } } 

    In terzo luogo, fare un'implementazione basata su Notification.Builder :

     @TargetApi(21) public class V21Builder implements NotificationBuilder { private Notification.Builder builder; public V21Builder(Context context) { builder = new Notification.Builder(context); } @Override public NotificationBuilder setWhen(long when) { builder.setWhen(when); return this; } @Override public NotificationBuilder setUsesChronometer(boolean b) { builder.setUsesChronometer(b); return this; } @Override public NotificationBuilder setSmallIcon(int icon) { builder.setSmallIcon(icon); return this; } // ... @Override public NotificationBuilder setMediaStyleActionsInCompactView(int... actions) { new Notification.MediaStyle(builder).setShowActionsInCompactView(actions); return this; } @Override public Notification build() { return builder.build(); } } 

    In quarto luogo, aggiungere un metodo di fabbrica per istanziare il constructor giusto:

     public NotificationBuilder makeBuilder() { if (Build.VERSION.SDK_INT >= 21) { // Load the API V21 class only if the OS can load it. return new V21Builder(context); } return new V20Builder(context); } 

    Non sembra essere un backport di MediaStyle nel pacchetto di supporto Android in questo momento.

    Infine, una volta che il codice sorgente Android 5.0 diventa disponibile, qualcuno potrebbe essere in grado di creare un backport indipendente. Oppure, forse il pacchetto di supporto Android aggiungerà un backport in futuro.

    Ma al momento attuale, AFAICT, non è ansible creare un MediaStyle da utilizzare con NotificationCompat .

    Fix temporanei: Dal 9/11/2017, si può utilizzare la class completamente qualificata come un lavoro. Testato utilizzando Android 3.0 Beta 5 Preview, con strumenti di build di API 26.0.1

     // The notification builder import android.support.v4.app.NotificationCompat; // The media style should be of type, has "media in the path // android.support.v4.media.app.NotificationCompat.MediaStyle; Notification noti = new NotificationCompat.Builder(this, "Quiz") .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(getString(R.string.app_name)) .setContentText("Hi this is a media notification") .setContentIntent(pendingIntent) .setStyle(new android.support.v4.media.app.NotificationCompat.MediaStyle() .setMediaSession(mMediaSession.getSessionToken())) .build(); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.