5

私はモバイルでロック画面を取得しようとしています私は通知やアプリケーションの他のもののようなすべての仕事を得ることができるが、私はロック画面を表示しようとすると、アンドロイドのためにまったく動作します。メディアプレーヤーのロック画面通知をする方法

private void initMediaSession() throws RemoteException { 
    if (mediaSessionManager != null) return; //mediaSessionManager exists 
    ComponentName mediaButtonReceiver = new ComponentName(getApplicationContext(), MediaButtonReceiver.class); 

    mediaSession = new MediaSessionCompat(getApplicationContext(), "AudioPlayer", mediaButtonReceiver, null); 
    //Get MediaSessions transport controls 
    transportControls = mediaSession.getController().getTransportControls(); 
    //set MediaSession -> ready to receive media commands 
    mediaSession.setActive(true); 
    //indicate that the MediaSession handles transport control commands 
    // through its MediaSessionCompat.Callback. 
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
    Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    mediaButtonIntent.setClass(this, MediaButtonReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0); 
    mediaSession.setMediaButtonReceiver(pendingIntent); 
    //Set mediaSession's MetaData 
    updateMetaData(); 
    // passing the data 


    // Attach Callback to receive MediaSession updates 
    mediaSession.setCallback(new MediaSessionCompat.Callback() { 
     // Implement callbacks 
     @Override 
     public void onPlay() { 
      super.onPlay(); 
      messagesent(); 
      a = false; 
      resumeMedia(); 
      buildNotification(PlaybackStatus.PLAYING); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      messagesent(); 
      a = true; 
      pauseMedia(); 
      buildNotification(PlaybackStatus.PAUSED); 
     } 

     @Override 
     public void onSkipToNext() { 
      super.onSkipToNext(); 

      skipToNext(); 
      updateMetaData(); 
      buildNotification(PlaybackStatus.PLAYING); 
     } 

     @Override 
     public void onSkipToPrevious() { 
      super.onSkipToPrevious(); 

      skipToPrevious(); 
      updateMetaData(); 
      buildNotification(PlaybackStatus.PLAYING); 
     } 

     @Override 
     public void onStop() { 
      super.onStop(); 
      removeNotification(); 
      //Stop the service 
      pauseMedia(); 
      messagesent(); 
      stopSelf(); 
     } 

     @Override 
     public void onSeekTo(long position) { 
      super.onSeekTo(position); 
     } 
    }); 
} 

private void updateMetaData() { 
    //replace with medias albumArt 
    // Update the current metadata 
    MediaMetadataCompat.Builder metadataBuilder = new MediaMetadataCompat.Builder(); 

    String artist; 
    if (activeAudio.getArtist() != null) { 
     artist = activeAudio.getArtist(); 
    } else { 
     artist = "unknown"; 
    } 
    String album; 
    if (activeAudio.getAlbum() != null) { 
     album = activeAudio.getAlbum(); 
    } else { 
     album = "Album"; 
    } 
    Bitmap albumArt; 
    Uri myUri = Uri.parse(activeAudio.getAlbum_art()); 
    try { 
     InputStream image_stream = getContentResolver().openInputStream(myUri); 
     Bitmap bitmap = BitmapFactory.decodeStream(image_stream); 
     if (bitmap != null) { 
      albumArt = bitmap; 
     } else { 
      albumArt = BitmapFactory.decodeResource(getResources(), 
        R.drawable.music); 
     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     albumArt = BitmapFactory.decodeResource(getResources(), 
       R.drawable.music); 
    } 
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, albumArt); 
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt); 

    //lock screen icon for pre lollipop 
    metadataBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, albumArt); 
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, activeAudio.getTitle()); 
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, activeAudio.getAlbum()); 
    metadataBuilder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album); 
    metadataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, 1); 
    metadataBuilder.putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, 1); 

    mediaSession.setMetadata(metadataBuilder.build()); 
} 

