Android 像谷歌在安卓系统中播放音乐一样在锁屏上控制媒体?

Android 像谷歌在安卓系统中播放音乐一样在锁屏上控制媒体?,android,android-appwidget,lockscreenwidget,Android,Android Appwidget,Lockscreenwidget,我已经阅读了锁屏小部件文档,我实现了它,但这并不是自动放在主锁窗口上的内容。我正在寻找一个解决方案,它提供了对主锁屏窗口(在果冻豆和更高版本)的媒体控制,比如谷歌播放音乐应用程序 看看谷歌播放音乐锁,这显然不是锁屏小部件 您检查过RemoteControlClient吗?即使应用程序处于锁定模式,它也可用于Android音乐遥控器。(与您所附的图片相同) 请检查 只需在接收器命令歌曲曲目的播放、暂停、下一个和上一个动作时调用下面的方法 private void lockScreenContr

我已经阅读了锁屏小部件文档,我实现了它,但这并不是自动放在主锁窗口上的内容。我正在寻找一个解决方案,它提供了对主锁屏窗口(在果冻豆和更高版本)的媒体控制,比如谷歌播放音乐应用程序

看看谷歌播放音乐锁,这显然不是锁屏小部件


您检查过RemoteControlClient吗?即使应用程序处于锁定模式,它也可用于Android音乐遥控器。(与您所附的图片相同)

请检查

只需在接收器命令歌曲曲目的播放、暂停、下一个和上一个动作时调用下面的方法

  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:但是,RemoteControlClient的UI根据设备延迟。您无法将其UI更新为自己的UI,但您可以控制显示和显示音乐应用程序的组件和控件

更新
上面提到的类现在不推荐使用。因此,请检查并相应更新。

RemoteControlClient是您一直在寻找的,但现在它已被弃用,并已被MediaSession取代

文件如下:

感谢您提供此代码!但你能给我们一个完整的教程如何做到这一点!RemoteController已弃用,有更新教程的链接吗?我发现
无法解决MediaButtonHelper
错误。请建议如何删除此项error@AnandSavjani在答案中添加了MediaButtonHelper类。请根据您的需要进行更新。:)有些方法现在已被弃用请检查链接并提供答案请MediaSession看起来不错,但它需要API 21,我仍然必须支持API 16+,然后使用MediaSessionCompat@dkzmIt对4.4很好,但6.0显示通知而不是按钮,有什么诀窍吗?如果我们可以通过mediaSessionCompat在锁屏/notfctn上提供播放控制,为什么要使用mediaBrowserServiceCompat?@eremzeit:你知道RemoteView是否可以更改锁屏墙纸吗?