添加爱趣听sdk接入

This commit is contained in:
tongchenfei
2020-06-05 13:26:26 +08:00
parent 075ca7d3a9
commit b4032e2cd8
11 changed files with 497 additions and 29 deletions

View File

@@ -35,7 +35,7 @@ android {
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation fileTree(dir: 'libs', include: ['*.aar'])
annotationProcessor rootProject.ext.dependencies.aroutercompiler
implementation rootProject.ext.dependencies.arouter

View File

@@ -8,6 +8,7 @@
<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />
<uses-permission android:name="android.permission.TYPE_APPLICATION_OVERLAY" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="com.tencent.wecarflow.PLAY_CONTROL" />
<application>
<receiver android:name=".receiver.MediaSpeechReceiver">

View File

@@ -11,6 +11,7 @@ import com.mogo.map.listener.IMogoMapListener;
import com.mogo.map.location.IMogoLocationListener;
import com.mogo.map.marker.IMogoMarkerClickListener;
import com.mogo.map.navi.IMogoNaviListener;
import com.mogo.module.media.widget.MediaWindow2;
import com.mogo.service.module.IMogoModuleLifecycle;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.service.module.ModuleType;
@@ -21,8 +22,6 @@ public class MediaCardViewProvider implements IMogoModuleProvider {
private static final String TAG = "MediaCardViewProvider";
private MediaWindow mMediaWindow;
@Override
public Fragment createFragment( Context context, Bundle data ) {
@@ -35,10 +34,8 @@ public class MediaCardViewProvider implements IMogoModuleProvider {
@Override
public void init( Context context ) {
ServiceMediaHandler.init( context );
mMediaWindow = new MediaWindow();
mMediaWindow.initMedia(context);
MediaWindow2 mediaWindow2 = new MediaWindow2();
mediaWindow2.initMedia(context);
}
@Override

View File

@@ -181,8 +181,12 @@ public class MediaWindow implements MediaView{
}
if (first || mMediaInfoData.getPlayState() == 1 || mMediaInfoData.getPlayState() == 2) {
if (mWindowMaxTime != null) mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime()));
if (mWindowCurrTime != null) mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime()));
if (mWindowMaxTime != null){
mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime()));
}
if (mWindowCurrTime != null){
mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime()));
}
}
if (mCircleImg != null){
@@ -286,7 +290,9 @@ public class MediaWindow implements MediaView{
}
if (mCircleImg != null) mCircleImg.stopAnim();
if (mCircleImg != null){
mCircleImg.stopAnim();
}
if (type == 1 || type == 2 || type ==3){
UiThreadHandler.removeCallbacks(mRunnable);
@@ -417,10 +423,18 @@ public class MediaWindow implements MediaView{
bookid = leTingNewsData.getSid();
}
if (mediaName == null) mediaName = "";
if (artist == null) artist = "";
if (cover == null) cover = "";
if (bookid == null) bookid = "";
if (mediaName == null){
mediaName = "";
}
if (artist == null){
artist = "";
}
if (cover == null){
cover = "";
}
if (bookid == null){
bookid = "";
}
}
} catch (Exception e) {
e.printStackTrace();

View File

@@ -0,0 +1,13 @@
package com.mogo.module.media.constants;
/**
* 音频相关常量
*
* @author tongchenfei
*/
public class MusicConstant {
public static final int PLAY_STATE_PLAYING = 1;
public static final int PLAY_STATE_BUFF = 2;
public static final int PLAY_STATE_PAUSE_OR_STOP = 0;
public static final int PLAY_STATE_ERROR = -1;
}

View File

@@ -0,0 +1,53 @@
package com.mogo.module.media.presenter;
import android.content.Context;
import com.mogo.commons.mvp.IView;
import com.mogo.commons.mvp.Presenter;
import com.mogo.module.media.model.MediaInfoData;
/**
* 媒体播放presenter基类目前没有整合到原MediaPresenter中原来的qq音乐喜马拉雅和懒人听书下掉了
*
* @author tongchenfei
*/
public abstract class BaseMediaPresenter<V extends IView> extends Presenter<V> {
public BaseMediaPresenter(V view) {
super(view);
}
/**
* 初始化
*
* @param context 上下文
*/
public abstract void init(Context context);
/**
* 播放音乐
* @param mediaInfoData 待播放音乐信息
*/
public abstract void play(MediaInfoData mediaInfoData);
/**
* 暂停播放
* @param mediaInfoData 待暂停音乐信息
*/
public abstract void pause(MediaInfoData mediaInfoData);
/**
* 停止播放
* @param mediaInfoData 待停止播放音乐信息
*/
public abstract void stop(MediaInfoData mediaInfoData);
/**
* 上一首
*/
public abstract void pre();
/**
* 下一首
*/
public abstract void next();
}

View File

@@ -0,0 +1,135 @@
package com.mogo.module.media.presenter;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import com.mogo.module.media.MediaConstants;
import com.mogo.module.media.constants.MusicConstant;
import com.mogo.module.media.model.MediaInfoData;
import com.mogo.module.media.view.IMusicView;
import com.mogo.utils.logger.Logger;
import com.tencent.wecarflow.flowoutside.sdk.BindListener;
import com.tencent.wecarflow.flowoutside.sdk.FlowPlayControl;
import com.tencent.wecarflow.flowoutside.sdk.MediaChangeListener;
import com.tencent.wecarflow.flowoutside.sdk.MediaInfo;
import com.tencent.wecarflow.flowoutside.sdk.PlayStateListener;
/**
* 爱趣听presenter
*
* @author tongchenfei
*/
public class WeCarFlowPresenter extends BaseMediaPresenter<IMusicView> {
private static final String TAG = "WeCarFlowPresenter";
public WeCarFlowPresenter(IMusicView view) {
super(view);
}
private Context context;
private MediaInfoData currentMedia;
@Override
public void init(Context context) {
this.context = context;
FlowPlayControl.getInstance().bindPlayService(context);
FlowPlayControl.getInstance().addBindListener(new BindListener() {
@Override
public void onServiceConnected() {
Logger.d(TAG, "onServiceConnected===");
}
@Override
public void onServiceDisconnected() {
Logger.e(TAG, "onServiceDisconnected===");
}
@Override
public void onBindDied() {
Logger.e(TAG, "onBindDied===");
}
});
FlowPlayControl.getInstance().addMediaChangeListener(new MediaChangeListener() {
@Override
public void onMediaChange(MediaInfo mediaInfo) {
currentMedia = new MediaInfoData();
currentMedia.setMediaName(mediaInfo.getMediaName());
currentMedia.setMediaUrl(mediaInfo.getMediaImage());
}
@Override
public void onFavorChange(boolean b) {
}
});
FlowPlayControl.getInstance().addPlayStateListener(new PlayStateListener() {
@Override
public void onStart() {
if (mView != null && currentMedia != null) {
currentMedia.setPlayState(MusicConstant.PLAY_STATE_PLAYING);
mView.onMusicPlaying(currentMedia);
}
}
@Override
public void onPause() {
if (mView != null && currentMedia != null) {
currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP);
mView.onMusicPause(currentMedia);
}
}
@Override
public void onStop() {
if (mView != null && currentMedia != null) {
currentMedia.setPlayState(MusicConstant.PLAY_STATE_PAUSE_OR_STOP);
mView.onMusicStoped(currentMedia);
}
}
@Override
public void onProgress(String s, long current, long total) {
if (mView != null) {
mView.onMusicProgress(current, total);
}
}
});
}
@Override
public void play(MediaInfoData mediaInfoData) {
FlowPlayControl.getInstance().doPlay();
}
@Override
public void pause(MediaInfoData mediaInfoData) {
FlowPlayControl.getInstance().doPause();
}
@Override
public void stop(MediaInfoData mediaInfoData) {
FlowPlayControl.getInstance().doStop();
}
@Override
public void pre() {
FlowPlayControl.getInstance().doPre();
}
@Override
public void next() {
FlowPlayControl.getInstance().doNext();
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);
if (context != null) {
FlowPlayControl.getInstance().unbindPlayService(context);
}
}
}

