根據 Binder.getCallingPid() 獲取調用者 PID,需遍歷系統進程列表匹配得到包名。注意:一個 PID 可能對應多個包名(共享進程)。
private String getPackageNameByPid(Context context, int pid) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List infos = am.getRunningAppProcesses();
if (infos == null) return null;
for (ActivityManager.RunningAppProcessInfo info : infos) {
if (info.pid == pid) {
return info.processName; // 通常即包名,或包名:進程名
}
}
return null;
}
List getPackageNamesByPid(Context context, int pid) {
List packages = new ArrayList<>();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo info : am.getRunningAppProcesses()) {
if (info.pid == pid) {
// info.pkgList 包含該進程運行的所有包名 (API 21+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Collections.addAll(packages, info.pkgList);
} else {
packages.add(info.processName); // 兼容舊版
}
}
}
return packages;
}
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- 或 android.permission.PACKAGE_USAGE_STATS (API 21+) -->
getRunningAppProcesses 需權限,且 Android 8.0+ 限制頻繁調用。遍歷進程信息匹配 PID,獲取調用者包名不再困難。