You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
TermApp/app/src/main/java/com/xypower/mpapp/adb/CameraAdb.java

192 lines
6.1 KiB
Java

package com.xypower.mpapp.adb;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.dev.devapi.api.SysApi;
import com.xypower.common.FilesUtils;
import com.xypower.common.MicroPhotoContext;
import com.xypower.mpapp.MicroPhotoService;
import com.xypower.mpapp.v2.Camera2VideoActivity;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.Optional;
import dadb.AdbKeyPair;
import dadb.AdbShellResponse;
import dadb.Dadb;
public class CameraAdb {
private final String TAG = "CameraAdb";
private Context mContext;
private String mAppPath;
private AdbKeyPair mAdbKeyPair;
private String mDeviceIp = "127.0.0.1";
public CameraAdb(Context context, String appPath) {
mContext = context;
mAppPath = appPath;
try {
File cameraPath = new File("/sdcard/DCIM/Camera/");
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return true;
}
};
File[] files = cameraPath.listFiles(filter);
for (File file : files) {
if (file.lastModified() > 1722960000000L) {
file.delete();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
File file = new File( new File(appPath), "data/.keypair");
if (!file.exists()) {
file.mkdirs();
}
final File pubKeyFile = new File(file, "pub.key");
final File priKeyFile = new File(file, "pri.key");
if (!priKeyFile.exists() || !pubKeyFile.exists()) {
AdbKeyPair.generate(priKeyFile, pubKeyFile);
}
mAdbKeyPair = AdbKeyPair.read(priKeyFile, pubKeyFile);
}
public void takePhoto() {
new Thread(new Runnable() {
@Override
public void run() {
takePhotoImpl();
}
}).start();
}
private void takePhotoImpl() {
long requestTime = System.currentTimeMillis() / 1000;
takePhoto(false);
long takingTime = System.currentTimeMillis() / 1000;
sleep(1500);
movePhoto(false, requestTime, takingTime);
sleep(100);
SysApi.forceStopApp(mContext, "com.mediatek.camera");
sleep(200);
requestTime = System.currentTimeMillis() / 1000;
takePhoto(true);
takingTime = System.currentTimeMillis() / 1000;
sleep(250);
movePhoto(true, requestTime, takingTime);
sleep(200);
SysApi.forceStopApp(mContext, "com.mediatek.camera");
MicroPhotoService.restartApp(mContext, MicroPhotoContext.PACKAGE_NAME_MPAPP);
}
private void movePhoto(boolean frontCamera, long requestTime, long takingTime) {
String photoPath = mAppPath + "photos/";
String photoFile = "IMG_" + Long.toHexString(requestTime).toUpperCase() + "_"
+ (frontCamera ? "2" : "1") + "_FF_0_" + Long.toHexString(requestTime).toUpperCase()
+ "_" + Long.toHexString(takingTime).toUpperCase() + ".jpg";
File cameraPath = new File("/sdcard/DCIM/Camera/");
Optional<File> opFile = Arrays.stream(cameraPath.listFiles(File::isFile))
.max((f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified()));
boolean res = false;
if (opFile.isPresent()) {
File targetFile = new File(new File(photoPath), photoFile);
try {
File srcFile = opFile.get();
for (int idx = 0; idx < 10; idx++) {
res = srcFile.renameTo(targetFile);
if (res) {
break;
}
sleep(200);
}
} catch (Exception e) {
e.printStackTrace();
}
if (!res) {
Log.e(TAG, "Failed to copy photo from Camera");
}
}
}
private void sleep(long timeout) {
try {
Thread.sleep(timeout);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void takePhoto(final boolean frontCamera) {
Dadb adb = Dadb.discover(mDeviceIp, mAdbKeyPair);
if (adb == null) {
return;
}
Log.d(TAG, mDeviceIp + " Connected");
boolean res = false;
String[] cmds = {
"content insert --uri content://settings/system --bind name:s:accelerometer_rotation --bind value:i:0",
"content insert --uri content://settings/system --bind name:s:user_rotation --bind value:i:1",
"am force-stop com.mediatek.camera",
"wait 1000",
"setprop mtk.camera.app.keycode.enable 1",
"setprop mtk.camera.switch.camera.debug 1",
"setprop mtk.camera.switch.id.debug back-1",
"am start -a android.media.action.STILL_IMAGE_CAMERA" +
(frontCamera ? " --ez com.google.assistant.extra.USE_FRONT_CAMERA true" : "") + " -f " + Integer.toString(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP),
"wait 3000",
"input keyevent 27"};
AdbShellResponse adbShellResponse = null;
for (String cmd : cmds) {
if (cmd.startsWith("wait ")) {
try {
Thread.sleep(Long.parseLong(cmd.substring(5)));
} catch (Exception ex) {
ex.printStackTrace();
}
continue;
}
try {
adbShellResponse = adb.shell(cmd);
} catch (Exception ex) {
ex.printStackTrace();
}
Log.i(TAG, "CMD: " + cmd);
if (adbShellResponse.getExitCode() == 0) {
String[] lines = FilesUtils.splitLines(adbShellResponse.getAllOutput());
for (String line : lines) {
Log.i(TAG, line);
}
}
}
}
}