View File

@@ -459,21 +459,23 @@ public class MusicControlBroadCast {
}
}
// return null;
MediaInfoData mediaInfoData = new MediaInfoData();
mediaInfoData.setMediaId("001jiOrk2g389Y");
mediaInfoData.setBookInfo("");
mediaInfoData.setType(1);
mediaInfoData.setMediaName("恭喜发财 (广场舞)");
mediaInfoData.setMediaSinger("刘德华");
mediaInfoData.setMediaType("物流派");
mediaInfoData.setPlayState(0);
mediaInfoData.setLocalMedia(false);
mediaInfoData.setCurTime(0);
mediaInfoData.setMaxTime(410*1000);
mediaInfoData.setMediaUrl("http://isure.stream.qqmusic.qq.com/C200000s2wCd3pzdnA.m4a?guid=2000001271&vkey=8CE1A876F5079A6E4E9BCB8306252EF152F3D4F237B3BF4C1450B50BA7E065D3D55A0735FD2E957B129E83FF7D7D5D398479D53FE2171DF0&uin=&fromtag=50");
mediaInfoData.setMediaImg("http://music.qq.com/musicbox/img/uccpic_error.jpg");
return mediaInfoData;//刘德华的恭喜发财
return null;
// 测试代码吧?
// MediaInfoData mediaInfoData = new MediaInfoData();
// mediaInfoData.setMediaId("001jiOrk2g389Y");
// mediaInfoData.setBookInfo("");
// mediaInfoData.setType(1);
// mediaInfoData.setMediaName("恭喜发财 (广场舞)");
// mediaInfoData.setMediaSinger("刘德华");
// mediaInfoData.setMediaType("物流派");
// mediaInfoData.setPlayState(0);
// mediaInfoData.setLocalMedia(false);
// mediaInfoData.setCurTime(0);
// mediaInfoData.setMaxTime(410*1000);
// mediaInfoData.setMediaUrl("http://isure.stream.qqmusic.qq.com/C200000s2wCd3pzdnA.m4a?guid=2000001271&vkey=8CE1A876F5079A6E4E9BCB8306252EF152F3D4F237B3BF4C1450B50BA7E065D3D55A0735FD2E957B129E83FF7D7D5D398479D53FE2171DF0&uin=&fromtag=50");
// mediaInfoData.setMediaImg("http://music.qq.com/musicbox/img/uccpic_error.jpg");
// return mediaInfoData;//刘德华的恭喜发财
}
/**

View File

@@ -0,0 +1,19 @@
package com.mogo.module.media.view;
import com.mogo.commons.mvp.IView;
import com.mogo.module.media.model.MediaInfoData;
/**
* 音频显示类的接口
*
* @author tongchenfei
*/
public interface IMusicView extends IView {
void onMusicPlaying(MediaInfoData mediaInfoData);
void onMusicPause(MediaInfoData mediaInfoData);
void onMusicStoped(MediaInfoData mediaInfoData);
void onMusicProgress(long current,long total);
}

