2014-07-09 14 views
11

Avevo esaminato la documentazione del widget di blocco dello schermo, l'ho implementata ma non è ciò che si posiziona automaticamente sulla finestra di blocco principale. Sto cercando una soluzione che fornisca il controllo multimediale sulla finestra principale della schermata di blocco (in Jelly Bean e sopra) come l'applicazione Google Play Music.Controllo multimediale su blocco schermo come Google Play Music in Android?

Cerca su Google Play Music Lock che ovviamente non è widget di Blocco schermo.

enter image description here

risposta

15

Sono state prese delle RemoteControlClient? viene utilizzato per la Musica Android telecomando, anche se l'applicazione è in modalità di blocco. (stessa immagine come te hanno allegato)

prega di controllare RemoteControlClient

Basta chiamare sotto metodo, mentre il vostro ricevitore azione di comando per la riproduzione , Pausa, Avanti e precedente della traccia Song.

private void lockScreenControls() { 

    // Use the media button APIs (if available) to register ourselves for media button 
    // events 

    MediaButtonHelper.registerMediaButtonEventReceiverCompat(mAudioManager, mMediaButtonReceiverComponent); 
    // Use the remote control APIs (if available) to set the playback state 
    if (mRemoteControlClientCompat == null) { 
     Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); 
     intent.setComponent(mMediaButtonReceiverComponent); 
     mRemoteControlClientCompat = new RemoteControlClientCompat(PendingIntent.getBroadcast(this /*context*/,0 /*requestCode, ignored*/, intent /*intent*/, 0 /*flags*/)); 
     RemoteControlHelper.registerRemoteControlClient(mAudioManager,mRemoteControlClientCompat); 
    } 
    mRemoteControlClientCompat.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); 
    mRemoteControlClientCompat.setTransportControlFlags(
      RemoteControlClient.FLAG_KEY_MEDIA_PAUSE | 
      RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS | 
      RemoteControlClient.FLAG_KEY_MEDIA_NEXT | 
      RemoteControlClient.FLAG_KEY_MEDIA_STOP); 

    //update remote controls 
    mRemoteControlClientCompat.editMetadata(true) 
      .putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, "NombreArtista") 
      .putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, "Titulo Album") 
      .putString(MediaMetadataRetriever.METADATA_KEY_TITLE, nombreCancion) 
      //.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION,playingItem.getDuration()) 
        // TODO: fetch real item artwork 
      .putBitmap(RemoteControlClientCompat.MetadataEditorCompat.METADATA_KEY_ARTWORK, getAlbumArt()) 
      .apply(); 
    } 
} 

MediaButtonHelper Classe

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

import android.content.ComponentName; 
import android.media.AudioManager; 
import android.util.Log; 

/** 
* Class that assists with handling new media button APIs available in API level 8. 
*/ 
public class MediaButtonHelper { 
    // Backwards compatibility code (methods available as of API Level 8) 
    private static final String TAG = "MediaButtonHelper"; 

    static { 
     initializeStaticCompatMethods(); 
    } 

    static Method sMethodRegisterMediaButtonEventReceiver; 
    static Method sMethodUnregisterMediaButtonEventReceiver; 

    static void initializeStaticCompatMethods() { 
     try { 
      sMethodRegisterMediaButtonEventReceiver = AudioManager.class.getMethod(
        "registerMediaButtonEventReceiver", 
        new Class[] { ComponentName.class }); 
      sMethodUnregisterMediaButtonEventReceiver = AudioManager.class.getMethod(
        "unregisterMediaButtonEventReceiver", 
        new Class[] { ComponentName.class }); 
     } catch (NoSuchMethodException e) { 
      // Silently fail when running on an OS before API level 8. 
     } 
    } 

    public static void registerMediaButtonEventReceiverCompat(AudioManager audioManager, 
      ComponentName receiver) { 
     if (sMethodRegisterMediaButtonEventReceiver == null) 
      return; 

     try { 
      sMethodRegisterMediaButtonEventReceiver.invoke(audioManager, receiver); 
     } catch (InvocationTargetException e) { 
      // Unpack original exception when possible 
      Throwable cause = e.getCause(); 
      if (cause instanceof RuntimeException) { 
       throw (RuntimeException) cause; 
      } else if (cause instanceof Error) { 
       throw (Error) cause; 
      } else { 
       // Unexpected checked exception; wrap and re-throw 
       throw new RuntimeException(e); 
      } 
     } catch (IllegalAccessException e) { 
      Log.e(TAG, "IllegalAccessException invoking registerMediaButtonEventReceiver."); 
      e.printStackTrace(); 
     } 
    } 

    @SuppressWarnings("unused") 
    public static void unregisterMediaButtonEventReceiverCompat(AudioManager audioManager, 
      ComponentName receiver) { 
     if (sMethodUnregisterMediaButtonEventReceiver == null) 
      return; 

     try { 
      sMethodUnregisterMediaButtonEventReceiver.invoke(audioManager, receiver); 
     } catch (InvocationTargetException e) { 
      // Unpack original exception when possible 
      Throwable cause = e.getCause(); 
      if (cause instanceof RuntimeException) { 
       throw (RuntimeException) cause; 
      } else if (cause instanceof Error) { 
       throw (Error) cause; 
      } else { 
       // Unexpected checked exception; wrap and re-throw 
       throw new RuntimeException(e); 
      } 
     } catch (IllegalAccessException e) { 
      Log.e(TAG, "IllegalAccessException invoking unregisterMediaButtonEventReceiver."); 
      e.printStackTrace(); 
     } 
    } 
} 

Si prega di controllare anche questo app sviluppatore data per come integrare RemoteControlClient: Random Music Player Tuttavia interfaccia utente per la deffer RemoteControlClient come per il dispositivo non è possibile aggiorna la sua interfaccia utente da soli ma hai il controllo per mostrare e visualizzare il componente e il controllo dell'app Music.

Spero che questo ti possa aiutare. Per favore fatemi sapere se non state cercando come implementare il controllo di blocco dello schermo per l'app Music.

Godetevi la codifica. :)

+1

Grazie per questo codice! ma puoi darci un tutorial completo su come farlo! – satyres

+0

RemoteController è obsoleto, nessun collegamento al tutorial più recente? – WideFide

+0

Ricevo l'errore 'non può risolvere MediaButtonHelper'. Si prega di suggerire come rimuovere questo errore –

0

RemoteControlClient era quello che stavi cercando, ma ora è deprecato ed è stato sostituito con MediaSession.

La documentazione è qui: https://developer.android.com/reference/android/media/session/MediaSession.html

+1

MediaSession sembra buono ma richiede API 21 e devo ancora supportare API 16+ – dkzm

+0

Quindi utilizzare MediaSessionCompat invece @dkzm – user3793589

+0

Funziona bene per 4.4 ma 6.0 mi mostra notifiche invece di pulsanti, c'è qualche trucco? – Singagirl