[6.3.0]
[taxi][passenger] [音乐播放]
@@ -0,0 +1,155 @@
|
||||
package com.mogo.och.common.module.manager.auditionmanager
|
||||
|
||||
import android.media.AudioManager
|
||||
import android.media.MediaPlayer
|
||||
import android.os.Handler
|
||||
import android.os.HandlerThread
|
||||
import android.os.Message
|
||||
import android.text.TextUtils
|
||||
|
||||
//播放试听
|
||||
object Audition: MediaPlayer.OnPreparedListener,
|
||||
MediaPlayer.OnCompletionListener, MediaPlayer.OnSeekCompleteListener {
|
||||
private val TAG = "Audition"
|
||||
var mediaPlayer: MediaPlayer? = null
|
||||
var oldPath: String? = null
|
||||
private var listener: OnAuditionListener? = null
|
||||
private val handler: Handler
|
||||
|
||||
interface OnAuditionListener {
|
||||
fun onAuditionCompletion(path: String?)
|
||||
fun onSeekCompletion(currentPlay: Long)
|
||||
fun onCurrentPosition(currentPlay: Long, duration: Long)
|
||||
}
|
||||
|
||||
fun registerOnAuditionListener(listener: OnAuditionListener?) {
|
||||
this.listener = listener
|
||||
}
|
||||
|
||||
fun unregisterOnAuditionListener() {
|
||||
listener = null
|
||||
}
|
||||
|
||||
init {
|
||||
val frequentThread = HandlerThread("frequent_drawer")
|
||||
frequentThread.start()
|
||||
handler = object : Handler(frequentThread.looper) {
|
||||
override fun handleMessage(msg: Message) {
|
||||
super.handleMessage(msg)
|
||||
if (msg.what == 0) {
|
||||
if (mediaPlayer != null && listener != null) {
|
||||
val currentPosition = mediaPlayer!!.currentPosition
|
||||
val duration = mediaPlayer!!.duration
|
||||
listener!!.onCurrentPosition(currentPosition.toLong(), duration.toLong())
|
||||
}
|
||||
sendEmptyMessageDelayed(0, 500)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val isPlaying: Boolean
|
||||
get() = mediaPlayer != null && mediaPlayer!!.isPlaying
|
||||
|
||||
fun play(path: String) {
|
||||
if (TextUtils.equals(oldPath, path)) {
|
||||
return
|
||||
}
|
||||
oldPath = path
|
||||
if (mediaPlayer != null) {
|
||||
mediaPlayer!!.release()
|
||||
mediaPlayer = null
|
||||
}
|
||||
if (mediaPlayer == null) {
|
||||
mediaPlayer = MediaPlayer()
|
||||
mediaPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC)
|
||||
mediaPlayer!!.setOnPreparedListener(this)
|
||||
mediaPlayer!!.setOnCompletionListener(this)
|
||||
mediaPlayer!!.setOnSeekCompleteListener(this)
|
||||
}
|
||||
try {
|
||||
mediaPlayer!!.setDataSource(path)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
mediaPlayer!!.prepareAsync()
|
||||
}
|
||||
|
||||
fun stop() {
|
||||
oldPath = null
|
||||
if (mediaPlayer != null) {
|
||||
mediaPlayer!!.stop()
|
||||
mediaPlayer!!.reset()
|
||||
}
|
||||
}
|
||||
|
||||
fun pause() {
|
||||
if (mediaPlayer != null && mediaPlayer!!.isPlaying) {
|
||||
mediaPlayer!!.pause()
|
||||
}
|
||||
}
|
||||
|
||||
fun toggle(path: String):Boolean {
|
||||
if (mediaPlayer != null) {
|
||||
if(TextUtils.equals(oldPath, path)) {
|
||||
if (mediaPlayer!!.isPlaying) {
|
||||
mediaPlayer!!.pause()
|
||||
return false
|
||||
} else {
|
||||
mediaPlayer!!.start()
|
||||
return true
|
||||
}
|
||||
}else{
|
||||
play(path)
|
||||
return true
|
||||
}
|
||||
}else{
|
||||
play(path)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
fun start():Boolean {
|
||||
if (mediaPlayer != null) {
|
||||
mediaPlayer!!.start()
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
fun playOrStop(path: String): Boolean {
|
||||
return if (!TextUtils.equals(oldPath, path)) {
|
||||
play(path)
|
||||
true
|
||||
} else {
|
||||
stop()
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fun onDestroy() {
|
||||
stop()
|
||||
mediaPlayer = null
|
||||
}
|
||||
|
||||
override fun onPrepared(mp: MediaPlayer) {
|
||||
mp.start()
|
||||
if (listener != null) {
|
||||
listener!!.onCurrentPosition(mp.currentPosition.toLong(), mp.duration.toLong())
|
||||
}
|
||||
handler.sendEmptyMessageDelayed(0, 500)
|
||||
}
|
||||
|
||||
override fun onCompletion(mp: MediaPlayer) {
|
||||
if (listener != null) {
|
||||
listener!!.onAuditionCompletion(oldPath)
|
||||
}
|
||||
oldPath = null
|
||||
}
|
||||
|
||||
override fun onSeekComplete(mp: MediaPlayer) {
|
||||
if (listener != null) {
|
||||
listener!!.onSeekCompletion(mp.currentPosition.toLong())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,257 @@
|
||||
package com.mogo.och.common.module.manager.auditionmanager
|
||||
|
||||
import android.media.MediaExtractor
|
||||
import android.media.MediaFormat
|
||||
import android.net.Uri
|
||||
import android.os.Environment
|
||||
import android.text.TextUtils
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import com.mogo.commons.AbsMogoApplication
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.utilcode.download.DownloadUtils
|
||||
import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON
|
||||
import com.mogo.eagle.core.utilcode.util.GsonUtils
|
||||
import com.mogo.eagle.core.utilcode.util.ThreadUtils
|
||||
import com.mogo.eagle.core.utilcode.util.Utils
|
||||
import com.mogo.och.common.module.manager.orderlogmanager.OchChainLogManager
|
||||
import com.mogo.och.common.module.manager.orderlogmanager.OchChainLogManager.EVENT_KEY_INFE_WITH_MUSIC
|
||||
import com.mogo.och.common.module.utils.FileUtils
|
||||
import com.mogo.och.common.module.wigets.media.MediaPlayLogger
|
||||
import rx.Single
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
import java.io.OutputStream
|
||||
import com.mogo.eagle.core.utilcode.util.FileUtils as FileHelper
|
||||
|
||||
|
||||
object AuditionCacheManager {
|
||||
|
||||
private var dataChangeListener:DataChangeListener?=null
|
||||
private val context = AbsMogoApplication.getApp()
|
||||
private const val TAG = "AuditionCacheManager"
|
||||
|
||||
init {
|
||||
createFileCacheDir()
|
||||
}
|
||||
|
||||
// 命名规则 缓存文件夹/md5.后缀名
|
||||
private fun getMusicDataByLocationConfig() {
|
||||
ThreadUtils.getIoPool().execute {
|
||||
val localAdDataList = mutableListOf<MusicData>()
|
||||
try {
|
||||
val datas: MusicDataList = GsonUtils.fromJson(
|
||||
FunctionBuildConfig.musicUrlConfig, object : TypeToken<MusicDataList>() {}.type
|
||||
)
|
||||
localAdDataList.addAll(datas.musics)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
localAdDataList.forEach {
|
||||
if (isLocalCacheFileExists(it)) {
|
||||
// 存在
|
||||
val locationPath = getCacheFileFullPathByUrl(it)
|
||||
val fileMD5 = FileHelper.getFileMD5ToString(locationPath)
|
||||
if(fileMD5==it.md5){// 文件存在切md5一致
|
||||
it.path = locationPath
|
||||
val duration = getDuration(locationPath)
|
||||
it.duration = duration
|
||||
dataChangeListener?.addOneData(it)
|
||||
CallerLogger.d(M_OCHCOMMON+ TAG,"文件已下载添加播放列表中")
|
||||
addTag("文件已下载添加播放列表中:${it}")
|
||||
}else{
|
||||
// 删除缓存
|
||||
FileHelper.delete(locationPath)
|
||||
if(it.isCloud()) {
|
||||
// 去下载
|
||||
downloadFile(it)
|
||||
addTag("缓存已下载但md5对应不上:${it}")
|
||||
}else{
|
||||
copyRaw2Music(it.songUrl,locationPath)
|
||||
it.path = locationPath
|
||||
val duration = getDuration(locationPath)
|
||||
it.duration = duration
|
||||
dataChangeListener?.addOneData(it)
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(it.isCloud()) {
|
||||
// 不存在
|
||||
downloadFile(it)
|
||||
addTag("第一次下载:${it}")
|
||||
}else{
|
||||
val locationPath = getCacheFileFullPathByUrl(it)
|
||||
copyRaw2Music(it.songUrl,locationPath)
|
||||
it.path = locationPath
|
||||
val duration = getDuration(locationPath)
|
||||
it.duration = duration
|
||||
dataChangeListener?.addOneData(it)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 创建media缓存文件夹目录(优先放SD卡)
|
||||
*/
|
||||
private fun createFileCacheDir(): Boolean {
|
||||
val cacheDirPath = getFileCacheDir()
|
||||
MediaPlayLogger.printInfoLog("createFileCacheDir, dirPath=$cacheDirPath")
|
||||
return FileHelper.createFileDir(cacheDirPath)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取本地缓存文件的文件全路径
|
||||
*/
|
||||
private fun getFileCacheDir(): String {
|
||||
// 有些手机需要通过自定义目录
|
||||
val relativePath = "mogo" + File.separator + "music" + File.separator
|
||||
val cacheDir = File(Environment.getExternalStorageDirectory(), relativePath)
|
||||
if (FileHelper.createOrExistsDir(cacheDir)) {
|
||||
return cacheDir.absolutePath
|
||||
}
|
||||
|
||||
return FileUtils.getCacheDirectory(context, "") + relativePath
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件缓存的缓存path, 文件名以base64编码避免 中文命名,重复文件名的影响
|
||||
*/
|
||||
private fun getCacheFileFullPathByUrl(musicData: MusicData): String {
|
||||
return getFileCacheDir() +File.separator+ getCacheFileName(musicData)
|
||||
}
|
||||
|
||||
/**
|
||||
* 本地是否已经存在下载完成的文件
|
||||
*/
|
||||
private fun isLocalCacheFileExists(musicData: MusicData): Boolean {
|
||||
val localVideoCacheFilePath = getCacheFileFullPathByUrl(musicData)
|
||||
return FileHelper.isFileExists(localVideoCacheFilePath)
|
||||
}
|
||||
|
||||
/**
|
||||
* 本地缓存文件的文件名,md5编码避免文件名重复或者特殊字符编码问题
|
||||
*/
|
||||
private fun getCacheFileName(musicData: MusicData): String {
|
||||
val fileSuffix = FileUtils.getExtension(musicData.songUrl)
|
||||
if (TextUtils.isEmpty(fileSuffix)) {
|
||||
return ""
|
||||
}
|
||||
return musicData.md5 + FileUtils.EXTENSION_SEPARATOR + fileSuffix
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 下载文件
|
||||
*/
|
||||
private fun downloadFile(musicData: MusicData) {
|
||||
val downloadUrl = musicData.songUrl
|
||||
val downloadDir = getFileCacheDir()
|
||||
val downloadFileName = getCacheFileName(musicData)
|
||||
DownloadUtils.downLoad(context, downloadUrl, downloadDir, downloadFileName, object :IDownloadListener{
|
||||
override fun onStart(url: String) {
|
||||
addTag("开始下载:${musicData}")
|
||||
}
|
||||
|
||||
override fun onProgress(url: String, downloaded: Long, total: Long) {
|
||||
|
||||
}
|
||||
|
||||
override fun onFinished(url: String, path: String) {
|
||||
val fileMD5 = FileHelper.getFileMD5ToString(path)
|
||||
if(fileMD5==musicData.md5){// 文件存在切md5一致
|
||||
musicData.path = path
|
||||
dataChangeListener?.addOneData(musicData)
|
||||
addTag("下载完成切md5对应上:${musicData}")
|
||||
}else{
|
||||
// 下载成功但是下载的文件md5不一致不能使用
|
||||
}
|
||||
}
|
||||
|
||||
override fun onError(url: String, error: String?) {
|
||||
// 下载失败
|
||||
addTag("下载失败:${musicData}")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fun addDataChangeListener(dataChangeListener: DataChangeListener) {
|
||||
this.dataChangeListener = dataChangeListener
|
||||
getMusicDataByLocationConfig()
|
||||
}
|
||||
|
||||
public interface DataChangeListener{
|
||||
fun addOneData(it: MusicData)
|
||||
|
||||
}
|
||||
|
||||
private fun addTag(logInfo:String){
|
||||
OchChainLogManager.writeChainLog(TAG,logInfo,eventID=EVENT_KEY_INFE_WITH_MUSIC)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取mp3音频的总时长 单位:ms
|
||||
*
|
||||
* @param mp3FilePath MP3文件路径
|
||||
* @return 时长
|
||||
*/
|
||||
fun getDuration(mp3FilePath: String): Long {
|
||||
if (!com.mogo.eagle.core.utilcode.util.FileUtils.isFileExists(mp3FilePath)) {
|
||||
return 0
|
||||
}
|
||||
if (!mp3FilePath.endsWith("mp3")) {
|
||||
return 0
|
||||
}
|
||||
var mex: MediaExtractor? = null
|
||||
try {
|
||||
mex = MediaExtractor()
|
||||
mex.setDataSource(mp3FilePath)
|
||||
val mf = mex.getTrackFormat(0)
|
||||
return mf.getLong(MediaFormat.KEY_DURATION) / 1000L
|
||||
} catch (e: IOException) {
|
||||
|
||||
} finally {
|
||||
mex?.release()
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
fun copyRaw2Music(url:String,dst:String){
|
||||
val path = Uri.parse(url).path
|
||||
path?.let {
|
||||
val split = it.split("/")
|
||||
if(split.size==3&&split.get(1)=="raw"){
|
||||
|
||||
try {
|
||||
val fileName = split[2]
|
||||
val nameAndprex = fileName.split(".")
|
||||
val resourceId: Int = context.resources.getIdentifier(nameAndprex[0], "raw", context.packageName)
|
||||
val openRawResource = context.resources.openRawResource(resourceId)
|
||||
val outputStream: OutputStream = FileOutputStream(dst)
|
||||
val buffer = ByteArray(1024)
|
||||
var length: Int
|
||||
|
||||
while (openRawResource.read(buffer).also { length = it } > 0) {
|
||||
outputStream.write(buffer, 0, length)
|
||||
}
|
||||
|
||||
outputStream.close()
|
||||
openRawResource.close()
|
||||
}catch (e:IOException){
|
||||
e.printStackTrace()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
package com.mogo.och.common.module.manager.auditionmanager
|
||||
|
||||
import com.mogo.och.common.module.manager.distancemamager.IDistanceListener
|
||||
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAuditionListener {
|
||||
|
||||
val musicList = mutableListOf<MusicData>()
|
||||
|
||||
private val dataChangeListeners: ConcurrentHashMap<String, MusicDataChangeListener> = ConcurrentHashMap()
|
||||
|
||||
init {
|
||||
AuditionCacheManager.addDataChangeListener(this)
|
||||
Audition.registerOnAuditionListener(this)
|
||||
}
|
||||
|
||||
fun addDataChangeListener(tag: String, listener: MusicDataChangeListener) {
|
||||
if (dataChangeListeners.containsKey(tag)) {
|
||||
return
|
||||
}
|
||||
dataChangeListeners[tag] = listener
|
||||
}
|
||||
|
||||
fun removeDataChangeListener(tag: String){
|
||||
dataChangeListeners.remove(tag)
|
||||
}
|
||||
|
||||
|
||||
private fun getMusicDataByState(state:PlayState):Pair<Int,MusicData>?{
|
||||
musicList.forEachIndexed { index, musicData ->
|
||||
if(musicData.state==state){
|
||||
return Pair(index,musicData)
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
fun toggle(musicData: MusicData){
|
||||
val toggle = Audition.toggle(musicData.path)
|
||||
val oldData = resetData()
|
||||
if(toggle){// 播放
|
||||
musicData.state = PlayState.Playing
|
||||
dataChangeListeners.forEach {
|
||||
it.value.updateState(oldData,musicData)
|
||||
}
|
||||
}else{// 暂停
|
||||
musicData.state = PlayState.Pause
|
||||
dataChangeListeners.forEach {
|
||||
it.value.updateState(oldData,musicData)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun resetData():MusicData?{
|
||||
var tempRusult:MusicData?=null
|
||||
musicList.forEach {
|
||||
if(it.state!=PlayState.None){
|
||||
tempRusult = it
|
||||
}
|
||||
it.state = PlayState.None
|
||||
}
|
||||
return tempRusult
|
||||
}
|
||||
|
||||
override fun addOneData(musicDataNew: MusicData) {
|
||||
musicList.forEachIndexed { index, musicData ->
|
||||
if (musicDataNew.id==musicData.id) {
|
||||
musicList[index] = musicDataNew
|
||||
return
|
||||
}
|
||||
}
|
||||
musicList.add(musicDataNew)
|
||||
dataChangeListeners.forEach {
|
||||
it.value.addOneData(musicDataNew)
|
||||
}
|
||||
}
|
||||
|
||||
public interface MusicDataChangeListener{
|
||||
fun addOneData(it: MusicData){}
|
||||
fun updateState(oldData: MusicData?,musicData: MusicData)
|
||||
fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData){}
|
||||
fun onMusicCompletion(musicData: MusicData) {}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 音乐播放完毕
|
||||
*/
|
||||
override fun onAuditionCompletion(path:String?) {
|
||||
val oldData = resetData()
|
||||
if(oldData!=null&&oldData.path==path){
|
||||
dataChangeListeners.forEach {
|
||||
it.value.onMusicCompletion(oldData)
|
||||
}
|
||||
}else{
|
||||
musicList.forEach {musicData->
|
||||
if(musicData.path==path){
|
||||
dataChangeListeners.forEach {
|
||||
it.value.onMusicCompletion(musicData)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 拖动跳转完成
|
||||
*/
|
||||
override fun onSeekCompletion(currentPlay: Long) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前进度
|
||||
*/
|
||||
override fun onCurrentPosition(currentPlay: Long, duration: Long) {
|
||||
val musicDataWithIndex = getMusicDataByState(PlayState.Playing)
|
||||
if (musicDataWithIndex!=null) {
|
||||
musicDataWithIndex.second.let {musicData->
|
||||
dataChangeListeners.forEach {
|
||||
it.value.updatePlayCurrent(currentPlay,duration,musicData)
|
||||
}
|
||||
}
|
||||
}else{
|
||||
musicList.forEachIndexed { index, musicData ->
|
||||
if(musicData.path==Audition.oldPath){
|
||||
dataChangeListeners.forEach {
|
||||
it.value.updatePlayCurrent(currentPlay,duration,musicData)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getNextMusicData(it: MusicData):MusicData {
|
||||
val indexOf = musicList.indexOf(it)
|
||||
if(indexOf== musicList.size-1){
|
||||
return musicList.first()
|
||||
}else{
|
||||
return musicList[indexOf+1]
|
||||
}
|
||||
}
|
||||
|
||||
fun getPreMusicData(it: MusicData): MusicData {
|
||||
val indexOf = musicList.indexOf(it)
|
||||
if(indexOf== 0){
|
||||
return musicList.last()
|
||||
}else{
|
||||
return musicList[indexOf-1]
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.mogo.och.common.module.manager.auditionmanager
|
||||
|
||||
|
||||
data class MusicDataList(val musics: MutableList<MusicData>)
|
||||
|
||||
/**
|
||||
* 音乐文件
|
||||
*/
|
||||
data class MusicData(
|
||||
val id: String,
|
||||
val md5:String,
|
||||
val songName: String,
|
||||
val songUrl: String,
|
||||
val songUrlType: String,
|
||||
val coverHeadImageUrl: String,
|
||||
val coverBottomImageUrl: String,
|
||||
val tag: MutableList<String>,
|
||||
var duration:Long,
|
||||
var path: String,
|
||||
var state: PlayState = PlayState.None
|
||||
){
|
||||
fun isCloud():Boolean{
|
||||
return songUrlType=="cloud"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* None -> Playing - Pause
|
||||
* | |
|
||||
* None None
|
||||
*/
|
||||
enum class PlayState {
|
||||
None,
|
||||
Playing,
|
||||
Pause,
|
||||
}
|
||||
@@ -17,6 +17,7 @@ object OchChainLogManager {
|
||||
|
||||
const val EVENT_KEY_INFE_WITH_CHANGE = "event_key_och_common_info_and_changeinfo"
|
||||
const val EVENT_KEY_INFE_WITH_TRAJECTORY = "event_key_och_trajectory_info"
|
||||
const val EVENT_KEY_INFE_WITH_MUSIC = "event_key_och_music_info"
|
||||
|
||||
/**
|
||||
* @param Info 订单详细信息
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
package com.mogo.och.taxi.passenger.ui.music
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.findViewTreeViewModelStoreOwner
|
||||
import com.mogo.och.common.module.manager.auditionmanager.MusicData
|
||||
import com.mogo.och.taxi.passenger.R
|
||||
import com.mogo.och.taxi.passenger.ui.music.list.MusicListView
|
||||
import kotlinx.android.synthetic.main.taxi_p_music.view.iv_toggle_list_playing
|
||||
import kotlinx.android.synthetic.main.taxi_p_music.view.mlv_list
|
||||
import kotlinx.android.synthetic.main.taxi_p_music.view.mpv_playing
|
||||
|
||||
class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback, MusicListView.CheckListener {
|
||||
|
||||
private val TAG = "ItineraryView"
|
||||
|
||||
constructor(context: Context) : super(context)
|
||||
|
||||
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
|
||||
|
||||
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
|
||||
context,
|
||||
attributeSet,
|
||||
defStyleAttr
|
||||
)
|
||||
|
||||
constructor(
|
||||
context: Context,
|
||||
attributeSet: AttributeSet,
|
||||
defStyleAttr: Int,
|
||||
defStyleRes: Int
|
||||
) : super(context, attributeSet, defStyleAttr, defStyleRes)
|
||||
|
||||
private fun initView() {
|
||||
LayoutInflater.from(context).inflate(R.layout.taxi_p_music, this, true)
|
||||
setBackgroundResource(R.drawable.taxt_p_music_bg)
|
||||
|
||||
setListener()
|
||||
}
|
||||
|
||||
private fun setListener() {
|
||||
iv_toggle_list_playing.setOnClickListener {
|
||||
if (mpv_playing.visibility == VISIBLE && mlv_list.visibility == GONE) {
|
||||
showMusicList()
|
||||
} else if (mpv_playing.visibility == GONE && mlv_list.visibility == VISIBLE) {
|
||||
showMusicPlaying()
|
||||
}else{
|
||||
showMusicPlaying()
|
||||
}
|
||||
}
|
||||
mlv_list.setCheckItemListener(this)
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
|
||||
val viewModel = findViewTreeViewModelStoreOwner()?.let {
|
||||
ViewModelProvider(it).get(MusicViewModel::class.java)
|
||||
}
|
||||
|
||||
viewModel?.setDistanceCallback(this)
|
||||
}
|
||||
|
||||
|
||||
init {
|
||||
try {
|
||||
initView()
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
private fun showMusicList(){
|
||||
mpv_playing.visibility = GONE
|
||||
mlv_list.visibility = View.VISIBLE
|
||||
iv_toggle_list_playing.setImageResource(R.drawable.taxt_p_go2_playing)
|
||||
}
|
||||
private fun showMusicPlaying(){
|
||||
mpv_playing.visibility = VISIBLE
|
||||
mlv_list.visibility = GONE
|
||||
iv_toggle_list_playing.setImageResource(R.drawable.taxt_p_go2_list)
|
||||
}
|
||||
|
||||
override fun checkItem(musicData: MusicData) {
|
||||
mpv_playing.setData(musicData)
|
||||
// 详情页显示歌曲
|
||||
showMusicPlaying()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.mogo.och.taxi.passenger.ui.music
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
|
||||
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
|
||||
|
||||
class MusicViewModel: ViewModel(), IOCHTaxiPassengerOrderStatusCallback {
|
||||
|
||||
private val TAG = MusicViewModel::class.java.simpleName
|
||||
|
||||
private var viewCallback:IMusicViewCallback?=null
|
||||
|
||||
init {
|
||||
|
||||
}
|
||||
|
||||
fun setDistanceCallback(viewCallback:IMusicViewCallback){
|
||||
this.viewCallback = viewCallback
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
this.viewCallback = null
|
||||
}
|
||||
|
||||
interface IMusicViewCallback{
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package com.mogo.och.taxi.passenger.ui.music.list
|
||||
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.mogo.och.common.module.manager.auditionmanager.MusicData
|
||||
import com.mogo.och.common.module.manager.auditionmanager.PlayState
|
||||
import com.mogo.och.taxi.passenger.R
|
||||
|
||||
/**
|
||||
* Created by adityagohad on 06/06/17.
|
||||
*/
|
||||
class MusicListItemAdapter(
|
||||
private val context: Context,
|
||||
private val dataList: MutableList<MusicData>,
|
||||
private val clickListener: ClickListener
|
||||
) : RecyclerView.Adapter<MusicListItemAdapter.TextVH>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextVH {
|
||||
val view: View
|
||||
val inflater = LayoutInflater.from(context)
|
||||
view = inflater.inflate(R.layout.taxi_p_music_list_item, parent, false)
|
||||
return TextVH(view)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: TextVH, position: Int) {
|
||||
val musicData = dataList[holder.bindingAdapterPosition]
|
||||
|
||||
holder.musicName.text = musicData.songName
|
||||
holder.itemView.setOnClickListener {
|
||||
clickListener.clickItem(musicData)
|
||||
}
|
||||
|
||||
if (musicData.state==PlayState.Playing||musicData.state==PlayState.Pause) {
|
||||
holder.musicPlayState.visibility = View.VISIBLE
|
||||
}else{
|
||||
holder.musicPlayState.visibility = View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return dataList.size
|
||||
}
|
||||
|
||||
fun setNewData(data: MutableList<MusicData>) {
|
||||
dataList.clear()
|
||||
dataList.addAll(data)
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun addOneData(musicData: MusicData){
|
||||
dataList.add(musicData)
|
||||
notifyItemInserted(dataList.size)
|
||||
}
|
||||
|
||||
fun upDateMusicData(oldData: MusicData?,musicData: MusicData) {
|
||||
dataList.forEachIndexed { index, musicDataIn ->
|
||||
if (musicDataIn.id==musicData.id) {
|
||||
musicDataIn.state = musicData.state
|
||||
notifyItemChanged(index,0)
|
||||
}
|
||||
if(oldData?.id==musicDataIn.id){
|
||||
notifyItemChanged(index,0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inner class TextVH(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||
var musicName: TextView
|
||||
var musicPlayState: ImageView
|
||||
|
||||
init {
|
||||
musicName = itemView.findViewById(R.id.tv_song_name)
|
||||
musicPlayState = itemView.findViewById(R.id.iv_music_playing)
|
||||
}
|
||||
}
|
||||
|
||||
interface ClickListener {
|
||||
fun clickItem(musicData: MusicData)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
package com.mogo.och.taxi.passenger.ui.music.list
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.findViewTreeViewModelStoreOwner
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.och.common.module.manager.auditionmanager.MusicData
|
||||
import com.mogo.och.taxi.passenger.R
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_list.view.rv_music_list
|
||||
import me.jessyan.autosize.utils.AutoSizeUtils
|
||||
|
||||
class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillback,
|
||||
MusicListItemAdapter.ClickListener {
|
||||
|
||||
private val TAG = "ItineraryView"
|
||||
|
||||
constructor(context: Context) : super(context)
|
||||
|
||||
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
|
||||
|
||||
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
|
||||
|
||||
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
|
||||
|
||||
private val dataList = mutableListOf<MusicData>()
|
||||
private lateinit var lineAdapter:MusicListItemAdapter
|
||||
private var checkListener:CheckListener?=null
|
||||
|
||||
private fun initView() {
|
||||
LayoutInflater.from(context).inflate(R.layout.taxi_p_music_list, this, true)
|
||||
rv_music_list.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
|
||||
lineAdapter = MusicListItemAdapter(context,dataList,this)
|
||||
rv_music_list.adapter = lineAdapter
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
|
||||
val viewModel = findViewTreeViewModelStoreOwner()?.let {
|
||||
ViewModelProvider(it).get(MusicListViewModel::class.java)
|
||||
}
|
||||
|
||||
viewModel?.setDistanceCallback(this)
|
||||
}
|
||||
|
||||
|
||||
init {
|
||||
try {
|
||||
initView()
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
override fun addAllData(data: MutableList<MusicData>) {
|
||||
lineAdapter.setNewData(data)
|
||||
}
|
||||
|
||||
override fun addOneData(it: MusicData) {
|
||||
lineAdapter.addOneData(it)
|
||||
}
|
||||
|
||||
override fun updateMusicData(oldData: MusicData?,musicData: MusicData) {
|
||||
lineAdapter.upDateMusicData(oldData,musicData)
|
||||
CallerLogger.d(TAG,"${Thread.currentThread().name}----更新数据${oldData}-----${musicData}")
|
||||
}
|
||||
|
||||
override fun clickItem(musicData: MusicData) {
|
||||
// 通知主页面去显示详情
|
||||
this.checkListener?.checkItem(musicData)
|
||||
}
|
||||
|
||||
fun setCheckItemListener(checkListener:CheckListener) {
|
||||
this.checkListener = checkListener
|
||||
}
|
||||
|
||||
interface CheckListener {
|
||||
fun checkItem(musicData: MusicData)
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package com.mogo.och.taxi.passenger.ui.music.list
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
|
||||
import com.mogo.och.common.module.manager.auditionmanager.AuditionManager
|
||||
import com.mogo.och.common.module.manager.auditionmanager.MusicData
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
|
||||
|
||||
class MusicListViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallback,
|
||||
AuditionManager.MusicDataChangeListener {
|
||||
|
||||
private val TAG = MusicListViewModel::class.java.simpleName
|
||||
|
||||
private var viewCallback: IMusicListViewCaLillback? = null
|
||||
|
||||
init {
|
||||
|
||||
}
|
||||
|
||||
fun setDistanceCallback(viewCallback: IMusicListViewCaLillback) {
|
||||
this.viewCallback = viewCallback
|
||||
viewCallback.addAllData(AuditionManager.musicList)
|
||||
CallerLogger.d(TAG,"初始化音乐${AuditionManager.musicList.size}")
|
||||
AuditionManager.addDataChangeListener(TAG,this)
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
this.viewCallback = null
|
||||
}
|
||||
|
||||
interface IMusicListViewCaLillback {
|
||||
fun addAllData(data:MutableList<MusicData>)
|
||||
fun addOneData(it: MusicData)
|
||||
fun updateMusicData(oldData: MusicData?,musicData: MusicData)
|
||||
}
|
||||
|
||||
override fun addOneData(it: MusicData) {
|
||||
CallerLogger.d(TAG,"添加音乐:${it.songName}--${it.path}")
|
||||
UiThreadHandler.post({
|
||||
this.viewCallback?.addOneData(it)
|
||||
}, UiThreadHandler.MODE.QUEUE)
|
||||
}
|
||||
|
||||
override fun updateState(oldData: MusicData?,musicData: MusicData) {
|
||||
UiThreadHandler.post({
|
||||
viewCallback?.updateMusicData(oldData, musicData)
|
||||
}, UiThreadHandler.MODE.QUEUE)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
package com.mogo.och.taxi.passenger.ui.music.playing
|
||||
|
||||
import android.animation.ObjectAnimator
|
||||
import android.animation.ValueAnimator
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.animation.LinearInterpolator
|
||||
import android.widget.SeekBar
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.findViewTreeViewModelStoreOwner
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.request.RequestOptions
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.eagle.core.utilcode.util.TimeTransformUtils
|
||||
import com.mogo.och.common.module.manager.auditionmanager.MusicData
|
||||
import com.mogo.och.common.module.manager.auditionmanager.PlayState
|
||||
import com.mogo.och.common.module.utils.DateTimeUtil
|
||||
import com.mogo.och.taxi.passenger.R
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_music_cover
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_music_cover_bg
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_show_next
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_show_pre
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_toggle
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.sb_musuc_progess
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.tv_music_name
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.tv_playing_during
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.tv_playing_time
|
||||
import kotlinx.android.synthetic.main.taxi_p_music_playing.view.tv_tag
|
||||
|
||||
|
||||
class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingViewCallback {
|
||||
|
||||
private val TAG = "ItineraryView"
|
||||
|
||||
constructor(context: Context) : super(context)
|
||||
|
||||
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
|
||||
|
||||
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
|
||||
|
||||
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
|
||||
|
||||
private var viewModel:MusicPlayingViewModel?=null
|
||||
|
||||
private var animator:ObjectAnimator?=null
|
||||
|
||||
private fun initView() {
|
||||
LayoutInflater.from(context).inflate(R.layout.taxi_p_music_playing, this, true)
|
||||
|
||||
|
||||
iv_toggle.setOnClickListener {
|
||||
viewModel?.toggle()
|
||||
}
|
||||
iv_show_pre.setOnClickListener {
|
||||
viewModel?.showPreMusic()
|
||||
}
|
||||
iv_show_next.setOnClickListener {
|
||||
viewModel?.showNextMusic()
|
||||
}
|
||||
sb_musuc_progess.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
|
||||
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
|
||||
CallerLogger.d(TAG,"progress:${progress}----fromUser:${fromUser}")
|
||||
}
|
||||
|
||||
override fun onStartTrackingTouch(seekBar: SeekBar?) {
|
||||
|
||||
}
|
||||
|
||||
override fun onStopTrackingTouch(seekBar: SeekBar?) {
|
||||
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
|
||||
viewModel = findViewTreeViewModelStoreOwner()?.let {
|
||||
ViewModelProvider(it).get(MusicPlayingViewModel::class.java)
|
||||
}
|
||||
|
||||
viewModel?.setDistanceCallback(this)
|
||||
}
|
||||
|
||||
override fun onVisibilityAggregated(isVisible: Boolean) {
|
||||
super.onVisibilityAggregated(isVisible)
|
||||
if(isVisible){
|
||||
viewModel?.showData()
|
||||
}
|
||||
}
|
||||
|
||||
fun setData(musicData: MusicData) {
|
||||
viewModel?.setMusicData(musicData)
|
||||
}
|
||||
|
||||
override fun setViewData(musicData: MusicData){
|
||||
tv_music_name.text = musicData.songName
|
||||
tv_tag.text = musicData.tag.first()
|
||||
tv_playing_time.text = DateTimeUtil.second2Time(0)
|
||||
tv_playing_during.text = TimeTransformUtils.stringForTime(musicData.duration.toInt())
|
||||
if(musicData.state==PlayState.Playing){
|
||||
iv_toggle.setImageResource(R.drawable.taxi_p_music_pause)
|
||||
startAnimal()
|
||||
}else{
|
||||
iv_toggle.setImageResource(R.drawable.taxi_p_music_play)
|
||||
endAnimal()
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
sb_musuc_progess.setProgress(0,true)
|
||||
}else{
|
||||
sb_musuc_progess.progress=0.toInt()
|
||||
}
|
||||
|
||||
Glide.with(context)
|
||||
.load(musicData.coverHeadImageUrl)
|
||||
.apply(RequestOptions().placeholder(R.drawable.taxt_p_music_bg_relax_head))
|
||||
.into(iv_music_cover)
|
||||
Glide.with(context)
|
||||
.load(musicData.coverBottomImageUrl)
|
||||
.apply(RequestOptions().placeholder(R.drawable.taxt_p_music_bg_relax_bottom))
|
||||
.into(iv_music_cover_bg)
|
||||
}
|
||||
|
||||
private fun startAnimal(){
|
||||
animator?.let {
|
||||
if (!it.isRunning) {
|
||||
animator?.start()
|
||||
return
|
||||
}
|
||||
}
|
||||
animator = ObjectAnimator.ofFloat(iv_music_cover, "rotation", 0f, 360f)
|
||||
iv_music_cover.pivotX = (iv_music_cover.getWidth() / 2).toFloat()
|
||||
iv_music_cover.pivotY = 166f
|
||||
animator?.duration = 4000
|
||||
animator?.repeatCount = -1
|
||||
animator?.repeatMode = ValueAnimator.RESTART
|
||||
animator?.interpolator = LinearInterpolator()
|
||||
animator?.start()
|
||||
}
|
||||
private fun endAnimal(){
|
||||
if(animator!=null){
|
||||
animator?.pause()
|
||||
}
|
||||
}
|
||||
|
||||
override fun setPlayOrpause(it: MusicData) {
|
||||
if(it.state==PlayState.Playing){
|
||||
iv_toggle.setImageResource(R.drawable.taxi_p_music_pause)
|
||||
startAnimal()
|
||||
}else{
|
||||
iv_toggle.setImageResource(R.drawable.taxi_p_music_play)
|
||||
endAnimal()
|
||||
}
|
||||
}
|
||||
|
||||
override fun setProgress(currentPlay: Long, duration: Long) {
|
||||
sb_musuc_progess.max = duration.toInt()
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
sb_musuc_progess.setProgress(currentPlay.toInt(),true)
|
||||
}else{
|
||||
sb_musuc_progess.progress=currentPlay.toInt()
|
||||
}
|
||||
tv_playing_time.text = TimeTransformUtils.stringForTime(currentPlay.toInt())
|
||||
tv_playing_during.text = TimeTransformUtils.stringForTime(duration.toInt())
|
||||
}
|
||||
|
||||
fun listenerPlaying(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
init {
|
||||
try {
|
||||
initView()
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package com.mogo.och.taxi.passenger.ui.music.playing
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.elegant.utils.UiThreadHandler
|
||||
import com.mogo.eagle.core.utilcode.util.ThreadUtils
|
||||
import com.mogo.och.common.module.manager.auditionmanager.AuditionManager
|
||||
import com.mogo.och.common.module.manager.auditionmanager.MusicData
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
|
||||
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
|
||||
|
||||
class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListener {
|
||||
|
||||
private val TAG = MusicPlayingViewModel::class.java.simpleName
|
||||
|
||||
private var viewCallback: IMusicPlayingViewCallback? = null
|
||||
|
||||
private var checkMusicData:MusicData?=null
|
||||
|
||||
init {
|
||||
|
||||
}
|
||||
|
||||
fun setDistanceCallback(viewCallback: IMusicPlayingViewCallback) {
|
||||
this.viewCallback = viewCallback
|
||||
AuditionManager.addDataChangeListener(TAG,this)
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
this.viewCallback = null
|
||||
}
|
||||
|
||||
fun setMusicData(musicData: MusicData) {
|
||||
this.checkMusicData = musicData
|
||||
this.viewCallback?.setViewData(musicData)
|
||||
}
|
||||
|
||||
fun showData() {
|
||||
if(checkMusicData!=null){
|
||||
|
||||
}else{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fun toggle() {
|
||||
checkMusicData?.let {
|
||||
AuditionManager.toggle(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun showPreMusic() {
|
||||
checkMusicData?.let {
|
||||
val nextMusicData = AuditionManager.getPreMusicData(it)
|
||||
setMusicData(nextMusicData)
|
||||
}
|
||||
}
|
||||
|
||||
fun showNextMusic() {
|
||||
checkMusicData?.let {
|
||||
val nextMusicData = AuditionManager.getNextMusicData(it)
|
||||
setMusicData(nextMusicData)
|
||||
}
|
||||
}
|
||||
|
||||
interface IMusicPlayingViewCallback {
|
||||
fun setViewData(musicData: MusicData)
|
||||
fun setPlayOrpause(it: MusicData)
|
||||
fun setProgress(currentPlay: Long, duration: Long)
|
||||
}
|
||||
|
||||
override fun updateState(oldData:MusicData?,musicData: MusicData) {
|
||||
checkMusicData?.let {
|
||||
if(it.id==musicData.id){
|
||||
it.state = musicData.state
|
||||
UiThreadHandler.post {
|
||||
viewCallback?.setPlayOrpause(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
override fun updatePlayCurrent(currentPlay: Long, duration: Long, musicData: MusicData){
|
||||
checkMusicData?.let {
|
||||
if(it.id==musicData.id){
|
||||
UiThreadHandler.post {
|
||||
viewCallback?.setProgress(currentPlay, duration)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onMusicCompletion(musicData: MusicData) {
|
||||
super.onMusicCompletion(musicData)
|
||||
checkMusicData?.let {
|
||||
if(it.id==musicData.id){
|
||||
it.state = musicData.state
|
||||
UiThreadHandler.post {
|
||||
viewCallback?.setPlayOrpause(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
showNextMusic()
|
||||
toggle()
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 872 B |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 469 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 235 KiB |
|
After Width: | Height: | Size: 78 KiB |
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@android:id/background">
|
||||
<shape>
|
||||
<corners android:radius="5dp"/>
|
||||
<solid android:color="@color/taxi_p_488ED0" />
|
||||
</shape>
|
||||
</item>
|
||||
<item android:id="@android:id/secondaryProgress">
|
||||
<clip>
|
||||
<shape>
|
||||
<corners android:radius="5dp"/>
|
||||
<solid android:color="@color/taxi_p_488ED0" />
|
||||
</shape>
|
||||
</clip>
|
||||
</item>
|
||||
<item android:id="@android:id/progress">
|
||||
<scale android:scaleWidth="100%">
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="5dp"/>
|
||||
<solid android:color="@color/taxi_p_598CFF" />
|
||||
</shape>
|
||||
</scale>
|
||||
</item>
|
||||
</layer-list>
|
||||
@@ -4,6 +4,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<!-- 全览地图 -->
|
||||
<com.mogo.eagle.core.function.view.OverMapView
|
||||
android:id="@+id/overMapView"
|
||||
android:layout_width="match_parent"
|
||||
@@ -103,6 +104,8 @@
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:roma_change_dis_color="true" />
|
||||
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rv_location_center"
|
||||
android:layout_width="@dimen/dp_96"
|
||||
@@ -164,6 +167,13 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
<com.mogo.och.taxi.passenger.ui.music.MusicView
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_width="@dimen/dp_746"
|
||||
android:layout_height="@dimen/dp_916"/>
|
||||
|
||||
|
||||
<com.mogo.och.common.module.wigets.ZhiView
|
||||
android:id="@+id/aciv_xiaozhi_normal"
|
||||
|
||||
41
OCH/taxi/passenger/src/main/res/layout/taxi_p_music.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/dp_746"
|
||||
android:layout_height="@dimen/dp_916"
|
||||
android:background="@drawable/taxt_p_music_bg"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
|
||||
|
||||
|
||||
<com.mogo.och.taxi.passenger.ui.music.playing.MusicPlayingView
|
||||
android:id="@+id/mpv_playing"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_width="@dimen/dp_746"
|
||||
android:layout_height="@dimen/dp_916"/>
|
||||
|
||||
<com.mogo.och.taxi.passenger.ui.music.list.MusicListView
|
||||
android:id="@+id/mlv_list"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:visibility="visible"
|
||||
android:layout_width="@dimen/dp_630"
|
||||
android:layout_height="@dimen/dp_800"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_toggle_list_playing"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:src="@drawable/taxt_p_go2_playing"
|
||||
android:layout_marginTop="@dimen/dp_87"
|
||||
android:layout_marginEnd="@dimen/dp_97"
|
||||
android:layout_width="@dimen/dp_78"
|
||||
android:layout_height="@dimen/dp_78"/>
|
||||
|
||||
</merge>
|
||||
21
OCH/taxi/passenger/src/main/res/layout/taxi_p_music_list.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/dp_630"
|
||||
android:layout_height="@dimen/dp_800"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
|
||||
|
||||
<TextView
|
||||
tools:text="音乐列表"
|
||||
android:textColor="@android:color/background_dark"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rv_music_list"
|
||||
android:layout_marginTop="@dimen/dp_80"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
|
||||
</merge>
|
||||
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/acc_default_txt_color"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_song_name"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:text="音乐名称"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_music_playing"
|
||||
app:layout_constraintTop_toTopOf="@+id/tv_song_name"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/tv_song_name"
|
||||
app:layout_constraintStart_toEndOf="@+id/tv_song_name"
|
||||
android:src="@drawable/taxi_p_music_list_playing"
|
||||
android:visibility="gone"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<TextView
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:text="轻柔"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
142
OCH/taxi/passenger/src/main/res/layout/taxi_p_music_playing.xml
Normal file
@@ -0,0 +1,142 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/dp_746"
|
||||
android:layout_height="@dimen/dp_916"
|
||||
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_music_cover_bg"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:src="@drawable/taxt_p_music_bg_relax_bottom"
|
||||
android:layout_width="@dimen/dp_746"
|
||||
android:layout_height="@dimen/dp_916"/>
|
||||
<ImageView
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_marginTop="@dimen/dp_127"
|
||||
android:src="@drawable/taxt_p_music_bg_middle"
|
||||
android:layout_width="@dimen/dp_390"
|
||||
android:layout_height="@dimen/dp_390"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_music_cover"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_marginTop="@dimen/dp_127"
|
||||
android:src="@drawable/taxt_p_music_bg_relax_head"
|
||||
android:layout_width="@dimen/dp_390"
|
||||
android:layout_height="@dimen/dp_390"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_music_name"
|
||||
app:layout_constraintTop_toBottomOf="@+id/iv_music_cover"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_marginTop="@dimen/dp_m_17"
|
||||
android:textSize="@dimen/dp_38"
|
||||
tools:text="Current"
|
||||
android:textColor="@color/taxi_p_303C52"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_author"
|
||||
app:layout_constraintHorizontal_chainStyle="packed"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/tv_tag"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tv_music_name"
|
||||
android:textSize="@dimen/dp_32"
|
||||
android:textColor="@color/taxi_p_576887"
|
||||
tools:text="Kokia"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
<TextView
|
||||
android:id="@+id/tv_tag"
|
||||
app:layout_constraintStart_toEndOf="@+id/tv_author"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:textSize="@dimen/dp_16"
|
||||
app:layout_constraintBaseline_toBaselineOf="@+id/tv_author"
|
||||
android:textColor="@color/taxi_p_576887"
|
||||
tools:text="轻柔"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<SeekBar
|
||||
android:max="100"
|
||||
android:progress="50"
|
||||
android:paddingStart="@dimen/dp_0"
|
||||
android:paddingEnd="@dimen/dp_0"
|
||||
android:thumb="@null"
|
||||
android:id="@+id/sb_musuc_progess"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/tv_author"
|
||||
android:layout_marginTop="@dimen/dp_31"
|
||||
android:progressDrawable="@drawable/taxt_p_music_seekbar_style"
|
||||
android:layout_width="@dimen/dp_340"
|
||||
android:layout_height="@dimen/dp_4"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_playing_time"
|
||||
android:textSize="@dimen/dp_28"
|
||||
android:includeFontPadding="false"
|
||||
app:layout_constraintTop_toTopOf="@+id/sb_musuc_progess"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/sb_musuc_progess"
|
||||
app:layout_constraintEnd_toStartOf="@+id/sb_musuc_progess"
|
||||
android:textColor="@color/taxi_p_576887"
|
||||
android:layout_marginEnd="@dimen/dp_13"
|
||||
tools:text="02:34"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tv_playing_during"
|
||||
android:textSize="@dimen/dp_28"
|
||||
android:includeFontPadding="false"
|
||||
app:layout_constraintTop_toTopOf="@+id/sb_musuc_progess"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/sb_musuc_progess"
|
||||
app:layout_constraintStart_toEndOf="@+id/sb_musuc_progess"
|
||||
android:textColor="@color/taxi_p_576887"
|
||||
android:layout_marginEnd="@dimen/dp_13"
|
||||
android:layout_marginStart="@dimen/dp_13"
|
||||
tools:text="05:56"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_toggle"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:layout_marginBottom="@dimen/dp_109"
|
||||
android:src="@drawable/taxi_p_music_play"
|
||||
android:layout_width="@dimen/dp_146"
|
||||
android:layout_height="@dimen/dp_146"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_show_pre"
|
||||
app:layout_constraintTop_toTopOf="@+id/iv_toggle"
|
||||
android:layout_marginTop="@dimen/dp_35"
|
||||
app:layout_constraintEnd_toStartOf="@+id/iv_toggle"
|
||||
android:src="@drawable/taxi_p_music_pre"
|
||||
android:layout_marginEnd="@dimen/dp_61"
|
||||
android:layout_width="@dimen/dp_60"
|
||||
android:layout_height="@dimen/dp_60"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_show_next"
|
||||
app:layout_constraintTop_toTopOf="@+id/iv_toggle"
|
||||
android:layout_marginTop="@dimen/dp_35"
|
||||
app:layout_constraintStart_toEndOf="@+id/iv_toggle"
|
||||
android:src="@drawable/taxi_p_music_next"
|
||||
android:layout_marginStart="@dimen/dp_61"
|
||||
android:layout_width="@dimen/dp_60"
|
||||
android:layout_height="@dimen/dp_60"/>
|
||||
</merge>
|
||||
@@ -39,8 +39,11 @@
|
||||
<color name="taxi_p_A0B3DA">#A0B3DA</color>
|
||||
<color name="taxi_p_005D6A8C">#005D6A8C</color>
|
||||
<color name="taxi_p_5D6A8C">#5D6A8C</color>
|
||||
<color name="taxi_p_576887">#576887</color>
|
||||
<color name="taxi_p_995D6A8C">#995D6A8C</color>
|
||||
<color name="taxi_p_B37E90BF">#B37E90BF</color>
|
||||
<color name="taxi_p_488ED0">#488ED0</color>
|
||||
<color name="taxi_p_598CFF">#598CFF</color>
|
||||
|
||||
|
||||
<color name="taxi_p_464646">#464646</color>
|
||||
|
||||
@@ -149,12 +149,14 @@ android {
|
||||
buildConfigField 'boolean', 'secure', "true"
|
||||
buildConfigField 'String', 'URLs', "\"${readFileToJson("mogo").replace("\"", "\\\"")}\""
|
||||
buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("mogo").replace("\"", "\\\"")}\""
|
||||
buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("mogo").replace("\"", "\\\"")}\""
|
||||
}
|
||||
yantai {
|
||||
dimension "project"
|
||||
buildConfigField 'boolean', 'secure', "false"
|
||||
buildConfigField 'String', 'URLs', "\"${readFileToJson("yantai").replace("\"", "\\\"")}\""
|
||||
buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("yantai").replace("\"", "\\\"")}\""
|
||||
buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("yantai").replace("\"", "\\\"")}\""
|
||||
}
|
||||
|
||||
dali {
|
||||
@@ -162,12 +164,14 @@ android {
|
||||
buildConfigField 'boolean', 'secure', "true"
|
||||
buildConfigField 'String', 'URLs', "\"${readFileToJson("dali").replace("\"", "\\\"")}\""
|
||||
buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("dali").replace("\"", "\\\"")}\""
|
||||
buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("dali").replace("\"", "\\\"")}\""
|
||||
}
|
||||
saas {
|
||||
dimension "project"
|
||||
buildConfigField 'boolean', 'secure', "true"
|
||||
buildConfigField 'String', 'URLs', "\"${readFileToJson("saas").replace("\"", "\\\"")}\""
|
||||
buildConfigField 'String', 'mediaUrlConfig', "\"${readMediaUrlConfigFromJsonFile("saas").replace("\"", "\\\"")}\""
|
||||
buildConfigField 'String', 'musicUrlConfig', "\"${readMusicUrlConfigFromJsonFile("saas").replace("\"", "\\\"")}\""
|
||||
}
|
||||
// 配置网络环境,QA、线上、演示
|
||||
qa {
|
||||
@@ -426,6 +430,36 @@ Object readMediaUrlConfigFromJsonFile(env){
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取各车型宣传视频本地配置
|
||||
* @param env
|
||||
* @return
|
||||
*/
|
||||
Object readMusicUrlConfigFromJsonFile(env){
|
||||
try {
|
||||
// 加载config.json 文件
|
||||
File file = new File("${rootDir}/app/config/MusicUrlConfig.json")
|
||||
def jsonSlurper = new JsonSlurper()
|
||||
// 解析json
|
||||
def config = jsonSlurper.parse(file)
|
||||
def flavorNames = variantVehicleName()
|
||||
def jsonOutput = new JsonOutput()
|
||||
def getKey = flavorNames
|
||||
config.get(env).each {key, value ->
|
||||
// 匹配flavor对应的 json
|
||||
if(flavorNames.toLowerCase().contains(key)){
|
||||
getKey = key
|
||||
return true
|
||||
}
|
||||
}
|
||||
return jsonOutput.toJson(config.get(env).get(getKey))
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
|
||||
def variantVehicleName() {
|
||||
if(gradle.startParameter.taskNames.size()>0) {
|
||||
for (String taskName : gradle.startParameter.taskNames) {
|
||||
|
||||
@@ -1,93 +1,123 @@
|
||||
{
|
||||
"mogo": {
|
||||
"taxiunmannedpassengerochdfhq": {
|
||||
"taxipassengerochdfhq": {
|
||||
"musics": [
|
||||
{
|
||||
"id": "1",
|
||||
"md5": "C24399007B8DBAAEAA6EF448A25393CE",
|
||||
"songName": "钢琴曲",
|
||||
"songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3",
|
||||
"songUrlType": "local",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_05.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_05.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"md5": "ECA45497D915E0B933E45B5A5411B30E",
|
||||
"songName": "唯美的梦",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718271475/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"md5": "8FA0DE702443CD05BCA6DB1B7E6BE036",
|
||||
"songName": "有趣的时光",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718256470/taxt_p_music_head_03.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718184532/taxt_p_music_bottom_03.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"md5": "FB1EF41BC69216AAA90323F3FBABDDDF",
|
||||
"songName": "游乐场",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718241926/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"md5": "B721B4FBAE2D472F875A3A539135337A",
|
||||
"songName": "鼓舞我",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718228949/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"md5": "836B99E70B7BC5C2283D602DF60F45F2",
|
||||
"songName": "假日乐趣",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718228949/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7",
|
||||
"md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02",
|
||||
"songName": "伟大梦想",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718228949/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"md5": "3E8EE95E9E838709601D8BB8E2CC6B2A",
|
||||
"songName": "钢琴映像",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718241926/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718167794/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"md5": "59D695BB96DF67DBC0F5B064D727DA4A",
|
||||
"songName": "宁静的景色",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718271475/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718199388/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D",
|
||||
"songName": "困倦小猫",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718228949/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718149545/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
@@ -97,91 +127,121 @@
|
||||
"charterpassengerochm1": {
|
||||
"musics": [
|
||||
{
|
||||
"id": "1",
|
||||
"md5": "C24399007B8DBAAEAA6EF448A25393CE",
|
||||
"songName": "钢琴曲",
|
||||
"songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3",
|
||||
"songUrlType": "local",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_05.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"md5": "ECA45497D915E0B933E45B5A5411B30E",
|
||||
"songName": "唯美的梦",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"md5": "8FA0DE702443CD05BCA6DB1B7E6BE036",
|
||||
"songName": "有趣的时光",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_03.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_03.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"md5": "FB1EF41BC69216AAA90323F3FBABDDDF",
|
||||
"songName": "游乐场",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"md5": "B721B4FBAE2D472F875A3A539135337A",
|
||||
"songName": "鼓舞我",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"md5": "836B99E70B7BC5C2283D602DF60F45F2",
|
||||
"songName": "假日乐趣",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7",
|
||||
"md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02",
|
||||
"songName": "伟大梦想",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"md5": "3E8EE95E9E838709601D8BB8E2CC6B2A",
|
||||
"songName": "钢琴映像",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"md5": "59D695BB96DF67DBC0F5B064D727DA4A",
|
||||
"songName": "宁静的景色",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D",
|
||||
"songName": "困倦小猫",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
@@ -190,188 +250,124 @@
|
||||
}
|
||||
},
|
||||
"dali": {
|
||||
"taxiunmannedpassengerochdfhq": {
|
||||
"musics": [
|
||||
{
|
||||
"songName": "钢琴曲",
|
||||
"songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3",
|
||||
"songUrlType": "local",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "唯美的梦",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "有趣的时光",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "游乐场",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "鼓舞我",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "假日乐趣",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "伟大梦想",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "钢琴映像",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "宁静的景色",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "困倦小猫",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"charterpassengerochm1": {
|
||||
"musics": [
|
||||
{
|
||||
"id": "1",
|
||||
"md5": "C24399007B8DBAAEAA6EF448A25393CE",
|
||||
"songName": "钢琴曲",
|
||||
"songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3",
|
||||
"songUrlType": "local",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_05.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"md5": "ECA45497D915E0B933E45B5A5411B30E",
|
||||
"songName": "唯美的梦",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"md5": "8FA0DE702443CD05BCA6DB1B7E6BE036",
|
||||
"songName": "有趣的时光",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_03.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_03.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"md5": "FB1EF41BC69216AAA90323F3FBABDDDF",
|
||||
"songName": "游乐场",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"md5": "B721B4FBAE2D472F875A3A539135337A",
|
||||
"songName": "鼓舞我",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"md5": "836B99E70B7BC5C2283D602DF60F45F2",
|
||||
"songName": "假日乐趣",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7",
|
||||
"md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02",
|
||||
"songName": "伟大梦想",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"md5": "3E8EE95E9E838709601D8BB8E2CC6B2A",
|
||||
"songName": "钢琴映像",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"md5": "59D695BB96DF67DBC0F5B064D727DA4A",
|
||||
"songName": "宁静的景色",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D",
|
||||
"songName": "困倦小猫",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
@@ -380,188 +376,124 @@
|
||||
}
|
||||
},
|
||||
"yantai": {
|
||||
"taxiunmannedpassengerochdfhq": {
|
||||
"musics": [
|
||||
{
|
||||
"songName": "钢琴曲",
|
||||
"songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3",
|
||||
"songUrlType": "local",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "唯美的梦",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "有趣的时光",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "游乐场",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "鼓舞我",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "假日乐趣",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "伟大梦想",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "钢琴映像",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "宁静的景色",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"songName": "困倦小猫",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"charterpassengerochm1": {
|
||||
"musics": [
|
||||
{
|
||||
"id": "1",
|
||||
"md5": "C24399007B8DBAAEAA6EF448A25393CE",
|
||||
"songName": "钢琴曲",
|
||||
"songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3",
|
||||
"songUrlType": "local",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_05.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"md5": "ECA45497D915E0B933E45B5A5411B30E",
|
||||
"songName": "唯美的梦",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"md5": "8FA0DE702443CD05BCA6DB1B7E6BE036",
|
||||
"songName": "有趣的时光",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_03.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_03.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"md5": "FB1EF41BC69216AAA90323F3FBABDDDF",
|
||||
"songName": "游乐场",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"md5": "B721B4FBAE2D472F875A3A539135337A",
|
||||
"songName": "鼓舞我",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"md5": "836B99E70B7BC5C2283D602DF60F45F2",
|
||||
"songName": "假日乐趣",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7",
|
||||
"md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02",
|
||||
"songName": "伟大梦想",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"md5": "3E8EE95E9E838709601D8BB8E2CC6B2A",
|
||||
"songName": "钢琴映像",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"md5": "59D695BB96DF67DBC0F5B064D727DA4A",
|
||||
"songName": "宁静的景色",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D",
|
||||
"songName": "困倦小猫",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
@@ -569,95 +501,125 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"sass": {
|
||||
"saas": {
|
||||
"taxiunmannedpassengerochdfhq": {
|
||||
"musics": [
|
||||
{
|
||||
"id": "1",
|
||||
"md5": "C24399007B8DBAAEAA6EF448A25393CE",
|
||||
"songName": "钢琴曲",
|
||||
"songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3",
|
||||
"songUrlType": "local",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_05.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"md5": "ECA45497D915E0B933E45B5A5411B30E",
|
||||
"songName": "唯美的梦",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"md5": "8FA0DE702443CD05BCA6DB1B7E6BE036",
|
||||
"songName": "有趣的时光",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_03.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_03.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"md5": "FB1EF41BC69216AAA90323F3FBABDDDF",
|
||||
"songName": "游乐场",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"md5": "B721B4FBAE2D472F875A3A539135337A",
|
||||
"songName": "鼓舞我",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"md5": "836B99E70B7BC5C2283D602DF60F45F2",
|
||||
"songName": "假日乐趣",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7",
|
||||
"md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02",
|
||||
"songName": "伟大梦想",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"md5": "3E8EE95E9E838709601D8BB8E2CC6B2A",
|
||||
"songName": "钢琴映像",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"md5": "59D695BB96DF67DBC0F5B064D727DA4A",
|
||||
"songName": "宁静的景色",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D",
|
||||
"songName": "困倦小猫",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
@@ -667,91 +629,121 @@
|
||||
"charterpassengerochm1": {
|
||||
"musics": [
|
||||
{
|
||||
"id": "1",
|
||||
"md5": "C24399007B8DBAAEAA6EF448A25393CE",
|
||||
"songName": "钢琴曲",
|
||||
"songUrl": "android.resource://com.mogo.launcher.f/raw/piano_music.mp3",
|
||||
"songUrlType": "local",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_05.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_05.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "2",
|
||||
"md5": "ECA45497D915E0B933E45B5A5411B30E",
|
||||
"songName": "唯美的梦",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523329643/beautiful_dream.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523261936/relax.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"放松"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
"md5": "8FA0DE702443CD05BCA6DB1B7E6BE036",
|
||||
"songName": "有趣的时光",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523382842/fun_times.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_03.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_03.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "4",
|
||||
"md5": "FB1EF41BC69216AAA90323F3FBABDDDF",
|
||||
"songName": "游乐场",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523484705/playground_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523427472/lively.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"欢快"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "5",
|
||||
"md5": "B721B4FBAE2D472F875A3A539135337A",
|
||||
"songName": "鼓舞我",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523537118/uplift_me.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "6",
|
||||
"md5": "836B99E70B7BC5C2283D602DF60F45F2",
|
||||
"songName": "假日乐趣",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523604653/summer_fun.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523566881/dynamic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"动感"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "7",
|
||||
"md5": "6B0B9FEF15B0FC8F1A1EAB6793DE5C02",
|
||||
"songName": "伟大梦想",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523656707/dreaming_big.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "8",
|
||||
"md5": "3E8EE95E9E838709601D8BB8E2CC6B2A",
|
||||
"songName": "钢琴映像",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523740974/piano_reflections.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523695133/romantic.jpg",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_02.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_02.png",
|
||||
"tag": [
|
||||
"浪漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "9",
|
||||
"md5": "59D695BB96DF67DBC0F5B064D727DA4A",
|
||||
"songName": "宁静的景色",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523785714/serene_view.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_04.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_04.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "10",
|
||||
"md5": "1FBFA6AB04AA76168FDFDAFB0E189F4D",
|
||||
"songName": "困倦小猫",
|
||||
"songUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523857450/sleepy_cat.mp3",
|
||||
"songUrlType": "cloud",
|
||||
"coverImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709523814937/quiet.png",
|
||||
"coverHeadImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718285436/taxt_p_music_head_01.png",
|
||||
"coverBottomImageUrl": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1709718213773/taxt_p_music_bottom_01.png",
|
||||
"tag": [
|
||||
"静谧"
|
||||
]
|
||||
|
||||
@@ -48,6 +48,7 @@ object ConfigStartUp {
|
||||
FunctionBuildConfig.unableLaunchAutopilotGear = BuildConfig.UNABLE_LAUNCH_AUTOPILOT_GEAR
|
||||
// 各车型宣传视频本地配置json
|
||||
FunctionBuildConfig.mediaUrlConfig = BuildConfig.mediaUrlConfig
|
||||
FunctionBuildConfig.musicUrlConfig = BuildConfig.musicUrlConfig
|
||||
|
||||
//是否支持Patch升级
|
||||
FunctionBuildConfig.isSupportPatchUpgrade = BuildConfig.IS_SUPPORT_PATCH_UPGRADE
|
||||
|
||||
@@ -127,6 +127,14 @@ object FunctionBuildConfig {
|
||||
@JvmField
|
||||
var mediaUrlConfig = ""
|
||||
|
||||
/**
|
||||
* 各车型宣传音频本地配置
|
||||
* 广告json
|
||||
*/
|
||||
@Volatile
|
||||
@JvmField
|
||||
var musicUrlConfig = ""
|
||||
|
||||
|
||||
/**
|
||||
* 配置连接工控机的IP地址
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
<dimen name="dp_m_30">-30dp</dimen>
|
||||
<dimen name="dp_m_27">-27dp</dimen>
|
||||
<dimen name="dp_m_20">-20dp</dimen>
|
||||
<dimen name="dp_m_17">-17dp</dimen>
|
||||
<dimen name="dp_m_12">-12dp</dimen>
|
||||
<dimen name="dp_m_10">-10dp</dimen>
|
||||
<dimen name="dp_m_8">-8dp</dimen>
|
||||
|
||||
@@ -56,4 +56,32 @@ object DownloadUtils {
|
||||
}
|
||||
.launchIn(scope)
|
||||
}
|
||||
fun downLoadNoUi(ctx: Context?, url: String, savePath: String, fileName: String, listener: IDownloadListener?) { // FileBean fileBean = new FileBean(0, savePath, fileName, url, 0);
|
||||
val context = ctx ?: Utils.getApp() ?: throw AssertionError("context must not be null.")
|
||||
if (!Downloader.hasInit()) {
|
||||
Downloader.init(context)
|
||||
Downloader.setLoggable(BuildConfig.DEBUG)
|
||||
}
|
||||
Downloader.setNetStatePoller(poller)
|
||||
Downloader.download(url, File(savePath, fileName))
|
||||
.onEach {
|
||||
when(it) {
|
||||
is DownloadStart ->
|
||||
UiThreadHandler.post { listener?.onStart(url) }
|
||||
is Downloading -> {
|
||||
UiThreadHandler.post { listener?.onProgress(url, it.downloaded, it.total) }
|
||||
}
|
||||
is DownloadSuccess -> {
|
||||
UiThreadHandler.post { listener?.onFinished(url, it.path)}
|
||||
}
|
||||
is DownloadFailed -> {
|
||||
UiThreadHandler.post { listener?.onError(url, it.msg) }
|
||||
}
|
||||
}
|
||||
}
|
||||
.filter {
|
||||
it.isComplete()
|
||||
}
|
||||
.launchIn(scope)
|
||||
}
|
||||
}
|
||||