欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现原生锁屏页面音乐控制

程序员文章站 2022-07-05 19:34:49
android5.0 提出了全新的mediasession概念用于播放器与控制器之间进行交互,它取代之前的remotecontrolclient,并提供了更为灵活的客户端受控端模型。...

android5.0 提出了全新的mediasession概念用于播放器与控制器之间进行交互,它取代之前的remotecontrolclient,并提供了更为灵活的客户端受控端模型。

但是mediasession框架只能在安卓5系统上使用,如何兼容低版本呢? google在support-v4(21以上版本)中也提供了mediasessioncompact兼容包。通过它可以告诉android系统与其他的应用,自己正在播放的内容是什么以及自己支持哪些类型的播放控制。

在播放音乐时,通过mediasessioncompat可以实现锁屏按键上的监听,从而转换成自己的操作。

本文介绍的是基于mediasessioncompat实现锁屏界面进行音乐播放控制功能

package com.yobbom.jiheboxplayer.service;

import android.os.build;
import android.support.v4.media.mediametadatacompat;
import android.support.v4.media.session.mediasessioncompat;
import android.support.v4.media.session.playbackstatecompat;

import com.yobbom.jiheboxplayer.model.music;

/**
 * created by administrator on 2019/4/3.
 */

public class mediasessionmanager {
  private static final string tag = "mediasessionmanager";
  private static final long media_session_actions = playbackstatecompat.action_play
      | playbackstatecompat.action_pause
      | playbackstatecompat.action_play_pause
      | playbackstatecompat.action_skip_to_next
      | playbackstatecompat.action_skip_to_previous
      | playbackstatecompat.action_stop
      | playbackstatecompat.action_seek_to;

  private playservice playservice;
  private mediasessioncompat mediasession;

  public static mediasessionmanager get(){
    return singletonholder.instance;
  }

  private static class singletonholder{
    private static mediasessionmanager instance = new mediasessionmanager();
  }

  private mediasessionmanager(){

  }

  //音乐的控制逻辑都在playservice服务中,将service实例传递过来,与mediasessionmanager进行交互
  private void init(playservice playservice){
    this.playservice = playservice;
    setupmediasession();
  }

  private void setupmediasession(){
    mediasession = new mediasessioncompat(playservice, tag);
    //指明支持的按键信息类型
    mediasession.setflags(mediasessioncompat.flag_handles_transport_controls | mediasessioncompat.flag_handles_media_buttons);
    mediasession.setcallback(callback);//设置监听回调
    mediasession.setactive(true);//必须设置为true,这样才能开始接收各种信息
  }

  //点击控制按钮时,更新播放状态
  public void updateplaybackstate(){
    int state = (audioplayer.get().isplaying() || audioplayer.get().ispreparing()) ? playbackstatecompat.state_playing : playbackstatecompat.state_paused;
    //第三个参数必须为1,否则锁屏上面显示的时长会有问题
    mediasession.setplaybackstate(
        //监听的事件(播放,暂停,上一曲,下一曲)
        new playbackstatecompat.builder()
          .setactions(media_session_actions)
          .setstate(state, audioplayer.get().getaudioposition(), 1)
          .build());
  }

  //播放歌曲时,需要更新屏幕上的歌曲信息
  public void updatemetadata(music music){
    if(music == null){
      mediasession.setmetadata(null);
      return;
    }

    //log.d(tag, "parsemp3file名称: " + mmr.extractmetadata(mediametadataretriever.metadata_key_title));
    //log.d(tag, "parsemp3file专辑: " + mmr.extractmetadata(mediametadataretriever.metadata_key_album));
    //log.d(tag, "parsemp3file歌手: " + mmr.extractmetadata(mediametadataretriever.metadata_key_artist));
    //log.d(tag, "parsemp3file码率: " + mmr.extractmetadata(mediametadataretriever.metadata_key_bitrate));
    //log.d(tag, "parsemp3file时长: " + mmr.extractmetadata(mediametadataretriever.metadata_key_duration));
    //log.d(tag, "parsemp3file类型: " + mmr.extractmetadata(mediametadataretriever.metadata_key_mimetype));

    mediametadatacompat.builder metadata = new mediametadatacompat.builder()
        .putstring(mediametadatacompat.metadata_key_title, music.gettitle())
        .putstring(mediametadatacompat.metadata_key_artist, music.getartist())
        .putstring(mediametadatacompat.metadata_key_album, music.getalbum())
        .putstring(mediametadatacompat.metadata_key_album_artist, music.getartist())
        .putlong(mediametadatacompat.metadata_key_duration, music.getduration())
        .putbitmap(mediametadatacompat.metadata_key_album_art, coverloader.get().loadthumb(music));

    if(build.version.sdk_int >= build.version_codes.lollipop){
      metadata.putlong(mediametadatacompat.metadata_key_num_tracks, appcache.get().getlocalmusiclist().size());
    }

    mediasession.setmetadata(metadata.build());
  }

  //初始化回调,用于监听锁屏界面上的按钮事件
  private mediasessioncompat.callback callback = new mediasessioncompat.callback() {
    @override
    public void onplay() {
      audioplayer.get().playpause();
    }

    @override
    public void onpause() {
      audioplayer.get().playpause();
    }

    @override
    public void onskiptonext() {
      audioplayer.get().next();
    }

    @override
    public void onskiptoprevious() {
      audioplayer.get().prev();
    }

    @override
    public void onstop() {
      audioplayer.get().stopplayer();
    }

    @override
    public void onseekto(long pos) {
      audioplayer.get().seekto((int)pos);
    }
  };

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。