private void buildNotification(PlaybackStatus playbackStatus) { 

    /** 
    * Notification actions -> playbackAction() 
    * 0 -> Play 
    * 1 -> Pause 
    * 2 -> Next track 
    * 3 -> Previous track 
    */ 

    MediaControllerCompat controller = mediaSession.getController(); 
    MediaMetadataCompat mediaMetadata = controller.getMetadata(); 
    MediaDescriptionCompat description = mediaMetadata.getDescription(); 

    RemoteViews views = new RemoteViews(getPackageName(), 
      R.layout.customnotification); 


    if (playbackStatus == PlaybackStatus.PLAYING || Singleton.getInstance().getMedia() == 1) { 
     views.setImageViewResource(R.id.imageButton2, 
       R.drawable.ic_pause_circle_outline_white_48dp); 

     messagesent(); 

     views.setOnClickPendingIntent(R.id.imageButton2, playbackAction(1)); 

    } else if (playbackStatus == PlaybackStatus.PAUSED || Singleton.getInstance().getMedia() == 2) { 
     views.setImageViewResource(R.id.imageButton2, 
       R.drawable.ic_play_circle_outline_white_48dp); 
     messagesent(); 

     views.setOnClickPendingIntent(R.id.imageButton2, playbackAction(0)); 

    } 

    views.setViewVisibility(R.id.imageView, View.VISIBLE); 

    // Intent notificationIntent = new Intent(this, Main2Activity.class); 

    // PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
    //   notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 


    views.setOnClickPendingIntent(R.id.imageButton3, playbackAction(3)); 
    views.setOnClickPendingIntent(R.id.imageButton4, playbackAction(2)); 

    views.setImageViewResource(R.id.imageButton3, 
      R.drawable.ic_skip_previous_circle_outline_white_36dp); 
    views.setImageViewResource(R.id.imageButton4, 
      R.drawable.ic_skip_next_circle_outline_white_36dp); 
    views.setTextViewText(R.id.textView, description.getTitle()); 
    views.setTextViewText(R.id.textView2, description.getSubtitle()); 
    views.setImageViewBitmap(R.id.imageView, description.getIconBitmap()); 


    NotificationCompat.Builder sta = new NotificationCompat.Builder(this); 
    // sta.setContentIntent(pendingIntent); 
    sta.setContent(views); 
    sta.setSmallIcon(R.drawable.ic_audiotrack_white_24dp); 
    sta.setStyle(new NotificationCompat.MediaStyle().setShowActionsInCompactView(0).setMediaSession(mediaSession.getSessionToken())); 


    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE, sta.build()); 



} 


public PendingIntent playbackAction(int actionNumber) { 
    Intent playbackAction = new Intent(this, MediaService.class); 
    switch (actionNumber) { 
     case 0: 
      // Play 
      playbackAction.setAction(ACTION_PLAY); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     case 1: 
      // Pause 
      playbackAction.setAction(ACTION_PAUSE); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     case 2: 
      // Next track 
      playbackAction.setAction(ACTION_NEXT); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     case 3: 
      // Previous track 
      playbackAction.setAction(ACTION_PREVIOUS); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     case 4: 
      playbackAction.setAction(Constants.ACTION.STOPFOREGROUND_ACTION); 
      return PendingIntent.getService(this, actionNumber, playbackAction, 0); 
     default: 
      break; 
    } 
    return null; 
} 

通知の.setstyleを設定しようとしましたが、何らかのエラーが表示されています。 ian lakeのビデオをたどりましたが、まだ動作していません。私が間違っていることを助けることができます。

+0

ロックアートの背景にアルバムアートが表示されていますか? 「通知」が正しく表示されないという問題がありますか? –

+0

私はカスタム通知を行いました。背景に何も表示されていません。 – SAVVY

+0

背景が変更されていない場合は、おそらく 'MediaController'コードで何かが見当たりませんでした。ここでhttps://stackoverflow.com/a/32656418/1904141に記載されている手順を実行しましたか? –

答えて

1

まず、build.gradleでtargetSdkVersion 22を使ってアプリケーションが動作しているかどうかを確認します。それがうまくいくなら、あなたはMarshmallow実行時アクセス権関連の問題があります。マニフェストに必要な権限を追加し、権限が付与されている場合はinitMediaSession()を実行します。詳細Link1 およびLink2

