2013-08-05 77 views
2

我在我的应用中使用MediaPlayer。我在我的应用程序中添加了带有媒体播放器控件(如上一个,下一个和停止按钮)的Ongoing Notification,以便用户无需前往应用程序即可访问这些控件。它在平台上看起来很好4.x。以下是Android 4.2.2上的通知截图。Android:自定义通知外观问题

Notification on Android 4.2.2

但是,在Android 2.2,它看起来像这样:

Notification on Android 2.2

我的代码如下:

private Notification generateNotification() { 
    Log.d(TAG, "generateNotification called"); 

    Intent actionIntent = new Intent(getApplicationContext(), 
      AartiActivity.class); 
    PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 
      0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    RemoteViews mNotificationView = new RemoteViews(getPackageName(), 
      R.layout.notification_view); 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(
      getApplicationContext()); 
    builder.setSmallIcon(R.drawable.icon); 
    builder.setContent(mNotificationView); 
    builder.setOngoing(true); 
    builder.setTicker("Aarti Sangrah"); 
    builder.setContentIntent(pi); 
    mNotificationView.setImageViewResource(R.id.imgAppIc, R.drawable.icon); 
    mNotificationView.setTextViewText(R.id.txtAartiPlaying, mediaName); 

    return builder.build(); 
}// generateNotification 

然后,我在onPrepared()startForeground(1, generateNotification());

Remote Views从API级别1开始可用。并且,它也得到了很好的支持。我在某处读过,在Honeycomb之前没有得到支持。但是,在具有Android 2.x的多款设备上,此功能可用。另外,为了检查这个,我从here看了Android 2.2的音乐播放器的源代码。

这里是它的Music Player Service的片段。

RemoteViews views = new RemoteViews(getPackageName(), 
       R.layout.statusbar); 
     views.setOnClickPendingIntent(R.id.btnTest, PendingIntent 
       .getActivity(getApplicationContext(), 0, 
         new Intent(getApplicationContext(), 
           MusicBrowserActivity.class), 
         PendingIntent.FLAG_UPDATE_CURRENT)); 
     views.setImageViewResource(R.id.icon, 
       R.drawable.stat_notify_musicplayer); 
     if (getAudioId() < 0) { 
      // streaming 
      views.setTextViewText(R.id.trackname, getPath()); 
      views.setTextViewText(R.id.artistalbum, null); 
     } else { 
      String artist = getArtistName(); 
      views.setTextViewText(R.id.trackname, getTrackName()); 
      if (artist == null || artist.equals(MediaStore.UNKNOWN_STRING)) { 
       artist = getString(R.string.unknown_artist_name); 
      } 
      String album = getAlbumName(); 
      if (album == null || album.equals(MediaStore.UNKNOWN_STRING)) { 
       album = getString(R.string.unknown_album_name); 
      } 

      views.setTextViewText(
        R.id.artistalbum, 
        getString(R.string.notification_artist_album, artist, 
          album)); 
     } 

     Notification status = new Notification(); 
     status.contentView = views; 
     status.flags |= Notification.FLAG_ONGOING_EVENT; 
     status.icon = R.drawable.stat_notify_musicplayer; 
     status.contentIntent = PendingIntent.getActivity(this, 0, 
       new Intent("com.android.music.PLAYBACK_VIEWER") 
         .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0); 
     startForeground(PLAYBACKSERVICE_STATUS, status); 

远程视图已在此代码中使用。它有两个TextViews。我通过向它添加一个按钮来修改代码,并且还对按钮单击执行了操作。在每个平台上一切正常。

同样的事情,我想用我的应用程序。但是,在2.2上,它看起来像我在屏幕截图中显示的那样。我以为这是因为白色的文字和按钮,所以试图改变按钮和文字的颜色,但没有运气。据我所知,只有我想通过Android 2.2(在我的情况下)没有夸大远程视图。我不明白为什么通知未能在Android 2.x平台上正常显示。

回答

2

我解决了我的问题。这是我的解决方案。

private Notification generateNotification() { 
     Log.d(TAG, "generateNotification called"); 

     Intent actionIntent = new Intent(getApplicationContext(), 
       AartiActivity.class); 
     PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 
       0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     RemoteViews mNotificationView = new RemoteViews(getPackageName(), 
       R.layout.notification_view); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      NotificationCompat.Builder builder = new NotificationCompat.Builder(
        getApplicationContext()); 
      builder.setSmallIcon(R.drawable.icon); 
      builder.setContent(mNotificationView); 
      builder.setOngoing(true); 
      builder.setTicker("Aarti Sangrah"); 
      builder.setContentIntent(pi); 
      mNotificationView.setImageViewResource(R.id.imgAppIc, 
        R.drawable.icon); 
      mNotificationView.setTextViewText(R.id.txtAartiPlaying, mediaName); 
      mNotificationView.setTextColor(R.id.txtAartiPlaying, getResources() 
        .getColor(android.R.color.holo_orange_light)); 

      return builder.build(); 
     } else { 
      mNotificationView.setTextViewText(R.id.txtAartiPlaying, mediaName); 
      mNotificationView.setTextColor(R.id.txtAartiPlaying, getResources() 
        .getColor(android.R.color.holo_orange_light)); 
      Notification statusNotification = new Notification(); 
      statusNotification.contentView = mNotificationView; 
      statusNotification.flags |= Notification.FLAG_ONGOING_EVENT; 
      statusNotification.icon = R.drawable.icon; 
      statusNotification.contentIntent = PendingIntent.getActivity(this, 
        0, new Intent(getApplicationContext(), AartiActivity.class) 
          .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0); 
      return statusNotification; 
     } 
    }// generateNotification 

但是,我很安静的惊讶。 NotificationCompat.Builder可用于支持包,并提供了向后兼容性。但是,就我而言,它仅适用于Honeycomb及更高版本。按照此section

并非所有通知功能都可用于特定版本,即使设置它们的方法位于支持库类NotificationCompat.Builder中。例如,取决于扩展通知的操作按钮仅出现在Android 4.1及更高版本上,因为扩展通知本身仅适用于Android 4.1及更高版本。

但是,我不认为这适用于我的情况。 NotificationCompat.Builder与远程视图工作,但没有在2.x上工作(至少在我的情况下,可能是我错了或失去了一些东西)。如果有人在这方面有任何信息或资源,请分享一下,以便我能弄清楚我的错误。

+2

NotificationCompat可帮助您构建一个适用于所有API级别的通知,但这并不意味着它允许您在旧版本中使用新功能。旧版本无法处理自定义布局或按钮,因此在实践中,您需要定义3种布局:消费通知,未扩展的新通知(针对您尚未花费的API级别以及用户或系统何时收到通知)和旧的通知(只是文本)。当然,这取决于您的最低API级别。如果您决定使用minsdk = 14(ICS),则无需考虑旧版本的通知。 – Teovald

+0

@Nitish给了我一个建议。我使用RemoteView构建通知大视图来控制播放/暂停,就像这个链接一样(http://stackoverflow.com/questions/14508369/how-to-create-a-notification-similar-to-play-music-app-from - 谷歌)一切正常,但当我点击设备后退按钮,并从应用程序点击事件(播放/暂停/转发/关闭)按钮不起作用。请帮助我。 –

+0

@HelalKhan嗨,请在Stackoverflow上创建一个新问题。没有看代码,很难说是什么原因。 – Nitish