tarda - curso android desarrollo de aplicaciones móviles pdf
¿Cómo poner el botón del controlador multimedia en la barra de notificaciones? (4)
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.
¿Como hacer esto?
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 intento 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:
<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" />
Por último, el archivo Manifiesto:
<activity android:name=".NotificationReturnSlot"
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true"/>
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 pila 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 (intento 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");
}
}
}
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)
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
<?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>