安卓手机本地音乐播放器shuttlePlus开源版
安卓手机本地音乐播放器shuttlePlus开源版
一、背景
非常讨厌国内手机音乐播放器各种流氓行为,我只要听本地音乐,每次打开时要先强迫你看一屏广告,本地音乐入口还隐藏得特别深,一不小心就点到直播,联网音乐等界面去了,非常让人反感。想找个简单的本地音乐播放器,发现非常困难,要么功能欠缺,要么带广告。这东西anroid本来就自带的,可是国内各组装厂却都替换成了自己的,还要强制联网。某Q音乐本地版加载个歌曲列表竟然一卡一卡的,完全不像大厂出品。
找来找去,最后用上了开源的shuttle,使用起来感觉还不错,但唯有两点让我很不爽,一是部分中文歌曲名显示乱码,二是没有自动去除重复的歌曲,即使用上收费的shuttle2也没解决这个问题。既然是开源的,索性自己动手解决。
二、使用github action
由于本地没有纯安卓的开发环境,又不想为了搞这个破东西装一大堆软件(因为特别抵触gradle这破东西,感觉maven秒它N条街),于是github action就派上用场了。github action,可以将项目编译,并自动生成可执行文件。
这个功能给没有安装编译环境的开发都来说真的是极大的便利,开发者可以把源码丢上github,然后action,让它自动在后台编译,并自动部署。所谓的CI/DI原来跟这差不多。
如果项目主界面没有显示action,需要注意以下几点:
- 项目需要公开
- 需要设置为默认项目==可能在yml里设置指定版本也行,没亲测==
在项目根目,.github/workflows/xx.yml,yml文件必须规范,并且指定了触发条件,xx可随意。
参考配置文件
name: Android CI
on: [push,pull_request]
jobs:
build:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
- name: Prepare App
run: |
mkdir -p ${{ github.workspace }}/apk/
for file in `find ~ -name "*.apk" -print`; do
mv "$file" ${{ github.workspace }}/apk/
done
- name: Upload App To Artifact
uses: actions/upload-artifact@v3
with:
name: com.abc.test.apk
path: ${{ github.workspace }}/apk/*
三、盲人摸象
github启用后,首先让它编译一下fork过来的源码,发现各种报错。报错不可怕,毕竟5年前的代码,有些插件可能都没提供了。但是,一连串的环境问题,折腾得让人怀疑人生。经过各种折腾,先后解决了gradle版本问题,签名问题,以及sdk版本问题,还有google的fireBase。其中fireBase又有新旧版本的区别,不要以为注册个帐号配置api key就完事了,它还依赖google服务,总之对于我来说步步是坑!好不容易把各种依赖和版本都对应上了,action build成功,狂喜。
既然用上了github action,自然也不用本地装开发工具了,github连vscode都提供给你了,平时简单改改代码,用github.dev问题不大。但是,这次翻车了,代码编辑器智能提示非常弱智,即使打错字也不会报错,即使用上了github codeSpace也一样。没有智能提示,加上对kotlin又不熟悉,完全是盲人摸象的方式,效率非常低。没有调试功能,改完代码每次提交后action编译还要5到8分钟,然后到手机上测试,输出日志到log.txt做分析,非常痛苦。。。
四、最后
经历一次又一次的失败后,终于把这个开源的播放器改成自己想要的了,虽然不完美,但是也基本满足自己使用。主要实现的功能:
- 解决中文乱码问题(其实就是用dispalyName替换原来的name)
- 去重(kotlin里大量用到了javaRX ,其中有个DistinctBy(xx)可以按需过滤重复的歌曲)
shuttle1.0源码中竟然还有付费的版本,我直接去掉了(一直以为作者2.0版本才要付费)
public static boolean isUpgraded(ShuttleApplication application, SettingsManager settingsManager) { if(1==1) return true; // no updgrade at all!! if (application.getIsUpgraded()) { return true; } if (settingsManager.getIsLegacyUpgraded()) { return true; } try { return application.getPackageName().equals(Config.PACKAGE_NAME_PRO); } catch (Exception ignored) { } //If something goes wrong, assume the user has the pro version return true; }
评论已关闭