Android/XixunPlayer-laun/app/src/main/java/com/xixun/xixunplayer/MainService.java

133 lines
5.7 KiB
Java
Raw Normal View History

2026-01-29 02:38:41 +08:00
package com.xixun.xixunplayer;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import net.lingala.zip4j.ZipFile;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import gnph.util.IOs;
public class MainService extends Service {
static MainService ins;
ArrayList<BroadcastReceiver> reces = new ArrayList<>();
@Override
public void onCreate() {
super.onCreate();
ins = this;
Util.println("==>> MainService onCreate >>>> "+hashCode()+" Thread: "+Thread.currentThread().getId());
TCPThread.startServer(3333);
// if(MainActivity.ins!=null) return;
// var intent = new Intent(this, MainActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// startActivity(intent);
BroadcastReceiver rece;
var intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addDataScheme("file");
registerReceiver(rece = new BroadcastReceiver(){
long lastMs;
final char[] pass = {'8','8','8'};
@Override
public void onReceive(Context context, Intent intent) { // in UI Thread
var path = intent.getData().getPath();
Util.println("\nMEDIA_MOUNTED path: "+path);
var ms = System.currentTimeMillis();
if(ms-lastMs<1000) return;
lastMs = ms;
var acti = MainActivity.ins;
Util.makeText(MainService.this, "MEDIA_MOUNTED path: "+path+"\nImporting 正在导入 ...").show();
new Thread(()->{
try {
var zip = new ZipFile(path+"/program.zip");
if(zip.isEncrypted()) zip.setPassword(pass);
long size = 0;
ByteArrayOutputStream jsonOut = null;
var headers = zip.getFileHeaders();
for(var header : headers) {
size += header.getUncompressedSize();
if("program".equals(header.getFileName())) IOs.writeClose(jsonOut = new ByteArrayOutputStream(), zip.getInputStream(header));
}
if(jsonOut==null) {
Util.println("No program File");
if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "No program File").show());
return;
}
if(size==0) {
Util.println("zip size is 0");
if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "zip size is 0").show());
return;
}
String suffix;
if(Util.isLaun) {
suffix = "USB";
new File(Util.programDir + suffix).mkdirs();
} else suffix = "";
Util.deleteFiles(size, null, suffix);
for(var header : headers) if(! "program".equals(header.getFileName())) {
Util.println(" name: " + header.getFileName());
var fOut = new FileOutputStream(Util.programDir + suffix + "/" + header.getFileName());
IOs.writeCloseIn(fOut, zip.getInputStream(header));
fOut.flush();
fOut.getFD().sync();
fOut.close();
}
var json = jsonOut.toByteArray();
Util.println("Import Succeed");
if(acti!=null) acti.runOnUiThread(() -> {
Util.makeText(acti, "Import Succeed 导入成功").show();
Util.curProgDir = Util.programDir + suffix;
acti.initProg(json);
});
else {
Util.curProgDir = Util.programDir + suffix;
var fOut = new FileOutputStream(Util.curProgDir + "/program");
fOut.write(json);
fOut.flush();
fOut.getFD().sync();
fOut.close();
var inten = new Intent(MainService.this, MainActivity.class);
inten.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(inten);
}
var inten = new Intent("com.xixun.AccessibilityService");
inten.putExtra("newProgram", "USB");
sendBroadcast(inten);
} catch (Exception e) {
Util.printStackTrace(e);
if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, Util.toStr(e)).show());
}
}).start();
}
}, intentFilter);
reces.add(rece);
}
@Override
public void onDestroy() {
super.onDestroy();
Util.println("==<< MainService onDestroy <<<< this "+hashCode());
ins = null;
for(var rece : reces) {
try {
unregisterReceiver(rece);
} catch (Throwable ignored){
}
}
System.gc();
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
}