2014-10-05 15 views
5

Ho il seguente servizio che mostra la notifica nella mia applicazione, fino a questo momento si presenta bene, ma non gestisce gli eventi di clic come. Come gestisco questi?La notifica con i pulsanti non gestisce gli eventi

Requisito: Vorrei che questa notifica fosse presente finché il video è in riproduzione. Spero che questo sia il modo per farlo.

public class CustomNotifications extends Service implements 
     INotificationService { 

    private static CustomNotifications instance; 

    private Context ctx; 
    private NotificationManager mNotificationManager; 

    private String start = "play"; 
    private String stop = "stop"; 

    private VideoCastManager mCastManager; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if (null != intent) { 
      String action = intent.getAction(); 
      if (action != null) { 
       if (action.equals(start)) { 

       } else if (action.equals(stop)) { 

       } 
      } 
     } 
     return 1; 
    } 

    public void startNofication(Activity activity, String text) { 
     ctx = this.getApplicationContext(); 
     Intent resultIntent = new Intent(this, FullscreenActivity.class); 
     PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 
       0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
       this).setSmallIcon(R.drawable.ic_launcher) 
       .setContentTitle("Media Cast").setTicker(text) 
       .setAutoCancel(false).setOngoing(true) 
       .setContentIntent(resultPendingIntent); 

     RemoteViews contentView = new RemoteViews(ctx.getPackageName(), 
       com.me.app.mediacast.R.layout.notification_layout); 

     contentView.setTextViewText(
       com.me.app.mediacast.R.id.notifcation_label, text); 
     contentView.setImageViewResource(
       com.me.app.mediacast.R.id.notification_button, 
       R.drawable.ic_av_play_dark); 
     // set the button listeners 
     setListeners(contentView); 

     mBuilder.setContent(contentView); 

     int mNotificationId = 001; 
     // NotificationManager mNotifyMgr = (NotificationManager) activity 
     // .getSystemService(activity.NOTIFICATION_SERVICE); 
     // mNotifyMgr.notify(mNotificationId, mBuilder.build()); 
     startForeground(mNotificationId, mBuilder.build()); 
    } 

    private void setListeners(RemoteViews contentView) { 
     Intent radio = new Intent(start); 
     radio.setPackage(getPackageName()); 
     PendingIntent pRadio = PendingIntent.getActivity(this, 0, radio, 0); 
     contentView.setOnClickPendingIntent(
       com.me.app.mediacast.R.id.notification_button, pRadio); 
    } 

    @Override 
    public boolean stopService() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean startService(String text) { 
     startNofication((Activity) ContentHelper.getCurrentActivity(), text); 
     return true; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     try { 
      mCastManager = VideoCastManager.getInstance(); 
     } catch (CastException e) { 
      e.printStackTrace(); 
     } 
     mCastManager.setNottificationService(this); 
     mCastManager.startNotificationService(); 
    } 
} 

il seguente è il layout xml.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/black" > 

    <TextView 
     android:id="@+id/notifcation_label" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@+id/btn1" /> 

    <TextView 
     android:id="@+id/notifcation_subtext" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/notifcation_label" /> 

    <ImageButton 
     android:id="@+id/notification_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:layout_margin="10dp" 
     android:layout_marginRight="19dp" /> 

</RelativeLayout> 

Sto solo cercando di ottenere questo scatto persino le maniglie così, posso mostrare il pulsante di commutazione per mettere in pausa o giocare a seconda dello stato della richiesta.

Grazie in anticipo per la ricerca di questo.

+2

Hai provato risposte su http://stackoverflow.com/questions/21872022/notification-for-android-music-player e http://stackoverflow.com/questions/24436977/play-pause-button-image-in-notification-android? –

risposta

1

L'ho risolto utilizzando quanto segue in un 'servizio'. Inoltre, non dimenticare di aggiungere filtri di intent nel file manifest.

Intent resultIntent = new Intent(this, FullscreenActivity.class); 
    resultIntent.setAction(Intent.ACTION_MAIN); 
    resultIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

    PendingIntent pintent = PendingIntent.getActivity(ctx, 0, resultIntent, 
      0); 
    PendingIntent pendingIntent = null; 
    Intent intent = null; 
    // Inflate a remote view with a layout which you want to display in the 
    // notification bar. 
    if (mRemoteViews == null) { 
     mRemoteViews = new RemoteViews(getPackageName(), 
       R.layout.custom_notification); 
    } 

    /** 
    * add handlers to the buttons 
    * 
    */ 
    Uri uri = info.getMetadata().getImages().get(0).getUrl(); 
    Bitmap bmp = null; 
    if (uri != null) { 
     URL url; 
     try { 
      url = new URL(uri.toString()); 
      bmp = BitmapFactory.decodeStream(url.openStream()); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
    if (bmp != null) { 
     mRemoteViews.setImageViewBitmap(R.id.iconView, bmp); 
    } 
    if (isPlaying) { 
     mRemoteViews.setImageViewResource(R.id.playPauseView, 
       R.drawable.ic_av_pause_sm_dark); 
    } else { 
     mRemoteViews.setImageViewResource(R.id.playPauseView, 
       R.drawable.ic_av_play_sm_dark); 
    } 
    mRemoteViews.setTextViewText(R.id.titleView, info.getMetadata() 
      .getString(MediaMetadata.KEY_TITLE)); 
    intent = new Intent(play); 
    pendingIntent = PendingIntent.getService(getApplicationContext(), 
      REQUEST_CODE_STOP, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    mRemoteViews.setOnClickPendingIntent(R.id.playPauseView, pendingIntent); 

    Intent destroy = new Intent(stop); 
    PendingIntent pendingIntent1 = PendingIntent.getService(
      getApplicationContext(), REQUEST_CODE_STOP, destroy, 
      PendingIntent.FLAG_UPDATE_CURRENT); 

    mRemoteViews.setOnClickPendingIntent(R.id.removeView, pendingIntent1); 

    /** 
    * 
    * 
    */ 
    // Create the notification instance. 
    mNotification = new NotificationCompat.Builder(getApplicationContext()) 
      .setSmallIcon(R.drawable.ic_launcher).setOngoing(true) 
      .setWhen(System.currentTimeMillis()).setContent(mRemoteViews) 
      .setContentIntent(pintent).build(); 

    mNotifiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    mNotifiManager.notify(NOTIFICATION_ID, mNotification); 

AndroidManifest

<intent-filter> 
     <action android:name="com.me.app.mediacast.PLAY" /> 
     <action android:name="com.me.app.mediacast.PAUSE" /> 
     <action android:name="com.me.app.mediacast.STOP" /> 

     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
0

Non esiste un supporto ufficiale per gli eventi di clic sui widget in un RemoteViews in un Notification e non funzioneranno sulla maggior parte dei dispositivi. Si prega di utilizzare notification actions.

Vorrei che questa notifica fosse presente finché il video è in riproduzione. Spero che questo sia il modo per farlo.

Utilizzare un Notification per controllare la riproduzione di video sarebbe piuttosto insolito. La maggior parte dei lettori video visualizza un pannello di controllo quando il video viene toccato, o utilizza in altro modo eventi di tocco o gesti sul lettore stesso.

+0

Grazie per la risposta. sì, la notifica per il video è insolita. Ho dimenticato di menzionare che la mia app trasmette video al dongle del Chromecast. – Zeus

Problemi correlati