From 8d72ec1b07a4fe0863b41b1140a8c0e679867b93 Mon Sep 17 00:00:00 2001 From: lmw <125975490@qq.com> Date: 星期四, 03 四月 2025 17:44:29 +0800 Subject: [PATCH] save --- .idea/jarRepositories.xml | 5 + app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt | 31 +++++++--- app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt | 4 + build.gradle | 6 + app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java | 2 app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt | 100 ++++++++++++++++++++------------- app/src/main/java/com/sinata/xqmuse/MainActivity.kt | 9 ++ app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt | 1 app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt | 2 app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java | 11 +++ app/build.gradle | 5 - 11 files changed, 114 insertions(+), 62 deletions(-) diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index 1e2d92c..d598aab 100644 --- a/.idea/jarRepositories.xml +++ b/.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> \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 3e6dbab..8279096 100644 --- a/app/build.gradle +++ b/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进行解码 diff --git a/app/src/main/java/com/sinata/xqmuse/MainActivity.kt b/app/src/main/java/com/sinata/xqmuse/MainActivity.kt index 0c67e6f..2faca71 100644 --- a/app/src/main/java/com/sinata/xqmuse/MainActivity.kt +++ b/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() diff --git a/app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt b/app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt index 04c3498..024fe1e 100644 --- a/app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt +++ b/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 @@ -46,15 +47,17 @@ webView.webViewClient = object : WebViewClient() {} webView.backgroundColor = 0 webView.background.alpha = 0 - rv_course.layoutManager = GridLayoutManager(requireContext(),2) + rv_course.layoutManager = GridLayoutManager(requireContext(), 2) rv_course.adapter = adapter getData() adapter.setOnItemClickListener { view, position -> showDialog() - HttpManager.getPayCourseInfoById(list[position].id).requestByF(this,success = { _, data-> - dismissDialog() - data?.goDetail(requireContext()) - }){_,_-> + HttpManager.getPayCourseInfoById(list[position].id).requestByF( + this, + success = { _, data -> + dismissDialog() + data?.goDetail(requireContext()) + }){ _, _-> dismissDialog() } } @@ -67,22 +70,30 @@ } private fun getData(){ - HttpManager.getCoursePageList().requestByF(this){_,data-> + 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()) + list.addAll(data?.list ?: arrayListOf()) adapter.notifyDataSetChanged() } } @Subscribe - fun pause(e:EmptyEvent){ + fun pause(e: EmptyEvent){ if (e.code == Const.EventCode.PAUSE_TEACHER_VIDEO) mVideoView.pause() } diff --git a/app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt b/app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt index 484e879..0e4991d 100644 --- a/app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt +++ b/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.* @@ -38,13 +38,13 @@ private val topMenuAdapter = TopMenuAdapter(topMenu) private var today:HomeItem? = null //今日冥想 private val privacy = arrayListOf<CommonItemBean>() //私人订制 - private val privacyAdapter by lazy { HomeBannerAdapter(privacy,requireContext()) } + private val privacyAdapter by lazy { HomeBannerAdapter(privacy, requireContext()) } private val list = arrayListOf<HomeListBean>() private val adapter = HomeAdapter(list) override fun onFirstVisibleToUser() { - rv_menu.layoutManager = GridLayoutManager(requireContext(),4) + rv_menu.layoutManager = GridLayoutManager(requireContext(), 4) rv_menu.adapter = topMenuAdapter banner_privacy.adapter = privacyAdapter rv_list.layoutManager = LinearLayoutManager(requireContext()) @@ -52,10 +52,12 @@ adapter.callback = object :StringCallback{ override fun onResult(rst: String) { showDialog() - HttpManager.getMeditationDetails(rst).requestByF(this@HomeFragment,success = {_,data-> - dismissDialog() - data?.goDetail(requireContext()) - }){_,_-> + HttpManager.getMeditationDetails(rst).requestByF( + this@HomeFragment, + success = { _, data -> + dismissDialog() + data?.goDetail(requireContext()) + }){ _, _-> dismissDialog() } } @@ -85,7 +87,7 @@ tv_3.setOnClickListener { HttpManager.getH5(4).requestByF(this){ _, data-> data?.let { - startActivity<H5Activity>("title" to "新手冥想指南","url" to it.content) + startActivity<H5Activity>("title" to "新手冥想指南", "url" to it.content) } } } @@ -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,19 +118,22 @@ iv_play_today.setImageResource(R.mipmap.play) }else{ showDialog() - HttpManager.getMeditationDetails(today!!.meditationId).requestByF(this,success = {_,data-> - dismissDialog() - if (data?.chargeType == 2&&data.isVip != 1){ //会员免费 - startActivity<VipActivity>() - }else if (data?.chargeType == 3&&data.isBuy != 1){ //单独收费且未购买 - startActivity<BuyVoiceActivity>("id" to data.id) - }else{ - if (ThinkAudioService.playing) - EventBus.getDefault().post(EmptyEvent(Const.EventCode.FINISH_THINK)) - ThinkAudioService.voice = data - EventBus.getDefault().post(EmptyEvent(Const.EventCode.START_THINK)) - } - }){_,_-> + HttpManager.getMeditationDetails(today!!.meditationId).requestByF( + this, + success = { _, data -> + dismissDialog() + if (data?.chargeType == 2 && data.isVip != 1) { //会员免费 + startActivity<VipActivity>() + } else if (data?.chargeType == 3 && data.isBuy != 1) { //单独收费且未购买 + startActivity<BuyVoiceActivity>("id" to data.id) + } else { + if (ThinkAudioService.playing) + EventBus.getDefault() + .post(EmptyEvent(Const.EventCode.FINISH_THINK)) + ThinkAudioService.voice = data + EventBus.getDefault().post(EmptyEvent(Const.EventCode.START_THINK)) + } + }){ _, _-> dismissDialog() } } @@ -130,22 +141,26 @@ } banner_privacy.setOnBannerListener { data, position -> showDialog() - HttpManager.getMeditationDetails(privacy[position].id).requestByF(this,success = {_,data-> - dismissDialog() - data?.goDetail(requireContext()) - }){_,_-> + HttpManager.getMeditationDetails(privacy[position].id).requestByF( + this, + success = { _, data -> + dismissDialog() + data?.goDetail(requireContext()) + }){ _, _-> dismissDialog() } } iv_pri_empty.setOnClickListener { startActivity<LoginActivity>() } } - fun changeBg(bg:String,video:String){ + fun changeBg(bg: String, video: String){ if (video.isNotEmpty()){ 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()){ @@ -173,17 +188,17 @@ } private fun getTopMenu(){ - HttpManager.getCategoryListByType(1).requestByF(this){_,data-> + HttpManager.getCategoryListByType(1).requestByF(this){ _, data-> topMenu.clear() - topMenu.addAll(data?: arrayListOf()) + topMenu.addAll(data ?: arrayListOf()) topMenuAdapter.notifyDataSetChanged() } } private fun getBottomMenu(){ - HttpManager.getCategoryListByType(2).requestByF(this){_,data-> + HttpManager.getCategoryListByType(2).requestByF(this){ _, data-> adapter.menus.clear() - adapter.menus.addAll(data?: arrayListOf()) + adapter.menus.addAll(data ?: arrayListOf()) if (list.isNotEmpty()){ list.add(1, HomeListBean(null, arrayListOf())) adapter.notifyDataSetChanged() @@ -192,7 +207,7 @@ } fun getToday() { - HttpManager.getTodayMeditation().requestByF(this){_,data-> + HttpManager.getTodayMeditation().requestByF(this){ _, data-> today = data if (data?.isShow == 0){ tv_1.text = "每日疗愈" @@ -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 = "" } } @@ -228,17 +248,17 @@ } fun getPrivacy() { - HttpManager.getPersonalityPlan().requestByF(this){_,data-> + HttpManager.getPersonalityPlan().requestByF(this){ _, data-> privacy.clear() - privacy.addAll(data?: arrayListOf()) + privacy.addAll(data ?: arrayListOf()) privacyAdapter.notifyDataSetChanged() } } private fun getList() { - HttpManager.getMeditationAndCateList().requestByF(this){_,data-> + HttpManager.getMeditationAndCateList().requestByF(this){ _, data-> list.clear() - list.addAll(data?: arrayListOf()) + list.addAll(data ?: arrayListOf()) if (adapter.menus.isNotEmpty()){ list.add(1, HomeListBean(null, arrayListOf())) adapter.notifyDataSetChanged() diff --git a/app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt b/app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt index f2f9d87..1f0c94a 100644 --- a/app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt +++ b/app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt @@ -36,5 +36,4 @@ } } } - } diff --git a/app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt b/app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt index 4fe242a..4ed3d35 100644 --- a/app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt +++ b/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 diff --git a/app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt b/app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt index c900d65..a848b27 100644 --- a/app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt +++ b/app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt @@ -89,6 +89,8 @@ Log.e(Const.Tag, e.message ?:"") toast("保存失败") } + else + toast("缺少文件存储权限") } } } diff --git a/app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java b/app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java index 042d34c..35baa80 100644 --- a/app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java +++ b/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); diff --git a/app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java b/app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java index f4371d8..2b599f2 100644 --- a/app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java +++ b/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); diff --git a/build.gradle b/build.gradle index 8445697..2844087 100644 --- a/build.gradle +++ b/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 { -- Gitblit v1.7.1