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

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

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

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

Solutions Collecting From Web of "Как установить кнопку контроллера мультимедиа на панели уведомлений?"

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

Вызовите этот метод в своем 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"); } } }