1.下载FongMi版仓库
https://github.com/FongMi/TV 首先修改gradle/wrapper/gradle-wrapper.properties,用于加速gradle的下载: 将
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip 改成
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.4.2-bin.zip 2.打开代码 用Andirod Studio打开,需要配置两处地方。 2.1 file--setting-- --Android SDK,安装Android14.0(api34),SDK tool如图所示: 2.2 file--setting-- --Gradle。Gradle指定好具体位置,安装Gradle JDK为JDK17(或者JDK17,打包apk必须17)
2.3 配置环境变量
GRADLE_USER_HOME:指定一个固定的目录 JAVA_HOME:指定JDK环境变量 ,选择OPENJDK17
建议下载amazon-corretto版本 https://corretto.aws/downloads/resources/17.0.9.8.1/amazon-corretto-17.0.9.8.1-windows-x64-jdk.zip

2.4 解决加速及依赖问题
1,在同步的过程中,会出现下载依赖慢,某些包下载不了等问题,解决方法如下: 项目根目录下setting.gradle文件中,添加aliyun的镜像,放在前面,
maven { setUrl("https://maven.aliyun.com/repository/central") }
maven { setUrl("https://maven.aliyun.com/repository/jcenter") }
maven { setUrl("https://maven.aliyun.com/repository/google") }
maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }
maven { setUrl("https://maven.aliyun.com/repository/public") } 初次同步gradle时,建议将上面的google(),注释掉,全部优先从阿里云下载,完成后,再放开注释,下载google仓库的剩下的包。

2,下载dl.google.com包缓慢问题,解决方法如下: 使用站长工具的ping检测,获取dl.google.com最佳ip https://ping.chinaz.com/ 将最快的ip地址配置到host中,C:\\Windows\System32\drivers\etc\hosts 例如:
# host文件添加
180.163.151.161 dl.google.com 3,部分包无法下载 有些本地包无法下载,可以去掉版本读取本地文件 app/build.gradle 将
implementation(ext: 'aar', name: 'dlna-core', group: 'fongmi', version: 'release') 修改成
implementation(ext: 'aar', name: 'dlna-core') 其它的ext本地包同样处理方法。
4,部分包版本问题
若
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.media:media:1.7.0' 无法下载,可以将版本改成
implementation 'com.google.android.material:material:1.10.0'
implementation 'androidx.media:media:1.7.0-alpha01' 3.内置播放源
1,找到点播源的加载位置,main模块 app/src/main/java/com.fongmi.android.tv/api/ApiConfig(有些版本改为VodConfig)文件loadConfig方法。 判断未填写播放源,添加一个即可:
String url = config.getUrl();
if (TextUtils.isEmpty(url)) {
url = "https://gitee.com/kevinr/tvbox/raw/master/spider/test.json";
// 添加以下代码,解决内置源时,投屏播放问题,给定一个配置,写入本地数据库,标记一个name(名字“源已内置”可以随便取,但一定要有,type为0,表示点播)
Config.find(url, 0).name("源已内置").update();
}
checkJson(JsonParser.parseString(Decoder.getJson(url)).getAsJsonObject(), callback);

2,找到直播源的加载位置,main模块 app/src/main/java/com.fongmi.android.tv/api/LiveConfig文件loadConfig方法。 判断未填写播放源,添加一个即可:
String url = config.getUrl();
if (TextUtils.isEmpty(url)) {
url = "https://gitee.com/kevinr/tvbox/raw/master/spider/test.json";
// 添加以下代码,解决内置源时,投屏播放问题,给定一个配置,写入本地数据库,标记一个name(名字“源已内置”可以随便取,但一定要有,type为1,表示直播)
Config.find(url, 1).name("源已内置").update();
}
parseConfig(Decoder.getJson(url), callback);

3,由于直播按钮依赖config里的url参数,内置后判断为空不显示直播按钮,这里改成不判断 修改上面LiveConfig文件里的hasUrl方法

4,修改设置弹框里的初始化逻辑,避免暴露内置源的地址到设置框。修改代码mobile模块或leanback模块里com/fongmi/android/tv/ui/dialog/ConfigDialog.java:68里的initView方法。

private void initView() {
binding.name.setText(getConfig().getName());
// 这里判断有名字就不回写到设置框里,例如名字是:源已内置
if (TextUtils.isEmpty(getConfig().getName())) {
binding.url.setText(ori = getConfig().getUrl());
}
binding.input.setVisibility(edit ? View.VISIBLE : View.GONE);
binding.url.setSelection(TextUtils.isEmpty(ori) ? 0 : ori.length());
} 非mobile版本,代码可能有一点差异,新增一个getName方法,手动改一下即可:
private void initView() {
String address = Server.get().getAddress();
// binding.text.setText(url = getUrl());
// 这里判断有名字就不回写到设置框里,例如名字是:源已内置
if (TextUtils.isEmpty(getName())) {
binding.text.setText(url = getUrl());
}
binding.code.setImageBitmap(QRCode.getBitmap(address, 200, 0));
binding.text.setSelection(TextUtils.isEmpty(url) ? 0 : url.length());
binding.positive.setText(edit ? R.string.dialog_edit : R.string.dialog_positive);
binding.info.setText(ResUtil.getString(R.string.push_info, address).replace(",", "\n"));
binding.storage.setVisibility(PermissionX.isGranted(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) ? View.GONE : View.VISIBLE);
} getName方法
private String getName() {
switch (type) {
case 0:
return VodConfig.get().getConfig().getName();
case 1:
return LiveConfig.get().getConfig().getName();
case 2:
return WallConfig.get().getConfig().getName();
default:
return "";
}
} 5,修改设置弹框里的初始化逻辑,将设置框内容改成空时,重新读取内置源。修改代码mobile模块或leanback模块里com/fongmi/android/tv/ui/dialog/ConfigDialog.java里的onPositive方法。
private void onPositive(DialogInterface dialog, int which) {
String url = binding.url.getText().toString().trim();
String name = binding.name.getText().toString().trim();
Log.i("ronglei",ori + "---" + type + "---" + edit);
if (edit) Config.find(ori, type).url(url).name(name).update();
if (url.isEmpty()) {
// 未填写时,点了确定,改成内置源
url = "https://gitee.com/kevinr/tvbox/raw/master/spider/test.json";
Config.find(url, 1).name("源已内置").update();
//Config.delete(ori, type);
}
callback.setConfig(Config.find(url, type));
dialog.dismiss();
}

非mobile版本大致一样:
private void onPositive(View view) {
String text = binding.text.getText().toString().trim();
if (edit) Config.find(url, type).url(text).update();
// if (text.isEmpty()) Config.delete(url, type);
if (text.isEmpty()) {
url = "https://gitee.com/kevinr/tvbox/raw/master/spider/test.json";
Config.find(url, 1).name("源已内置").update();
//Config.delete(ori, type);
}
callback.setConfig(Config.find(text, type));
dialog.dismiss();
} 6,这样就完成了内置源的修改,当你去设置的地方填了新的源后,会覆盖内置源,设置为空后,又会读取内置源。
4.打包
1,选择build-generate signed apk

2,选择APK打包后,下一步创建一个签名文件 3,打包,选择版本类型
