/*
指定用户指定应用传感器管理
支持禁用、解除、查看,重置
*/
ServiceManager = android.os.ServiceManager;
ParcelFileDescriptor = android.os.ParcelFileDescriptor;
function runSensorCmd(args, userId) {
svc = ServiceManager.getService("sensorservice");
pin = ParcelFileDescriptor.createPipe();
pout = ParcelFileDescriptor.createPipe();
perr = ParcelFileDescriptor.createPipe();
pin[1].close();
// 如果有指定用户,添加 --user 参数
if (userId != undefined && userId != null) {
args.push("--user");
args.push(String(userId));
}
svc.shellCommand(
pin[0].getFileDescriptor(),
pout[1].getFileDescriptor(),
perr[1].getFileDescriptor(),
args,
null,
new android.os.ResultReceiver(null)
);
pout[1].close();
perr[1].close();
function read(p){
s = new android.os.ParcelFileDescriptor.AutoCloseInputStream(p[0]);
r = "";
b = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
n ="";
while((n = s.read(b)) > 0){
r += new java.lang.String(b, 0, n, "UTF-8");
}
return r;
}
result = read(pout) + read(perr);
result = result.trim();
if (args[0] == "get-uid-state") {
if (result.includes("idle")) return true;
if (result.includes("active")) return false;
return false;
}
return result;
}
// 1) 禁用(设置为 idle,相当于限制传感器)
// runSensorCmd(["set-uid-state", "包名", "idle"], 0);
// 2) 恢复 active(取消限制)
// runSensorCmd(["set-uid-state", "com.liuzh.deviceinfo", "active"], 0);
// 3) 查看状态
// true 已禁用 false 未禁用
runSensorCmd(["get-uid-state", "com.liuzh.deviceinfo"], 0);
// 4) 恢复默认(清除 override)
// runSensorCmd(["reset-uid-state", "包名"], 0);
// 该接口不会禁用摄像头和麦克风,下载类似设备信息APP测试效果
// Android 11-16已测试成功,其他版本未知#Javascript