This commit is contained in:
Gangphon 2026-01-12 19:52:51 +08:00
parent a8dc0a192f
commit 7af8c10ba5
8 changed files with 103 additions and 52 deletions

View File

@ -11,17 +11,10 @@ android {
minSdk 21
targetSdk 34
versionCode 1
versionName "2.2.16-N"
versionName "2.2.18-Y"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
buildFeatures {
aidl true
}
@ -30,6 +23,52 @@ android {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
signingConfigs {
X {//4418
keyAlias 'xixun'
keyPassword '123456'
storeFile file('D:/develop/xixun/signedFile/keystore/xixun-x.keystore')
storePassword '123456'
}
Y {//210
keyAlias 'xixun'
keyPassword '123456'
storeFile file('D:/develop/xixun/signedFile/keystore/xixun-y.keystore')
storePassword '123456'
}
D_3568a {//3568a
keyAlias 'keystore'
keyPassword 'android'
storeFile file('D:/develop/xixun/signedFile/keystore/keystore.jks')
storePassword 'android'
}
D_3568N {//3568
keyAlias 'systemkey'
keyPassword '123456'
storeFile file('D:/_docs/comp/android/keystore/3568D恩泰世 123456.jks')
storePassword '123456'
}
D_YF {//3566 YF
keyAlias 'platform'
keyPassword 'youngfeel'
storeFile file('D:/_docs/comp/android/keystore/yf356x_android11_system.jks')
storePassword 'youngfeel'
}
}
buildTypes {
release {
lintOptions {
checkReleaseBuilds false
abortOnError false
}
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.D_3568N
}
debug {
signingConfig signingConfigs.D_3568N
}
}
}
dependencies {

View File

@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
<!-- android:sharedUserId="android.uid.system"-->
<!-- android:sharedUserMaxSdkVersion="32">-->
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="android.uid.system">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -106,7 +106,8 @@
<img src="images/web3.png" class="imgSize1" style="object-fit: contain;">
</div>
</div>
<div style="width: 100%;min-height: 25%;">
<div style="display: flex;align-items: flex-start;justify-content: space-between;width: 100%;min-height: 25%;">
<div>
<div class="fontBold Hcenter">
<span class="step-icon">📌</span>
<span class="i18n-text" data-i18n="notes">注意事项</span>
@ -115,6 +116,12 @@
设备需切换至联网模式并关联云平台账号云服务器地址https://www.ledokcloud.com
</div>
</div>
<div style="width: 1rem;"></div>
<div>
<img id="videoCommentaryQrcode" src="images/code_cn.png" class="imgSize3" style="object-fit: contain;">
<div class="qrcode-text i18n-text" data-i18n="videoCommentary">视频详解</div>
</div>
</div>
</div>
</div>
</div>
@ -166,7 +173,7 @@
<div>
<img src="images/code.png" class="imgSize3"
style="object-fit: contain;">
<!-- <div class="qrcode-text i18n-text" data-i18n="scanDownload">扫码下载APP</div> -->
<div class="qrcode-text i18n-text" data-i18n="scanDownload">扫码下载APP</div>
</div>
</div>
</div>
@ -244,14 +251,15 @@
appStep2: "2.创建并编辑节目",
appStep3: "3.发送节目到设备",
appNote: "设备需切换至热点模式,手机需连接该设备热点",
scanDownload: "扫码下载APP",
scanDownload: "下载APP",
usbStep1: "1.节目文件存入U盘",
usbStep2: "2.U盘接入设备",
usbStep3: "3.系统自动播放",
usbNote: "无设备模式限制U盘即插即播",
loading: "正在接收Android宽高...",
loadFail: "接收宽高失败",
unknownNetwork: "未知网络"
unknownNetwork: "未知网络",
videoCommentary: "视频详解"
},
// 英文
en: {
@ -272,14 +280,15 @@
appStep2: "2.Create and edit programs",
appStep3: "3.Send programs to device",
appNote: "The device must be switched to hotspot mode, and the mobile phone must connect to the device's hotspot",
scanDownload: "Scan to download APP",
scanDownload: "Download APP",
usbStep1: "1.Save program files to USB",
usbStep2: "2.Connect USB to device",
usbStep3: "3.System plays automatically",
usbNote: "No device mode restrictions, plug and play with USB",
loading: "Receiving Android width and height...",
loadFail: "Failed to receive width and height",
unknownNetwork: "Unknown Network"
unknownNetwork: "Unknown Network",
videoCommentary: "Video commentary"
}
};
@ -375,7 +384,8 @@
const cardId = document.getElementById("cardId");
const cardVideos = document.querySelectorAll(".card-bg-video"); // 所有卡片视频
const infoBarVideo = document.querySelector(".info-bar-bg-video"); // 顶部信息栏视频
const qrcodeImg = document.getElementById("videoCommentaryQrcode");
qrcodeImg.src = currentLang === "zh" ? "images/code_cn.png" : "images/code_en.png";
try {
// ---------------------- 1. 获取并更新宽高 ----------------------
const sizeJson = AndroidBridge.getSizeFromAndroid();

View File

@ -110,7 +110,7 @@ public class AIDLService extends Service {
@SuppressLint("ResourceType")
@Override
public String executeJosnCommand(String jsonstr) throws RemoteException {
Util.println("AIDL executeJsonCommand ..."+jsonstr);//{"_type":"DeleteTask","id":"652522a0e81d1e000009201a","sendTo":"yzd-player"}
Util.println("AIDL executeJson "+jsonstr);//{"_type":"DeleteTask","id":"652522a0e81d1e000009201a","sendTo":"yzd-player"}
String commandId = null;
try {
var jsonBytes = jsonstr.getBytes(StandardCharsets.UTF_8);

View File

@ -182,7 +182,6 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
protected void onResume() {
super.onResume();
Util.println(" ==>> MainActivity onResume >> "+hashCode());
if(progView==null && insView==null) runOnUiThread(this::initProg);
}
@Override
@ -190,7 +189,6 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
super.onPause();
Util.println(" ==<< MainActivity onPause << "+hashCode());
state = 8;
stopProg();
}
CardService serviCard;
@ -246,31 +244,22 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
return "{\"width\":\"" + Util.screenWidth + "px\",\"height\":\"" + Util.screenHeight + "px\"}";
}
@JavascriptInterface
public String getNetwork() {
// 获取当前网络类型
public String getNetwork() {// 获取当前网络类型
NetworkTypeUtil.NetworkType networkType = NetworkTypeUtil.getCurrentNetworkType(MainActivity.this);
String value = "";
switch (networkType) {
case WIFI:
value = NetworkTypeUtil.getWifiSsid(MainActivity.this);
// 处理未获取到SSID的情况
value = NetworkTypeUtil.getWifiSsid(MainActivity.this);// 处理未获取到SSID的情况
if(O.isEmpty(value)) value = "未知WiFi名称";
System.out.println("当前是 WiFi 网络:" + value);
break;
case ETHERNET:
System.out.println("当前是有线网络");
break;
case CELLULAR:
// 细分蜂窝网络类型2G/3G/4G
String cellularSubType = NetworkTypeUtil.getCellularSubType(MainActivity.this);
value = cellularSubType;
System.out.println("当前是蜂窝网络:" + cellularSubType);
case CELLULAR:// 细分蜂窝网络类型2G/3G/4G
value = NetworkTypeUtil.getCellularSubType(MainActivity.this);;
break;
case NONE:
System.out.println("无网络连接");
break;
case UNKNOWN:
System.out.println("未知网络类型如蓝牙、VPN");
break;
}
var IP = NetworkTypeUtil.getActiveNetworkIp(MainActivity.this);
@ -570,11 +559,17 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
AudioManager audioManager;
AudioFocusRequest audioFocusRequest;
public void stopProg() {
Util.println("---- Stop Prog\n");
avas.clear();
showHides.clear();
showeds.clear();
curAva = 0;
curTimes = 1;
if(backViewL==null) setContentView(backView);
else {
setContentView(backViewL);
backViewL.loadUrl("file:///android_asset/local_page.html");
}
if(insView!=null) {
insView.release();
insView = null;
@ -583,11 +578,6 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
progView.release();
progView = null;
}
if(backViewL==null) setContentView(backView);
else {
setContentView(backViewL);
backViewL.loadUrl("file:///android_asset/local_page.html");
}
System.gc();
}
public boolean delProgFile() {
@ -609,9 +599,11 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
return ok;
}
public void initProg() {
Util.println("\n---- Init Prog");
if(progView!=null || insView!=null) return;
state = 1;
try {
Util.println("\nParse Insert Prog Json");
Util.println(" Parse Insert Json");
var root = JSMap.fromClose(new BufferedInputStream(new FileInputStream(Util.programDir + "/insert")));
var task = root.jsmap("task");
if(task==null && root.containsKey("layers")) task = new JSMap("items", new JSList<>(new JSMap("_program", root)));
@ -626,7 +618,7 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
}
var demand = 0;
try {
Util.println("\nParse Prog Json");
Util.println(" Parse Json");
var root = JSMap.fromClose(new BufferedInputStream(new FileInputStream(Util.programDir + "/program")));
var task = root.jsmap("task");
demand = root.intg("Demand");
@ -669,8 +661,8 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
} else if(state != 7) state = 3;
}
public void initProg(byte[] json) {
Util.println("\n---- Init Prog with json");
try {
Util.println("\nParse Prog Json");
var root = JSMap.from(json);
var task = root.jsmap("task");
if(task==null) {

View File

@ -490,9 +490,20 @@ public class Prog extends AbsLayout {
void release() {
try {
setVisibility(GONE);
View view;
for(int cc=0; cc<getChildCount(); cc++) if((view = getChildAt(cc)) instanceof SrcVideo) ((SrcVideo) view).release();
for(var page : pages) for(var layer : page.layers) for(var src : layer.srcs) if(src.tts!=null) src.tts.shutdown();
for(var page : pages) for(var layer : page.layers) for(var src : layer.srcs) {
if(src.tts!=null) src.tts.shutdown();
if(src.view instanceof SrcVideo) {
((SrcVideo) src.view).release();
src.view = null;
Util.println(" SrcVideo released");
} else if(src.view instanceof WebView) {
var web = (WebView) src.view;
web.removeAllViews();
web.destroy();
src.view = null;
Util.println(" WebView destroyed");
}
}
} catch (Throwable e) {
Util.printStackTrace(e);
}