View File

@@ -0,0 +1,234 @@
package com.mogo.module.media.widget;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.mogo.module.media.R;
import com.mogo.module.media.ServiceMediaHandler;
import com.mogo.module.media.constants.MusicConstant;
import com.mogo.module.media.listener.NoDoubleClickListener;
import com.mogo.module.media.model.MediaInfoData;
import com.mogo.module.media.presenter.WeCarFlowPresenter;
import com.mogo.module.media.utils.MusicControlBroadCast;
import com.mogo.module.media.utils.Utils;
import com.mogo.module.media.view.IMusicView;
import com.mogo.utils.glide.GlideApp;
import com.mogo.utils.logger.Logger;
/**
* 适配爱趣听的window
*
* @author tongchenfei
*/
public class MediaWindow2 implements IMusicView {
public static final String TAG = MediaWindow2.class.getName();
private Context mContext;
private WeCarFlowPresenter mPresenter;
private MediaInfoData mMediaInfoData = null;
private View mWindowView;
private AnimCircleImageView mCircleImg;
private ScrollingTextView mScrollText;
private ImageView mWindowPlayPause;
private ImageView mWindowPlayNext;
private LinearLayout mWindowMediaCenter;
private TextView mWindowCurrTime;
private TextView mWindowMaxTime;
private NoScrollSeekBar mWindowProgress;
private boolean mHasAddWindow = false;
private boolean mTwoChange = false;
private boolean isFirstPlay = false;
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
MusicControlBroadCast.sendGetMusicPlayStateBroadcast();
}
};
public void initMedia(Context context) {
mContext = context;
mPresenter = new WeCarFlowPresenter(this);
mPresenter.init(context);
isFirstPlay = true;
}
private void addWindowView() {
if (ServiceMediaHandler.getMogoWindowManager() == null) {
return;
}
if (!mHasAddWindow) {
mHasAddWindow = true;
mWindowView =
LayoutInflater.from(mContext).inflate(R.layout.module_media_music_window_alert_layout, null);
mWindowView.setVisibility(View.VISIBLE);
mCircleImg = mWindowView.findViewById(R.id.window_circle_img);
mScrollText = mWindowView.findViewById(R.id.window_scroll_txt);
mWindowPlayPause = mWindowView.findViewById(R.id.window_play_pause);
mWindowPlayNext = mWindowView.findViewById(R.id.window_music_next);
mWindowMediaCenter = mWindowView.findViewById(R.id.window_media_center);
mWindowCurrTime = mWindowView.findViewById(R.id.window_current_time);
mWindowMaxTime = mWindowView.findViewById(R.id.window_max_time);
mWindowProgress = mWindowView.findViewById(R.id.window_progress_bar);
if (mWindowPlayPause != null) {
mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause);
}
int yPos =
getContext().getResources().getDimensionPixelOffset(R.dimen.module_media_music_state_location);
int xPos =
getContext().getResources().getDimensionPixelOffset(R.dimen.module_media_music_state_location_x);
ServiceMediaHandler.getMogoWindowManager().addView(mWindowView, xPos, yPos, false);
updateWindowUI(true);
mWindowMediaCenter.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onClicks(View view) {
if (mMediaInfoData != null) {
MusicControlBroadCast.openMediaApp(mMediaInfoData.getType());
} else {
MusicControlBroadCast.openMediaApp(1);
}
}
});
mWindowPlayPause.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onClicks(View view) {
if (isFirstPlay) {
if (mMediaInfoData != null) {
MusicControlBroadCast.listeningSendData(mMediaInfoData);
}
} else {
if (mMediaInfoData != null) {
MusicControlBroadCast.commandPlayPause(mMediaInfoData.getType(),
mMediaInfoData.getPlayState());
}
}
}
});
mWindowPlayNext.setOnClickListener(new NoDoubleClickListener() {
@Override
public void onClicks(View view) {
if (mMediaInfoData != null) {
MusicControlBroadCast.commandNext(mMediaInfoData.getType());
}
}
});
}
}
private void updateWindowUI() {
updateWindowUI(false);
}
private void updateWindowUI(boolean first) {
if (mWindowView == null) {
return;
}
if (mMediaInfoData != null) {
if (mMediaInfoData.getType() == 1 || mMediaInfoData.getType() == 2 || mMediaInfoData.getType() == 3) {
mWindowView.setVisibility(View.VISIBLE);
}
} else {
mWindowView.setVisibility(View.GONE);
return;
}
if (mScrollText != null) {
mScrollText.setText(mMediaInfoData.getMediaName());
}
if (first || mMediaInfoData.getPlayState() == MusicConstant.PLAY_STATE_PLAYING || mMediaInfoData.getPlayState() == MusicConstant.PLAY_STATE_BUFF) {
if (mWindowMaxTime != null) {
mWindowMaxTime.setText(Utils.calculateTime((int) mMediaInfoData.getMaxTime()));
}
if (mWindowCurrTime != null) {
mWindowCurrTime.setText(Utils.calculateTime((int) mMediaInfoData.getCurTime()));
}
}
if (mCircleImg != null) {
com.bumptech.glide.request.RequestOptions options =
new com.bumptech.glide.request.RequestOptions()
.placeholder(R.drawable.module_media_share_default_icon);
GlideApp.with(mContext).applyDefaultRequestOptions(options).load(mMediaInfoData.getMediaImg()).into(mCircleImg);
}
}
@Override
public Context getContext() {
return mContext;
}
@Override
public void onMusicPlaying(MediaInfoData mediaInfoData) {
Logger.d(TAG, "onMusicPlaying: " + mediaInfoData);
addWindowView();
mMediaInfoData = mediaInfoData;
updateWindowUI();
if (mWindowPlayPause != null) {
mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_play);
}
if (mCircleImg != null) {
mCircleImg.startAnim();
}
}
@Override
public void onMusicPause(MediaInfoData mediaInfoData) {
Logger.d(TAG, "onMusicPause: " + mediaInfoData);
mMediaInfoData = mediaInfoData;
updateWindowUI();
if (mWindowPlayPause != null) {
mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause);
}
if (mCircleImg != null) {
mCircleImg.stopAnim();
}
}
@Override
public void onMusicStoped(MediaInfoData mediaInfoData) {
Logger.d(TAG, "onMusicStoped: " + mediaInfoData);
mMediaInfoData = mediaInfoData;
updateWindowUI();
if (mWindowPlayPause != null) {
mWindowPlayPause.setImageResource(R.drawable.module_media_window_pop_pause);
}
if (mCircleImg != null) {
mCircleImg.stopAnim();
}
}
@Override
public void onMusicProgress(long current, long total) {
Logger.d(TAG, "onMusicProgress==current: " + current + " total: " + total);
if (mWindowCurrTime != null) {
mWindowCurrTime.setText(Utils.calculateTime((int) current));
mWindowMaxTime.setText(Utils.calculateTime((int) total));
}
try {
int progress =
(int) ((current * 1.0f * 100) / (total * 1.0f));
if (mWindowProgress != null) {
mWindowProgress.setProgress(progress);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}