如何用QPython获取Android所有已安装应用包名并实现全应用启动?
在QPython中获取Android所有已安装应用包名并启动应用
我之前也碰到过这个问题——用getLaunchableApplications()确实只能抓取到那些有桌面快捷方式的应用,要获取所有已安装应用的包名,得直接调用Android的PackageManager API才行。下面是具体的实现步骤和代码:
1. 获取所有已安装应用的包名(含应用名称)
QPython的androidhelper模块已经封装了Android系统的API,我们可以直接用它来获取PackageManager,进而拿到所有已安装应用的信息:
from androidhelper import Android # 初始化Android对象 droid = Android() # 获取PackageManager实例 pm = droid.getPackageManager() # 获取所有已安装应用的PackageInfo列表(参数0表示获取完整包信息) package_list = pm.getInstalledPackages(0).result # 遍历并输出应用名称和包名 print("所有已安装应用:") for pkg_info in package_list: # 获取应用显示名称 app_name = pm.getApplicationLabel(pkg_info.applicationInfo).result # 获取应用包名 package_name = pkg_info.packageName print(f"应用名称: {app_name} | 包名: {package_name}")
这段代码会输出设备上所有已安装的应用,包括系统应用和用户自行安装的应用,完美解决了getLaunchableApplications()只能拿到部分应用的问题。
2. 通过包名启动任意应用
要启动应用,我们可以用PackageManager的getLaunchIntentForPackage()方法获取对应包名的启动Intent,再通过startActivityIntent()启动。这个方法能处理绝大多数有可启动界面的应用,包括系统应用:
def launch_app(package_name): try: # 获取应用的启动Intent launch_intent = pm.getLaunchIntentForPackage(package_name).result if launch_intent: # 启动应用 droid.startActivityIntent(launch_intent) print(f"✅ 成功启动应用:{package_name}") else: print(f"❌ 应用 {package_name} 没有可直接启动的界面(可能是后台服务类应用)") except Exception as e: print(f"❌ 启动失败:{str(e)}") # 调用示例:启动微信 launch_app("com.tencent.mm")
注意事项:
- 有些系统应用(比如某些系统服务)没有可交互的启动界面,这时候
getLaunchIntentForPackage()会返回None,启动会失败,属于正常情况。 - 如果需要更灵活的启动方式(比如启动应用内的某个特定Activity),可以手动构造Intent,指定Action和ComponentName,但需要知道目标Activity的完整类名。
完整整合脚本
下面是一个把“获取应用列表”和“启动应用”整合在一起的完整脚本,方便你直接使用:
from androidhelper import Android droid = Android() pm = droid.getPackageManager() def get_all_installed_apps(): """获取所有已安装应用的名称和包名""" package_list = pm.getInstalledPackages(0).result apps = [] for pkg_info in package_list: app_name = pm.getApplicationLabel(pkg_info.applicationInfo).result package_name = pkg_info.packageName apps.append({"name": app_name, "package": package_name}) return apps def launch_app(package_name): """通过包名启动应用""" try: launch_intent = pm.getLaunchIntentForPackage(package_name).result if launch_intent: droid.startActivityIntent(launch_intent) return True, f"已启动应用:{package_name}" else: return False, f"该应用没有可启动的界面" except Exception as e: return False, f"启动失败:{str(e)}" # 打印所有应用列表 all_apps = get_all_installed_apps() for idx, app in enumerate(all_apps, 1): print(f"{idx}. {app['name']} - {app['package']}") # 让用户输入包名启动应用 target_package = input("\n请输入要启动的应用包名:") success, message = launch_app(target_package) print(message)
内容的提问来源于stack exchange,提问作者JuniorObom
相关产品推荐
相关产品推荐

