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 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"); } }