.idea/jarRepositories.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/build.gradle | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/sinata/xqmuse/MainActivity.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
build.gradle | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.idea/jarRepositories.xml
@@ -31,5 +31,10 @@ <option name="name" value="MavenRepo" /> <option name="url" value="https://repo.maven.apache.org/maven2/" /> </remote-repository> <remote-repository> <option name="id" value="maven" /> <option name="name" value="maven" /> <option name="url" value="https://maven.aliyun.com/repository/jcenter/" /> </remote-repository> </component> </project> app/build.gradle
@@ -10,8 +10,8 @@ applicationId "com.sinata.xqmuse" minSdkVersion 23 targetSdkVersion 30 versionCode 10 versionName "1.81" versionCode 11 versionName "1.82" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -117,7 +117,6 @@ implementation 'io.github.lucksiege:pictureselector:v2.7.0-rc02' implementation 'com.github.penfeizhou.android.animation:apng:2.26.0' //动画 implementation 'com.amap.api:location:latest.integration' //定位 //播放器 implementation 'xyz.doikki.android.dkplayer:dkplayer-java:3.3.7'// # 必选,内部默认使用系统mediaplayer进行解码 app/src/main/java/com/sinata/xqmuse/MainActivity.kt
@@ -137,6 +137,9 @@ MSG_PROGRESS -> { EventBus.getDefault().post(EmptyEvent(Const.EventCode.SERVICE_AUDIO_PROGRESS)) sendEmptyMessageDelayed(MSG_PROGRESS, 1000) if (System.currentTimeMillis() - startTime >= 60000){ saveThinkRecord() } } MSG_COUNTDOWN -> { if (System.currentTimeMillis() >= ThinkAudioService.finishTime) @@ -273,7 +276,7 @@ if (ThinkAudioService.voice == null||startTime == 0L||SPUtils.instance().getString(Const.User.TOKEN).isNullOrEmpty()) return val time = ((System.currentTimeMillis() - startTime) / 1000).toInt() startTime = 0L startTime = System.currentTimeMillis() HttpManager.saveViewingHistory(ThinkAudioService.voice?.id ?: "", time).request(this, false, { _, _ -> Log.e(Const.Tag, "冥想记录成功:$time 秒") }){ _, _-> @@ -339,7 +342,9 @@ startActivity<LoginActivity>() tab_bar.currentTab = 0 return } }else (fragments[4] as MineFragment).showUserInfo() view_pager.currentItem = position if (position == 2){ (fragments[2] as TreeFragment).getTree() app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt
@@ -14,6 +14,7 @@ import com.sinata.xqmuse.network.requestByF import com.sinata.xqmuse.ui.course.adapter.CourseGridAdapter import com.sinata.xqmuse.utils.Const import com.sinata.xqmuse.utils.cache.ProxyVideoCacheManager import com.sinata.xqmuse.utils.event.EmptyEvent import kotlinx.android.synthetic.main.fragment_teacher.* import org.greenrobot.eventbus.EventBus @@ -51,7 +52,9 @@ getData() adapter.setOnItemClickListener { view, position -> showDialog() HttpManager.getPayCourseInfoById(list[position].id).requestByF(this,success = { _, data-> HttpManager.getPayCourseInfoById(list[position].id).requestByF( this, success = { _, data -> dismissDialog() data?.goDetail(requireContext()) }){_,_-> @@ -69,12 +72,20 @@ private fun getData(){ HttpManager.getCoursePageList().requestByF(this){_,data-> (requireActivity() as MainActivity).teacherVideoView = mVideoView mVideoView.setUrl(data?.videoUrl) val cacheServer = ProxyVideoCacheManager.getProxy(context) val proxyUrl = cacheServer.getProxyUrl(data?.videoUrl) mVideoView.setUrl(proxyUrl) iv_cover.setImageURI(data?.coverUrl) iv_play_teacher.visible() val sHead = "<html><head><meta name=\"viewport\" content=\"width=device-width, " + "initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes\" />" + "<style>img{max-width:100% !important;height:auto !important;}</style>" + "<style>body{max-width:100% !important;}</style>" + "</head><body>" webView!!.loadDataWithBaseURL(null, sHead + data?.tutorIntroduction, "text/html", "utf-8", null) webView!!.loadDataWithBaseURL( null, sHead + data?.tutorIntroduction, "text/html", "utf-8", null ) list.clear() list.addAll(data?.list?: arrayListOf()) adapter.notifyDataSetChanged() app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt
@@ -9,7 +9,6 @@ import cn.sinata.xldutils.visible import com.google.android.exoplayer2.upstream.DataSpec import com.google.android.exoplayer2.upstream.RawResourceDataSource import com.sinata.xqmuse.MainActivity import com.sinata.xqmuse.R import com.sinata.xqmuse.ThinkAudioService import com.sinata.xqmuse.network.HttpManager @@ -24,6 +23,7 @@ import com.sinata.xqmuse.ui.login.LoginActivity import com.sinata.xqmuse.ui.mine.VipActivity import com.sinata.xqmuse.utils.Const import com.sinata.xqmuse.utils.cache.ProxyVideoCacheManager import com.sinata.xqmuse.utils.event.EmptyEvent import com.sinata.xqmuse.utils.interfaces.StringCallback import kotlinx.android.synthetic.main.fragment_home.* @@ -52,7 +52,9 @@ adapter.callback = object :StringCallback{ override fun onResult(rst: String) { showDialog() HttpManager.getMeditationDetails(rst).requestByF(this@HomeFragment,success = {_,data-> HttpManager.getMeditationDetails(rst).requestByF( this@HomeFragment, success = { _, data -> dismissDialog() data?.goDetail(requireContext()) }){_,_-> @@ -96,12 +98,18 @@ startActivity<BGMSettingActivity>() } topMenuAdapter.setOnItemClickListener { view, position -> startActivity<TypeVoiceActivity>("title" to topMenu[position].categoryName,"id" to topMenu[position].id) startActivity<TypeVoiceActivity>( "title" to topMenu[position].categoryName, "id" to topMenu[position].id ) } iv_today.setOnClickListener { if (today!=null){ if (today?.isShow == 1){ //跳转播放微电影 startActivity<MicroVideoActivity>("url" to today?.meditationVideo?.videoUrl,"title" to today?.meditationVideo?.title) startActivity<MicroVideoActivity>( "url" to today?.meditationVideo?.videoUrl, "title" to today?.meditationVideo?.title ) }else if (ThinkAudioService.voice?.id == today?.meditationId){ EventBus.getDefault().post(EmptyEvent(Const.EventCode.PAUSE_OR_RESUME_THINK)) if (ThinkAudioService.playing) //播放中 @@ -110,7 +118,9 @@ iv_play_today.setImageResource(R.mipmap.play) }else{ showDialog() HttpManager.getMeditationDetails(today!!.meditationId).requestByF(this,success = {_,data-> HttpManager.getMeditationDetails(today!!.meditationId).requestByF( this, success = { _, data -> dismissDialog() if (data?.chargeType == 2&&data.isVip != 1){ //会员免费 startActivity<VipActivity>() @@ -118,7 +128,8 @@ startActivity<BuyVoiceActivity>("id" to data.id) }else{ if (ThinkAudioService.playing) EventBus.getDefault().post(EmptyEvent(Const.EventCode.FINISH_THINK)) EventBus.getDefault() .post(EmptyEvent(Const.EventCode.FINISH_THINK)) ThinkAudioService.voice = data EventBus.getDefault().post(EmptyEvent(Const.EventCode.START_THINK)) } @@ -130,7 +141,9 @@ } banner_privacy.setOnBannerListener { data, position -> showDialog() HttpManager.getMeditationDetails(privacy[position].id).requestByF(this,success = {_,data-> HttpManager.getMeditationDetails(privacy[position].id).requestByF( this, success = { _, data -> dismissDialog() data?.goDetail(requireContext()) }){_,_-> @@ -145,7 +158,9 @@ iv_home.invisible() player.visible() player.release() player.setUrl(video) val cacheServer = ProxyVideoCacheManager.getProxy(context) val proxyUrl = cacheServer.getProxyUrl(video) player.setUrl(proxyUrl) player.setLooping(true) player.start() } else if (bg.isNotEmpty()){ @@ -202,7 +217,9 @@ }else{ iv_daily_empty.gone() iv_today.setImageURI(today?.imageUrl) tv_length_today.text = "${today?.clientMeditationVO?.meditationTitle?.ellipsize(12)} | ${"%02d:%02d".format((data?.time?:0)/60,(data?.time?:0)%60)}" tv_length_today.text = "${today?.clientMeditationVO?.meditationTitle?.ellipsize( 12 )} | ${"%02d:%02d".format((data?.time ?: 0) / 60, (data?.time ?: 0) % 60)}" tv_today_count.text = "${(today?.clientMeditationVO?.realLearnedNum?:0)+(today?.clientMeditationVO?.virtualLearnedNum?:0)}人已参加学习" } }else{ @@ -213,7 +230,10 @@ }else{ iv_daily_empty.gone() iv_today.setImageURI(today?.meditationVideo?.imageUrl) tv_length_today.text = "${today?.meditationVideo?.title?.ellipsize(18)} | ${"%02d:%02d".format((today?.meditationVideo?.videoSecond?:0)/60,(today?.meditationVideo?.videoSecond?:0)%60)}" tv_length_today.text = "${today?.meditationVideo?.title?.ellipsize(18)} | ${"%02d:%02d".format( (today?.meditationVideo?.videoSecond ?: 0) / 60, (today?.meditationVideo?.videoSecond ?: 0) % 60 )}" tv_today_count.text = "" } } app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt
@@ -36,5 +36,4 @@ } } } } app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt
@@ -98,7 +98,9 @@ } } private fun showUserInfo() { fun showUserInfo() { if (!isAdded) return if (!SPUtils.instance().getString(Const.User.TOKEN).isNullOrEmpty()) HttpManager.getUserInfo().requestByF(this){_,data-> userInfo = data app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt
@@ -89,6 +89,8 @@ Log.e(Const.Tag, e.message ?:"") toast("保存失败") } else toast("缺少文件存储权限") } } } app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java
@@ -9,12 +9,15 @@ import android.os.Handler; import android.util.Log; import com.danikula.videocache.HttpProxyCacheServer; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.source.MediaSource; import com.sinata.xqmuse.utils.cache.PreloadManager; import com.sinata.xqmuse.utils.cache.ProxyVideoCacheManager; import com.sinata.xqmuse.utils.exo.ExoMediaPlayer; import com.sinata.xqmuse.utils.exo.ExoMediaPlayerFactory; @@ -241,7 +244,9 @@ isPause = false; try { Log.e("mmp", "开始播放 path:" + filePath); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(filePath)); HttpProxyCacheServer cacheServer = ProxyVideoCacheManager.getProxy(context); String proxyUrl = cacheServer.getProxyUrl(filePath); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(proxyUrl)); mMediaPlayer.setMediaItem(mediaItem); mMediaPlayer.prepare(); mMediaPlayer.play(); @@ -286,7 +291,9 @@ isPause = false; try { Log.e("mmp", "循环播放 path:" + filePath); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(filePath)); HttpProxyCacheServer cacheServer = ProxyVideoCacheManager.getProxy(context); String proxyUrl = cacheServer.getProxyUrl(filePath); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(proxyUrl)); mMediaPlayer.setMediaItem(mediaItem); mMediaPlayer.prepare(); mMediaPlayer.setRepeatMode(Player.REPEAT_MODE_ONE); app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java
@@ -44,7 +44,7 @@ /** * 预加载的大小,每个视频预加载1M,这个参数可根据实际情况调整 */ public static final int PRELOAD_LENGTH = 1024 * 1024; public static final int PRELOAD_LENGTH = 5 * 1024 * 1024; private PreloadManager(Context context) { mHttpProxyCacheServer = ProxyVideoCacheManager.getProxy(context); build.gradle
@@ -7,7 +7,8 @@ ext.retrofit_version = '2.3.0' repositories { google() jcenter() mavenCentral() maven { url 'https://maven.aliyun.com/repository/jcenter/' } maven { url 'https://jitpack.io' } } dependencies { @@ -22,7 +23,8 @@ allprojects { repositories { google() jcenter() mavenCentral() maven { url 'https://maven.aliyun.com/repository/jcenter/' } maven { url 'https://jitpack.io' } // 支付宝 SDK AAR 包所需的配置 flatDir {