これで問題が解決しない場合は、エラーの詳細を入力してください。

+0

いくつかのデバイスでは正しく動作していますが、lolipopデバイスでは表示されません。適切に – SAVVY

+0

アプリがクラッシュすることはありませんが、ロック画面は表示されません。 – SAVVY

1

私は以下のチュートリアルに続き、出力を取得します。

private Notification createNotification() { 
if (mMetadata == null || mPlaybackState == null) { 
    return null; 
} 

Notification.Builder notificationBuilder = new Notification.Builder(mService); 
int playPauseButtonPosition = 0; 

// If skip to previous action is enabled 
if ((mPlaybackState.getActions() & PlaybackState.ACTION_SKIP_TO_PREVIOUS) != 0) { 
    notificationBuilder.addAction(R.drawable.ic_prev_gray, 
      mService.getString(R.string.label_previous), mPreviousIntent); 

    // If there is a "skip to previous" button, the play/pause button will 
    // be the second one. We need to keep track of it, because the MediaStyle notification 
    // requires to specify the index of the buttons (actions) that should be visible 
    // when in compact view. 
    playPauseButtonPosition = 1; 
} 

addPlayPauseAction(notificationBuilder); 

// If skip to next action is enabled 
if ((mPlaybackState.getActions() & PlaybackState.ACTION_SKIP_TO_NEXT) != 0) { 
    notificationBuilder.addAction(R.drawable.ic_next_gray, 
      mService.getString(R.string.label_next), mNextIntent); 
} 

MediaDescription description = mMetadata.getDescription(); 

String fetchArtUrl = null; 
Bitmap art = null; 
if (description.getIconUri() != null) { 
    // This sample assumes the iconUri will be a valid URL formatted String, but 
    // it can actually be any valid Android Uri formatted String. 
    // async fetch the album art icon 
    String artUrl = description.getIconUri().toString(); 
    if (art == null) { 
     fetchArtUrl = artUrl; 
     // use a placeholder art while the remote art is being downloaded 
     art = BitmapFactory.decodeResource(mService.getResources(), R.mipmap.ic_launcher); 
    } 
} 

notificationBuilder 
     .setStyle(new Notification.MediaStyle() 
      .setShowActionsInCompactView(new int[]{playPauseButtonPosition}) // show only play/pause in compact view 
      .setMediaSession(mSessionToken)) 
     .setColor(mNotificationColor) 
     .setSmallIcon(R.drawable.ic_notification) 
     .setVisibility(Notification.VISIBILITY_PUBLIC) 
     .setUsesChronometer(true) 
     .setContentIntent(createContentIntent(description)) // Create an intent that would open the UI when user clicks the notification 
     .setContentTitle(description.getTitle()) 
     .setContentText(description.getSubtitle()) 
     .setLargeIcon(art); 

setNotificationPlaybackState(notificationBuilder); 
if (fetchArtUrl != null) { 
    fetchBitmapFromURLAsync(fetchArtUrl, notificationBuilder); 
} 

return notificationBuilder.build(); 

}

と、あなたもちょうどまたtutorialを以下tutoriaをコピーすることができますalso.Orそれだけロリポップで通知が表示されていないアンドロイドのバージョンでは問題はないようtutorial に従ってみてくださいあなたがロック画面が表示されますautomaticalyスタイルを取得することができれば、通知のスタイルを使用する または

Notification.MediaStyle style = new Notification.MediaStyle(); 

Intent intent = new Intent(getApplicationContext(), MediaPlayerService.class); 
intent.setAction(ACTION_STOP); 
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 1, intent, 0); 
Notification.Builder builder = new Notification.Builder(this) 
     .setSmallIcon(R.drawable.ic_launcher) 
     .setContentTitle("Media Title") 
     .setContentText("Media Artist") 
     .setDeleteIntent(pendingIntent) 
     .setStyle(style); 

試みは、問題のthats。

関連する問題