wake-up-neo.com

Wie lege ich den Mediencontroller-Button auf die Benachrichtigungsleiste

Ich erstelle eine Musik-Playeranwendung. Ich möchte den Mediencontroller in der Benachrichtigungsleiste anzeigen, während meine Anwendung im Hintergrund ausgeführt wird. Es sieht aus wie Google Player.

enter image description here

Wie macht man das?

27
Leap Bun

Um den Media Player-Controller in Ihre App zu laden, folgen Sie einfach diesen Anweisungen

Rufe diese Methode in deiner MainActivity auf

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

Neue MynotificationClass erstellen

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

}

Eine HelperActivity-Klasse erstellen

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-Layout für 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>
16
Roadies

Hier ist das obige Beispiel korrekt für die neue API

Wenn Sie eine Benachrichtigung starten möchten, instanziieren Sie die Klasse:

NotificationPanel nPanel = new NotificationPanel(MyActivity);

Und wenn Sie die Benachrichtigung abbrechen möchten: (da es sich um eine onGoing-Benachrichtigung handelt)

nPanel.notificationCancel();    

Dann legen Sie die Klasse für den Benachrichtigungsrufer an:

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

Fügen Sie dann die Rückgabeklasse hinzu, die die ausstehende Absicht akzeptiert: 

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

Dann müssen Sie eine XML-Datei für die Schaltfläche erstellen. Dies ist ein einfaches:

<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" />

Zu guter Letzt die Manifest-Datei:

   <activity Android:name=".NotificationReturnSlot"
        Android:launchMode="singleTask"
        Android:taskAffinity=""
        Android:excludeFromRecents="true"/>
18
Gilco

Daten aus der Benachrichtigung an Ihre ursprüngliche Aktivität zurückgeben/senden; die für das obige Beispiel erforderlichen Änderungen:

NotificationPanel nPanel = new NotificationPanel(MyActivity)

So verwenden Sie die Benachrichtigungsschaltfläche zum Fortsetzen des Stapels und der Aktivität, mit der die Benachrichtigung erstellt wurde:

1) Stellen Sie sicher, dass die Aktivität nicht zerstört ist (optional), ändern Sie die Schaltfläche "Zurück", um die Aufgabe in den Hintergrund zu stellen und nicht zu zerstören:

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

2) Füge dies im Menifest der Aktivität hinzu:

Android:launchMode="singleTop"

3) Fügen Sie diese Flags für Ihre Intent-Instanz hinzu: (Volume ist die Intent-Instanz)

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

und außerdem können Sie Folgendes hinzufügen (optional):

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

4) Verwenden Sie in der PendingIntent-Instanz keine Flags:

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

5) Mit onNewIntent (Intent Intent) Rückruf die Absicht in Ihrer Aktivität erfassen:

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

Sie müssen ein RemoteView erstellen und als Benachrichtigung anzeigen. 

Bitte beachten Sie das folgende Dokument 

Statusbenachrichtigungen (Erstellen eines benutzerdefinierten Benachrichtigungslayouts)

0
Julian Shen