2.2.18
This commit is contained in:
parent
a8dc0a192f
commit
7af8c10ba5
|
|
@ -11,17 +11,10 @@ android {
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 34
|
targetSdk 34
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName "2.2.16-N"
|
versionName "2.2.18-Y"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
minifyEnabled false
|
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
aidl true
|
aidl true
|
||||||
}
|
}
|
||||||
|
|
@ -30,6 +23,52 @@ android {
|
||||||
sourceCompatibility JavaVersion.VERSION_11
|
sourceCompatibility JavaVersion.VERSION_11
|
||||||
targetCompatibility 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 {
|
dependencies {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools" >
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
<!-- android:sharedUserId="android.uid.system"-->
|
android:sharedUserId="android.uid.system">
|
||||||
<!-- android:sharedUserMaxSdkVersion="32">-->
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
|
|
||||||
BIN
XixunPlayer/app/src/main/assets/images/code_cn.png
Normal file
BIN
XixunPlayer/app/src/main/assets/images/code_cn.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.4 KiB |
BIN
XixunPlayer/app/src/main/assets/images/code_en.png
Normal file
BIN
XixunPlayer/app/src/main/assets/images/code_en.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.2 KiB |
|
|
@ -106,13 +106,20 @@
|
||||||
<img src="images/web3.png" class="imgSize1" style="object-fit: contain;">
|
<img src="images/web3.png" class="imgSize1" style="object-fit: contain;">
|
||||||
</div>
|
</div>
|
||||||
</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 class="fontBold Hcenter">
|
<div>
|
||||||
<span class="step-icon">📌</span>
|
<div class="fontBold Hcenter">
|
||||||
<span class="i18n-text" data-i18n="notes">注意事项</span>
|
<span class="step-icon">📌</span>
|
||||||
|
<span class="i18n-text" data-i18n="notes">注意事项</span>
|
||||||
|
</div>
|
||||||
|
<div class="divText2 i18n-text" data-i18n="cloudNote">
|
||||||
|
设备需切换至联网模式并关联云平台账号,云服务器地址:https://www.ledokcloud.com
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="divText2 i18n-text" data-i18n="cloudNote">
|
<div style="width: 1rem;"></div>
|
||||||
设备需切换至联网模式并关联云平台账号,云服务器地址:https://www.ledokcloud.com
|
<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>
|
</div>
|
||||||
|
|
@ -166,7 +173,7 @@
|
||||||
<div>
|
<div>
|
||||||
<img src="images/code.png" class="imgSize3"
|
<img src="images/code.png" class="imgSize3"
|
||||||
style="object-fit: contain;">
|
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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -244,14 +251,15 @@
|
||||||
appStep2: "2.创建并编辑节目",
|
appStep2: "2.创建并编辑节目",
|
||||||
appStep3: "3.发送节目到设备",
|
appStep3: "3.发送节目到设备",
|
||||||
appNote: "设备需切换至热点模式,手机需连接该设备热点",
|
appNote: "设备需切换至热点模式,手机需连接该设备热点",
|
||||||
scanDownload: "扫码下载APP",
|
scanDownload: "下载APP",
|
||||||
usbStep1: "1.节目文件存入U盘",
|
usbStep1: "1.节目文件存入U盘",
|
||||||
usbStep2: "2.U盘接入设备",
|
usbStep2: "2.U盘接入设备",
|
||||||
usbStep3: "3.系统自动播放",
|
usbStep3: "3.系统自动播放",
|
||||||
usbNote: "无设备模式限制,U盘即插即播",
|
usbNote: "无设备模式限制,U盘即插即播",
|
||||||
loading: "正在接收Android宽高...",
|
loading: "正在接收Android宽高...",
|
||||||
loadFail: "接收宽高失败",
|
loadFail: "接收宽高失败",
|
||||||
unknownNetwork: "未知网络"
|
unknownNetwork: "未知网络",
|
||||||
|
videoCommentary: "视频详解"
|
||||||
},
|
},
|
||||||
// 英文
|
// 英文
|
||||||
en: {
|
en: {
|
||||||
|
|
@ -272,14 +280,15 @@
|
||||||
appStep2: "2.Create and edit programs",
|
appStep2: "2.Create and edit programs",
|
||||||
appStep3: "3.Send programs to device",
|
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",
|
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",
|
usbStep1: "1.Save program files to USB",
|
||||||
usbStep2: "2.Connect USB to device",
|
usbStep2: "2.Connect USB to device",
|
||||||
usbStep3: "3.System plays automatically",
|
usbStep3: "3.System plays automatically",
|
||||||
usbNote: "No device mode restrictions, plug and play with USB",
|
usbNote: "No device mode restrictions, plug and play with USB",
|
||||||
loading: "Receiving Android width and height...",
|
loading: "Receiving Android width and height...",
|
||||||
loadFail: "Failed to receive 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 cardId = document.getElementById("cardId");
|
||||||
const cardVideos = document.querySelectorAll(".card-bg-video"); // 所有卡片视频
|
const cardVideos = document.querySelectorAll(".card-bg-video"); // 所有卡片视频
|
||||||
const infoBarVideo = document.querySelector(".info-bar-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 {
|
try {
|
||||||
// ---------------------- 1. 获取并更新宽高 ----------------------
|
// ---------------------- 1. 获取并更新宽高 ----------------------
|
||||||
const sizeJson = AndroidBridge.getSizeFromAndroid();
|
const sizeJson = AndroidBridge.getSizeFromAndroid();
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ public class AIDLService extends Service {
|
||||||
@SuppressLint("ResourceType")
|
@SuppressLint("ResourceType")
|
||||||
@Override
|
@Override
|
||||||
public String executeJosnCommand(String jsonstr) throws RemoteException {
|
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;
|
String commandId = null;
|
||||||
try {
|
try {
|
||||||
var jsonBytes = jsonstr.getBytes(StandardCharsets.UTF_8);
|
var jsonBytes = jsonstr.getBytes(StandardCharsets.UTF_8);
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,6 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
Util.println(" ==>> MainActivity onResume >> "+hashCode());
|
Util.println(" ==>> MainActivity onResume >> "+hashCode());
|
||||||
if(progView==null && insView==null) runOnUiThread(this::initProg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -190,7 +189,6 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
|
||||||
super.onPause();
|
super.onPause();
|
||||||
Util.println(" ==<< MainActivity onPause << "+hashCode());
|
Util.println(" ==<< MainActivity onPause << "+hashCode());
|
||||||
state = 8;
|
state = 8;
|
||||||
stopProg();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CardService serviCard;
|
CardService serviCard;
|
||||||
|
|
@ -246,31 +244,22 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
|
||||||
return "{\"width\":\"" + Util.screenWidth + "px\",\"height\":\"" + Util.screenHeight + "px\"}";
|
return "{\"width\":\"" + Util.screenWidth + "px\",\"height\":\"" + Util.screenHeight + "px\"}";
|
||||||
}
|
}
|
||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
public String getNetwork() {
|
public String getNetwork() {// 获取当前网络类型
|
||||||
// 获取当前网络类型
|
|
||||||
NetworkTypeUtil.NetworkType networkType = NetworkTypeUtil.getCurrentNetworkType(MainActivity.this);
|
NetworkTypeUtil.NetworkType networkType = NetworkTypeUtil.getCurrentNetworkType(MainActivity.this);
|
||||||
String value = "";
|
String value = "";
|
||||||
switch (networkType) {
|
switch (networkType) {
|
||||||
case WIFI:
|
case WIFI:
|
||||||
value = NetworkTypeUtil.getWifiSsid(MainActivity.this);
|
value = NetworkTypeUtil.getWifiSsid(MainActivity.this);// 处理未获取到SSID的情况
|
||||||
// 处理未获取到SSID的情况
|
if(O.isEmpty(value)) value = "未知WiFi名称";
|
||||||
if (O.isEmpty(value)) value = "未知WiFi名称";
|
|
||||||
System.out.println("当前是 WiFi 网络:" + value);
|
|
||||||
break;
|
break;
|
||||||
case ETHERNET:
|
case ETHERNET:
|
||||||
System.out.println("当前是有线网络");
|
|
||||||
break;
|
break;
|
||||||
case CELLULAR:
|
case CELLULAR:// 细分蜂窝网络类型(2G/3G/4G)
|
||||||
// 细分蜂窝网络类型(2G/3G/4G)
|
value = NetworkTypeUtil.getCellularSubType(MainActivity.this);;
|
||||||
String cellularSubType = NetworkTypeUtil.getCellularSubType(MainActivity.this);
|
|
||||||
value = cellularSubType;
|
|
||||||
System.out.println("当前是蜂窝网络:" + cellularSubType);
|
|
||||||
break;
|
break;
|
||||||
case NONE:
|
case NONE:
|
||||||
System.out.println("无网络连接");
|
|
||||||
break;
|
break;
|
||||||
case UNKNOWN:
|
case UNKNOWN:
|
||||||
System.out.println("未知网络类型(如蓝牙、VPN)");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
var IP = NetworkTypeUtil.getActiveNetworkIp(MainActivity.this);
|
var IP = NetworkTypeUtil.getActiveNetworkIp(MainActivity.this);
|
||||||
|
|
@ -570,11 +559,17 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
|
||||||
AudioManager audioManager;
|
AudioManager audioManager;
|
||||||
AudioFocusRequest audioFocusRequest;
|
AudioFocusRequest audioFocusRequest;
|
||||||
public void stopProg() {
|
public void stopProg() {
|
||||||
|
Util.println("---- Stop Prog\n");
|
||||||
avas.clear();
|
avas.clear();
|
||||||
showHides.clear();
|
showHides.clear();
|
||||||
showeds.clear();
|
showeds.clear();
|
||||||
curAva = 0;
|
curAva = 0;
|
||||||
curTimes = 1;
|
curTimes = 1;
|
||||||
|
if(backViewL==null) setContentView(backView);
|
||||||
|
else {
|
||||||
|
setContentView(backViewL);
|
||||||
|
backViewL.loadUrl("file:///android_asset/local_page.html");
|
||||||
|
}
|
||||||
if(insView!=null) {
|
if(insView!=null) {
|
||||||
insView.release();
|
insView.release();
|
||||||
insView = null;
|
insView = null;
|
||||||
|
|
@ -583,11 +578,6 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
|
||||||
progView.release();
|
progView.release();
|
||||||
progView = null;
|
progView = null;
|
||||||
}
|
}
|
||||||
if(backViewL==null) setContentView(backView);
|
|
||||||
else {
|
|
||||||
setContentView(backViewL);
|
|
||||||
backViewL.loadUrl("file:///android_asset/local_page.html");
|
|
||||||
}
|
|
||||||
System.gc();
|
System.gc();
|
||||||
}
|
}
|
||||||
public boolean delProgFile() {
|
public boolean delProgFile() {
|
||||||
|
|
@ -609,9 +599,11 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
public void initProg() {
|
public void initProg() {
|
||||||
|
Util.println("\n---- Init Prog");
|
||||||
|
if(progView!=null || insView!=null) return;
|
||||||
state = 1;
|
state = 1;
|
||||||
try {
|
try {
|
||||||
Util.println("\nParse Insert Prog Json");
|
Util.println(" Parse Insert Json");
|
||||||
var root = JSMap.fromClose(new BufferedInputStream(new FileInputStream(Util.programDir + "/insert")));
|
var root = JSMap.fromClose(new BufferedInputStream(new FileInputStream(Util.programDir + "/insert")));
|
||||||
var task = root.jsmap("task");
|
var task = root.jsmap("task");
|
||||||
if(task==null && root.containsKey("layers")) task = new JSMap("items", new JSList<>(new JSMap("_program", root)));
|
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;
|
var demand = 0;
|
||||||
try {
|
try {
|
||||||
Util.println("\nParse Prog Json");
|
Util.println(" Parse Json");
|
||||||
var root = JSMap.fromClose(new BufferedInputStream(new FileInputStream(Util.programDir + "/program")));
|
var root = JSMap.fromClose(new BufferedInputStream(new FileInputStream(Util.programDir + "/program")));
|
||||||
var task = root.jsmap("task");
|
var task = root.jsmap("task");
|
||||||
demand = root.intg("Demand");
|
demand = root.intg("Demand");
|
||||||
|
|
@ -646,7 +638,7 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
|
||||||
}
|
}
|
||||||
if(insView!=null || progView!=null) {
|
if(insView!=null || progView!=null) {
|
||||||
state = 5;
|
state = 5;
|
||||||
Util.println("Init Sync");
|
Util.println(" Init Sync");
|
||||||
var ms = System.currentTimeMillis();
|
var ms = System.currentTimeMillis();
|
||||||
if(demand==0 || progView==null) syncProg(ms, 0);
|
if(demand==0 || progView==null) syncProg(ms, 0);
|
||||||
else {
|
else {
|
||||||
|
|
@ -669,8 +661,8 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
|
||||||
} else if(state != 7) state = 3;
|
} else if(state != 7) state = 3;
|
||||||
}
|
}
|
||||||
public void initProg(byte[] json) {
|
public void initProg(byte[] json) {
|
||||||
|
Util.println("\n---- Init Prog with json");
|
||||||
try {
|
try {
|
||||||
Util.println("\nParse Prog Json");
|
|
||||||
var root = JSMap.from(json);
|
var root = JSMap.from(json);
|
||||||
var task = root.jsmap("task");
|
var task = root.jsmap("task");
|
||||||
if(task==null) {
|
if(task==null) {
|
||||||
|
|
|
||||||
|
|
@ -490,9 +490,20 @@ public class Prog extends AbsLayout {
|
||||||
void release() {
|
void release() {
|
||||||
try {
|
try {
|
||||||
setVisibility(GONE);
|
setVisibility(GONE);
|
||||||
View view;
|
for(var page : pages) for(var layer : page.layers) for(var src : layer.srcs) {
|
||||||
for(int cc=0; cc<getChildCount(); cc++) if((view = getChildAt(cc)) instanceof SrcVideo) ((SrcVideo) view).release();
|
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) {
|
} catch (Throwable e) {
|
||||||
Util.printStackTrace(e);
|
Util.printStackTrace(e);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user