2014-07-09 15 views
11

Tôi đã xem qua tài liệu Widget trên màn hình khóa, tôi đã triển khai nó nhưng đây không phải là những gì tự động đặt trên Cửa sổ khóa chính. Tôi tìm kiếm giải pháp cung cấp Kiểm soát phương tiện qua cửa sổ màn hình khóa chính (trong Jelly Bean trở lên) như Ứng dụng Google Play Âm nhạc.Điều khiển phương tiện trên màn hình khóa như Google Play Âm nhạc trong Android?

Xem trên Google Play Âm nhạc Khóa rõ ràng không phải là tiện ích trên Màn hình khóa.

enter image description here

Trả lời

15

Bạn đã kiểm tra RemoteControlClient chưa? nó được sử dụng cho Android Music Điều khiển từ xa ngay cả khi ứng dụng ở chế độ Lock. (giống hình ảnh như bạn đã đính kèm)

Vui lòng kiểm tra RemoteControlClient

Chỉ cần gọi dưới phương pháp trong khi bạn người nhận hành động lệnh cho Chơi , Tạm dừng, Tiếp theo và trước bài hát Bài hát.

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 Lớp

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

cũng Vui lòng kiểm tra ứng dụng nhà phát triển này đưa ra cho làm thế nào để tích hợp RemoteControlClient: Random Music Player Tuy nhiên UI cho Deffer RemoteControlClient theo thiết bị mà bạn không thể cập nhật giao diện của nó của riêng bạn nhưng bạn có quyền kiểm soát để hiển thị và hiển thị thành phần và kiểm soát của ứng dụng Nhạc.

Hy vọng điều này sẽ giúp bạn. Vui lòng cho tôi biết nếu bạn không nhận được cách thực hiện kiểm soát màn hình khóa đó cho ứng dụng Nhạc.

Tận hưởng mã hóa. :)

+1

Cảm ơn mã này! nhưng bạn có thể cho chúng tôi hướng dẫn đầy đủ về cách thực hiện điều này không! – satyres

+0

RemoteController không được chấp nhận, bất kỳ liên kết nào đến hướng dẫn mới hơn? – WideFide

+0

Tôi nhận được 'không thể giải quyết lỗi MediaButtonHelper'. Vui lòng đề xuất cách xóa lỗi này –

0

RemoteControlClient là những gì bạn đang tìm kiếm, nhưng bây giờ nó không được chấp nhận và đã được thay thế bằng MediaSession.

Tài liệu ở đây: https://developer.android.com/reference/android/media/session/MediaSession.html

+1

MediaSession có vẻ tốt nhưng nó yêu cầu API 21 và tôi vẫn phải hỗ trợ API 16+ – dkzm

+0

Sau đó sử dụng MediaSessionCompat thay vì @dkzm – user3793589

+0

Nó hoạt động tốt cho 4.4 nhưng 6.0 cho thấy thông báo thay vì nút, có mẹo nào không? – Singagirl

Các vấn đề liên quan