¿Cómo poner el botón del controlador multimedia en la barra de notificaciones?

Estoy creando una aplicación de reproductor de música. Quiero mostrar el controlador de medios en la barra de notificaciones mientras mi aplicación se ejecuta en segundo plano. Se parece a Google player.

enter image description here

¿Como hacer esto?

Para obtener el controlador de reproductor de medios en su aplicación simplemente siga esto:

Llame a este método en su MainActivity

public void showNotification(View view){ new MyNotification(this); finish(); } 

Crea una nueva MynotificationClass

 public class MyNotification extends Notification { private Context ctx; private NotificationManager mNotificationManager; @SuppressLint("NewApi") public MyNotification(Context ctx){ super(); this.ctx=ctx; String ns = Context.NOTIFICATION_SERVICE; mNotificationManager = (NotificationManager) ctx.getSystemService(ns); CharSequence tickerText = "Shortcuts"; long when = System.currentTimeMillis(); Notification.Builder builder = new Notification.Builder(ctx); @SuppressWarnings("deprecation") Notification notification=builder.getNotification(); notification.when=when; notification.tickerText=tickerText; notification.icon=R.drawable.ic_launcher; RemoteViews contentView=new RemoteViews(ctx.getPackageName(), R.layout.messageview); //set the button listeners setListeners(contentView); notification.contentView = contentView; notification.flags |= Notification.FLAG_ONGOING_EVENT; CharSequence contentTitle = "From Shortcuts"; mNotificationManager.notify(548853, notification); } public void setListeners(RemoteViews view){ //radio listener Intent radio=new Intent(ctx,HelperActivity.class); radio.putExtra("DO", "radio"); PendingIntent pRadio = PendingIntent.getActivity(ctx, 0, radio, 0); view.setOnClickPendingIntent(R.id.radio, pRadio); //volume listener Intent volume=new Intent(ctx, HelperActivity.class); volume.putExtra("DO", "volume"); PendingIntent pVolume = PendingIntent.getActivity(ctx, 1, volume, 0); view.setOnClickPendingIntent(R.id.volume, pVolume); //reboot listener Intent reboot=new Intent(ctx, HelperActivity.class); reboot.putExtra("DO", "reboot"); PendingIntent pReboot = PendingIntent.getActivity(ctx, 5, reboot, 0); view.setOnClickPendingIntent(R.id.reboot, pReboot); //top listener Intent top=new Intent(ctx, HelperActivity.class); top.putExtra("DO", "top"); PendingIntent pTop = PendingIntent.getActivity(ctx, 3, top, 0); view.setOnClickPendingIntent(R.id.top, pTop);*/ //app listener Intent app=new Intent(ctx, com.example.demo.HelperActivity.class); app.putExtra("DO", "app"); PendingIntent pApp = PendingIntent.getActivity(ctx, 4, app, 0); view.setOnClickPendingIntent(R.id.btn1, pApp); } } 

Crear una clase HelperActivity

 public class HelperActivity extends Activity { private HelperActivity ctx; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); ctx = this; String action = (String) getIntent().getExtras().get("DO"); if (action.equals("radio")) { //Your code } else if (action.equals("volume")) { //Your code } else if (action.equals("reboot")) { //Your code } else if (action.equals("top")) { //Your code } else if (action.equals("app")) { //Your code } if (!action.equals("reboot")) finish(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } } 

Diseño XML para Notificationlayout.xml

       

Aquí está el ejemplo anterior hecho correctamente a la nueva API

En general, cuando quiera iniciar una notificación, cree una instancia de la clase:

 NotificationPanel nPanel = new NotificationPanel(MyActivity); 

Y cuando desee cancelar la notificación: (ya que se trata de una notificación onGoing)

 nPanel.notificationCancel(); 

Luego crea la clase para la persona que llama a la notificación:

 public class NotificationPanel { private Context parent; private NotificationManager nManager; private NotificationCompat.Builder nBuilder; private RemoteViews remoteView; public NotificationPanel(Context parent) { // TODO Auto-generated constructor stub this.parent = parent; nBuilder = new NotificationCompat.Builder(parent) .setContentTitle("Parking Meter") .setSmallIcon(R.drawable.ic_launcher) .setOngoing(true); remoteView = new RemoteViews(parent.getPackageName(), R.layout.notificationview); //set the button listeners setListeners(remoteView); nBuilder.setContent(remoteView); nManager = (NotificationManager) parent.getSystemService(Context.NOTIFICATION_SERVICE); nManager.notify(2, nBuilder.build()); } public void setListeners(RemoteViews view){ //listener 1 Intent volume = new Intent(parent,NotificationReturnSlot.class); volume.putExtra("DO", "volume"); PendingIntent btn1 = PendingIntent.getActivity(parent, 0, volume, 0); view.setOnClickPendingIntent(R.id.btn1, btn1); //listener 2 Intent stop = new Intent(parent, NotificationReturnSlot.class); stop.putExtra("DO", "stop"); PendingIntent btn2 = PendingIntent.getActivity(parent, 1, stop, 0); view.setOnClickPendingIntent(R.id.btn2, btn2); } public void notificationCancel() { nManager.cancel(2); } } 

A continuación, agregue la clase de devolución que acepte el bash pendiente:

 public class NotificationReturnSlot extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); String action = (String) getIntent().getExtras().get("DO"); if (action.equals("volume")) { Log.i("NotificationReturnSlot", "volume"); //Your code } else if (action.equals("stopNotification")) { //Your code Log.i("NotificationReturnSlot", "stopNotification"); } finish(); } } 

Luego necesita hacer un archivo XML para el botón. Esto es muy simple:

     

Por último, el archivo Manifiesto:

   

Necesita crear una vista remota y mostrarla como una notificación.

Por favor, consulte el siguiente documento

Notificaciones de estado (Creación de un diseño de notificación personalizado)

Devuelve / envía datos desde la notificación a tu Actividad original; los cambios necesarios para el ejemplo anterior:

 NotificationPanel nPanel = new NotificationPanel(MyActivity) 

Cómo usar el botón de notificación para reanudar la misma stack y actividad que creó la notificación:

1) Asegúrate de que la Actividad no esté Destruida (opcional), cambia el botón Atrás para poner la tarea en la parte posterior y no destruirla:

 @Override void onBackPressed() { Log.d("onBackPressed", "onBackPressed Called"); moveTaskToBack(true); } 

2) En el Menifiesto, agregue esto a la Actividad:

 android:launchMode="singleTop" 

3) Agregue esos indicadores para su instancia de intención: (el volumen es la instancia de intención)

 Intent volume = new Intent(....); .... volume.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); volume.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

y también puedes agregar lo siguiente (opcional):

 volume.setAction(Intent.ACTION_MAIN); volume.addCategory(Intent.CATEGORY_LAUNCHER) 

4) En la instancia PendingIntent, no use ninguna marca:

 PendingIntent btn1 = PendingIntent.getActivity(parent, 0, volume, 0); 

5) Y capte la intención en su actividad con onNewIntent (bash intencionado) de devolver la llamada:

 @Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); setIntent(intent); Log.i("onNewIntent", intent.toString()); // DEBUG - very useful if (intent.getExtras() != null) { // As the Intent we send back has extras, if it don't, it is a different Intent. it is possible to use TRY {} CATCH{} for this as well to find if Extras is NULL. String tmp; tmp = intent.getExtras().getString("DO"); if (tmp != null) { if (tmp.equals("volume")) Log.i("onNewIntent", "Volume"); else if (tmp.equals("stop")) Log.i("onNewIntent", "Stop"); else Log.i("onNewIntent", "Didnt capture the extras of the Intent - " + tmp); } else { Log.i("onNewIntent", "No new Intent"); } } }