最近在寫語音交互程序,在語音打開應用這塊碰到如何用代碼控制應用啟動的問題。百度了一下,有兩種方案:1、獲取應用的包名;2、獲取應用的包名、入口類名。
之前對兩種方案都進行了嘗試,發現方案二中存在一個弊端,那就是系統級應用只能獲取到包名,不能獲取到入口類名,這會導致程序報錯,當然你也可以不獲取系統級應用的包名和入口類名。出於簡單方便的考慮,選擇了方案一,廢話不多說,上代碼。
方案一、
1、獲取程序包名:
復制代碼
1 // 獲取PackageManager對象
2 PackageManager packageManager = getPackageManager();
3 // 得到系統安裝的所有程序的PackageInfo對象
4 List<PackageInfo> packages = packageManager.getInstalledPackages(0);
5 // 創建String類型的數組,用來存放獲取的包名
6 ArrayList<String> packageList = new ArrayList<String>();
7
8 for (int i = 0; i < packages.size(); i++) {
9 PackageInfo packageInfo = packages.get(i);
10
11 // 判斷是否是系統級應用
12 if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
13 packageList.add(packageInfo.packageName);
14 }
15 }
復制代碼
2、根據獲取的包名啟動應用:
復制代碼
1 // 獲取PackageManager對象
2 PackageManager packageManager = getPackageManager();
3 // 獲取索引為i的包名
4 String packageName = packageList.get(i);
5 // 如果該程序不可啟動(像系統自帶的包,有很多是沒有入口的)會返回NULL
6 Intent intent = packageManager.getLaunchIntentForPackage(packageName);
7
8 if (intent != null) {
9 startActivity(intent);
10 }
復制代碼
方案二、還沒仔細研究過,不過對那些主入口設置<intent-filter>的應用,方案二應該會優於方案一,明天找個時間把這個補上