Как установить кнопку контроллера мультимедиа на панели уведомлений?

Я создаю приложение для музыкального проигрывателя. Я хочу показать медиа-контроллер на панели уведомлений, пока мое приложение работает в фоновом режиме. Он похож на игрока Google.

Введите описание изображения здесь

Как это сделать?

Для получения контроллера медиаплеера в приложении просто выполните следующее:

Вызовите этот метод в своем MainActivity

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

Создать новый 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); } } 

Создайте класс 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(); } } 

XML-макет для Notificationlayout.xml

 <?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/msglbl" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="test" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/msglbl" /> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="play" android:layout_margin="10dp"/> </RelativeLayout> 

Вот пример, приведенный выше, для нового API

В основном, когда вы хотите запустить уведомление, создайте экземпляр класса:

 NotificationPanel nPanel = new NotificationPanel(MyActivity); 

И когда вы хотите отменить уведомление: (поскольку это уведомление onGoing)

 nPanel.notificationCancel(); 

Затем создайте класс для вызывающего уведомления:

 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); } } 

Затем добавьте возвращаемый класс, который принимает ожидающее намерения:

 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(); } } 

Затем вам нужно создать файл XML для кнопки. Это простой:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="volume" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="Stop" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/msglbl" /> 

И последнее, и не в последнюю очередь, файл манифеста:

  <activity android:name=".NotificationReturnSlot" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"/> 

Вам необходимо создать RemoteView и показать его как уведомление.

Пожалуйста, обратитесь к следующему документу

Уведомления о состоянии (создание настраиваемого макета уведомления)

Возвращать / отправлять данные из уведомлений в исходную активность; Изменения, необходимые для приведенного выше примера:

 NotificationPanel nPanel = new NotificationPanel(MyActivity) 

Как использовать кнопку уведомления, чтобы возобновить тот же стек и активность, которые создали уведомление:

1) Убедитесь, что действие не разрушено (необязательно), измените кнопку «Назад», чтобы вернуть задачу обратно, а не уничтожить:

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

2) В «Времени» добавьте это в действие:

 android:launchMode="singleTop" 

3) Добавьте эти флаги в свой экземпляр Intent: (том является экземпляром Intent)

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

А также вы можете добавить следующие (необязательные):

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

4) В экземпляре PendingIntent не используются флаги:

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

5) И поймайте намерение в своей деятельности с помощью onNewIntent (намерение намерения) перезвонить:

 @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"); } } }