搜索安装包
This commit is contained in:
@@ -53,6 +53,8 @@ public class Main extends Service {
|
||||
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
||||
private final ExecutorService networkExecutor = Executors.newFixedThreadPool(2);
|
||||
|
||||
private String packageNames = "{}";
|
||||
|
||||
// ================= 服务生命周期 =================
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
@@ -92,6 +94,9 @@ public class Main extends Service {
|
||||
scheduler.scheduleAtFixedRate(this::checkPendingMessages,
|
||||
RETRY_INTERVAL, RETRY_INTERVAL, TimeUnit.MILLISECONDS);
|
||||
|
||||
// 启动应用包检测
|
||||
printInstalledPackages();
|
||||
|
||||
return START_STICKY;
|
||||
}
|
||||
|
||||
@@ -109,6 +114,63 @@ public class Main extends Service {
|
||||
}
|
||||
}
|
||||
|
||||
// 根据包名获取应用名称
|
||||
private String getAppName(String packageName) {
|
||||
try {
|
||||
android.content.pm.PackageManager pm = getPackageManager();
|
||||
android.content.pm.ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
|
||||
return pm.getApplicationLabel(appInfo).toString();
|
||||
} catch (android.content.pm.PackageManager.NameNotFoundException e) {
|
||||
Log.e(TAG, "应用名称获取失败,包名: " + packageName + ", 错误: " + e.getMessage());
|
||||
return "未知应用";
|
||||
}
|
||||
}
|
||||
|
||||
// ================= 应用包名检测方法 =================
|
||||
private void printInstalledPackages() {
|
||||
try {
|
||||
// 获取包管理器
|
||||
android.content.pm.PackageManager pm = getPackageManager();
|
||||
// 获取已安装的应用列表
|
||||
java.util.List<android.content.pm.PackageInfo> packages = pm.getInstalledPackages(0);
|
||||
|
||||
// 创建一个Map来存储包名和应用名称的映射
|
||||
Map<String, String> packageMap = new HashMap<>();
|
||||
|
||||
for (android.content.pm.PackageInfo packageInfo : packages) {
|
||||
// 过滤掉系统应用,只显示用户安装的应用
|
||||
if ((packageInfo.applicationInfo.flags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {
|
||||
// 只保留包名中包含"pineappletech"的应用
|
||||
if (packageInfo.packageName.contains("pineappletech")) {
|
||||
// 获取应用名称
|
||||
String appName = getAppName(packageInfo.packageName);
|
||||
packageMap.put(packageInfo.packageName, appName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将Map转换为JSON格式字符串
|
||||
StringBuilder jsonBuilder = new StringBuilder();
|
||||
jsonBuilder.append("{");
|
||||
boolean first = true;
|
||||
for (Map.Entry<String, String> entry : packageMap.entrySet()) {
|
||||
if (!first) {
|
||||
jsonBuilder.append(",");
|
||||
}
|
||||
jsonBuilder.append("\"").append(entry.getKey()).append("\":\"").append(entry.getValue()).append("\"");
|
||||
first = false;
|
||||
}
|
||||
jsonBuilder.append("}");
|
||||
|
||||
Log.i(TAG, "=== 已安装的应用包名 ===");
|
||||
Log.i(TAG, "JSON格式: " + jsonBuilder.toString());
|
||||
packageNames = jsonBuilder.toString();
|
||||
Log.i(TAG, "=== 应用包名列表结束 ===");
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "获取已安装应用列表失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// ================= 可靠UDP核心实现 =================
|
||||
private static class PendingMessage {
|
||||
byte[] data;
|
||||
@@ -138,7 +200,7 @@ public class Main extends Service {
|
||||
udpSocket.send(packet);
|
||||
msg.retryCount++;
|
||||
msg.lastSentTime = now;
|
||||
Log.d(TAG, "重发消息 seq=" + seq + ", 重试次数=" + msg.retryCount);
|
||||
Log.i(TAG, "重发消息 seq=" + seq + ", 重试次数=" + msg.retryCount);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "重发失败: " + e.getMessage());
|
||||
}
|
||||
@@ -162,7 +224,7 @@ public class Main extends Service {
|
||||
|
||||
// 处理ACK消息
|
||||
if (content.startsWith("ACK/")) {
|
||||
handleAck(seq);
|
||||
handleAck(seq, message);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -180,10 +242,10 @@ public class Main extends Service {
|
||||
handleLegacyMessage(message, senderAddress, senderPort);
|
||||
}
|
||||
|
||||
private void handleAck(int ackSeq) {
|
||||
private void handleAck(int ackSeq, String content) {
|
||||
Log.i(TAG, "收到ACK -> " + content);
|
||||
// 从待确认字典中移除
|
||||
pendingMessages.remove(ackSeq);
|
||||
Log.d(TAG, "收到ACK确认 seq=" + ackSeq);
|
||||
}
|
||||
|
||||
private void handleDataMessage(int seq, String content, InetAddress senderAddress, int senderPort) {
|
||||
@@ -212,6 +274,11 @@ public class Main extends Service {
|
||||
} else if ("STOP".equals(message)) {
|
||||
Log.i(TAG, "执行停止指令");
|
||||
callUnity("AppManager", "UnityMethod", "stop");
|
||||
} else if ("GetPackageInfos".equals(message)) {
|
||||
Log.i(TAG, "执行获取所有包信息");
|
||||
// callUnity("AppManager", "UnityMethod", "pause");
|
||||
sendReliable(senderAddress, 8888,
|
||||
"{\"intent\":\"PackageInfos\",\"data\":\"" + packageNames + "\"}");
|
||||
}
|
||||
// 其他指令...
|
||||
}
|
||||
@@ -225,7 +292,7 @@ public class Main extends Service {
|
||||
DatagramPacket packet = new DatagramPacket(
|
||||
ackData, ackData.length, targetAddress, targetPort);
|
||||
udpSocket.send(packet);
|
||||
Log.d(TAG, "发送ACK seq=" + seq);
|
||||
Log.i(TAG, "发送ACK seq=" + seq);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "发送ACK失败: " + e.getMessage());
|
||||
}
|
||||
@@ -253,7 +320,7 @@ public class Main extends Service {
|
||||
DatagramPacket packet = new DatagramPacket(
|
||||
data, data.length, targetAddress, targetPort);
|
||||
udpSocket.send(packet);
|
||||
Log.d(TAG, "发送可靠消息 seq=" + seq + ", 内容=" + message);
|
||||
Log.i(TAG, "发送可靠消息 seq=" + seq + ", 内容=" + formattedMsg);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "发送失败: " + e.getMessage());
|
||||
}
|
||||
@@ -301,7 +368,6 @@ public class Main extends Service {
|
||||
String receivedData = new String(
|
||||
packet.getData(), 0, packet.getLength()).trim();
|
||||
|
||||
Log.i(TAG, "原始UDP数据: " + receivedData);
|
||||
handleReceivedMessage(
|
||||
receivedData,
|
||||
packet.getAddress(),
|
||||
|
||||
Reference in New Issue
Block a user