2014-07-09 5 views
11

मैं लॉक-स्क्रीन विजेट दस्तावेज के माध्यम से गया था, मैंने इसे कार्यान्वित किया लेकिन यह मुख्य लॉक विंडो पर स्वचालित रूप से नहीं होता है। मैं समाधान की खोज करता हूं जो मुख्य लॉक-स्क्रीन विंडो (जेली बीन और ऊपर) में मीडिया नियंत्रण प्रदान करता है जैसे कि Google Play म्यूजिक एप्लिकेशन।लॉक स्क्रीन पर मीडिया कंट्रोल जैसे एंड्रॉइड में Google Play Music?

गूगल पर देखो Play संगीत लॉक जो स्पष्ट रूप से स्क्रीन विजेट लॉक नहीं है।

enter image description here

उत्तर

15

आप RemoteControlClient जाँच की है? यह एंड्रॉयड संगीत रिमोट कंट्रोल भले ही अनुप्रयोग लॉक मोड में है के लिए प्रयोग किया जाता है। (एक ही तरह की छवि आप संलग्न है)

RemoteControlClient

की जांच करें बस विधि नीचे फोन करते समय आप खेलने के लिए आदेश कार्रवाई रिसीवर , रोकें, अगला और पिछला ट्रैक गीत।

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 कक्षा

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

भी कैसे RemoteControlClient को एकीकृत करने के लिए दिए गए इस डेवलपर एप्लिकेशन की जांच करें: Random Music Player हालांकि RemoteControlClient डेफर के लिए UI डिवाइस के अनुसार आप अपने यूआई अद्यतन करता है नहीं कर सकते अपने आप के लिए लेकिन संगीत एप के घटक और नियंत्रण को दिखाने और प्रदर्शित करने के लिए आपके पास नियंत्रण है।

आशा यह आप में मदद मिलेगी। यदि आप संगीत ऐप के लिए लॉक स्क्रीन नियंत्रण को कार्यान्वित करने के तरीके के बारे में नहीं जानते हैं तो कृपया मुझे बताएं।

कोडिंग का आनंद लें। :)

+1

इस कोड के लिए धन्यवाद! लेकिन क्या आप इसे कैसे करें इस पर एक पूर्ण ट्यूटोरियल दे सकते हैं! – satyres

+0

रिमोट कंट्रोलर को बहिष्कृत किया गया है, नए ट्यूटोरियल के लिए कोई लिंक? – WideFide

+0

मुझे मीडियाबटन हेल्पर त्रुटि को हल नहीं किया जा रहा है। कृपया सुझाव दें कि इस त्रुटि को कैसे हटाया जाए –

0

RemoteControlClient आप क्या देख रहे थे, लेकिन अब यह पदावनत है और MediaSession साथ प्रतिस्थापित किया गया था।

डॉक्स यहां हैं: https://developer.android.com/reference/android/media/session/MediaSession.html

+1

MediaSession अच्छा लग रहा है, लेकिन यह एपीआई 21 की आवश्यकता होती है और मैं अभी भी समर्थन करना चाहिए एपीआई 16+ – dkzm

+0

फिर MediaSessionCompat बजाय – user3793589

+0

यह 4.4 के लिए ठीक काम करता है @dkzm का उपयोग लेकिन 6.0 मुझे बटन के बजाय सूचनाओं से पता चलता है, वहाँ किसी भी चाल है? – Singagirl

संबंधित मुद्दे