首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 通過 PID 獲取應用包名:遍歷 RunningAppProcessInfo 匹配 pid

     編輯:程式設計綜合問答

根據 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+ 限制頻繁調用。
  • 共享進程(如同一應用多進程、ContentProvider 進程)會返回多個包名。
  • 僅能獲取當前運行進程,已退出的應用無法查詢。

遍歷進程信息匹配 PID,獲取調用者包名不再困難。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved