如何把媒体控制器button放在通知栏上?

我正在创build音乐播放器应用程序。 我想在通知栏上显示媒体控制器,而我的应用程序在后台运行。 它看起来像谷歌播放器。

在这里输入图像说明

这个怎么做?

Solutions Collecting From Web of "如何把媒体控制器button放在通知栏上?"

要在您的应用程序中获取媒体播放器控制器,只需遵循以下步

在你的MainActivity中调用这个方法

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

创build一个新的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); } } 

创build一个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(); } } 

Notificationlayout.xml的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); 

而当你想取消通知:(因为这是一个进行中的通知)

 nPanel.notificationCancel(); 

然后为通知调用者创build类:

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

然后你需要为button创build一个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"/> 

您需要创build一个RemoteView并将其显示为通知。

请参阅以下文件

状态通知 (创build自定义通知布局)

从通知返回/发送数据到您的原始活动; 以上示例所需的更改:

 NotificationPanel nPanel = new NotificationPanel(MyActivity) 

如何使用通知button恢复创build通知的相同堆栈和活动:

1)确保活动没有被销毁(可选),改变后退button把任务放在后面,而不是销毁它:

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

2)在清单中join这个活动:

 android:launchMode="singleTop" 

3)为您的意图实例添加这些标志:(卷是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(Intent intent)callback您的Activity中的意图:

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