2014-07-09 25 views
11

Ich hatte Lock-Screen Widget Dokumentation durchgesehen, ich habe es implementiert, aber das ist nicht was automatisch auf Haupt-Lock-Fenster platzieren. Ich suche nach einer Lösung, die Media Control über Main Lock-Screen-Fenster (in Jelly Bean und höher) wie Google Play Music Application bietet.Media Control auf Sperrbildschirm wie Google Play Musik in Android?

Haben Sie auf Google Play Music Lock, die offensichtlich nicht Lock Screen Widget ist.

enter image description here

Antwort

15

Haben Sie RemoteControlClient überprüft? es ist für die Android-Musik-Fernbedienung verwendet, auch wenn die App im Lock-Modus befindet. (gleiche wie Bild, das Sie haben angebracht)

Bitte überprüfen Sie RemoteControlClient

Direkt unter Methode aufrufen, während Sie Befehl Aktion Empfänger für Play , Pause, Nächste und Vorherige der Song-Spur.

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 Klasse

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(); 
     } 
    } 
} 

Bitte beachten Sie auch diese Entwickler-App für gegeben überprüfen, wie RemoteControlClient integrieren: Random Music Player jedoch für die RemoteControlClient deffer UI gemäß dem Gerät, das Sie nicht seine UI-Updates können Sie haben jedoch die Kontrolle, die Komponente und die Steuerung der Musik-App anzuzeigen und anzuzeigen.

Hoffe, das wird Ihnen helfen. Bitte lassen Sie mich wissen, wenn Sie nicht wissen, wie Sie diesen Sperrbildschirm für die Musik-App implementieren können.

Enjoy Codierung. :)

+1

Dank für diesen Code! aber können Sie uns eine vollständige Anleitung geben, wie Sie dies tun können! – satyres

+0

RemoteController ist veraltet, jede Verknüpfung zu neueren Tutorial? – WideFide

+0

Ich bekomme "kann MediaButtonHelper Fehler nicht beheben". Bitte schlagen Sie vor, wie Sie diesen Fehler entfernen können –

0

RemoteControlClient war, was Sie gesucht haben, aber jetzt ist es veraltet und wurde durch MediaSession ersetzt.

Die docs sind hier: https://developer.android.com/reference/android/media/session/MediaSession.html

+1

MediaSession sieht gut aus, aber es erfordert API 21 und ich muss immer noch API 16+ – dkzm

+0

Dann verwenden Sie MediaSessionCompat statt @ dkzm – user3793589

+0

Es funktioniert gut für 4.4 aber 6.0 zeigt mir Benachrichtigungen anstelle von Schaltflächen, gibt es einen Trick? – Singagirl

Verwandte Themen