我用它來從包名稱打開應用如何獲取App Drawer中的所有應用程序?
startActivity(getPackageManager().getLaunchIntentForPackage("packagename"));
android的許多應用程序無法打開,因爲它們是系統包,而不是應用程序。這些軟件包不可打開
例如
V/sys﹕ 0000000100010000011111001000101 : com.android.keychain : true : Key Chain
V/sys﹕ 0000000000000000000000000000001 : com.android.keychain : true : Key Chain
^
^
^
Log.v("sys", String.format("%31s", Integer.toBinaryString(pkgInfo.applicationInfo.flags)).replace(' ', '0') +" : "+ pkgInfo.packageName+" : "+(((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true:false)+" : "+pkgInfo.applicationInfo.loadLabel(pm).toString());
Log.v("sys", String.format("%31s", Integer.toBinaryString(ApplicationInfo.FLAG_SYSTEM)).replace(' ', '0') +" : "+ pkgInfo.packageName+" : "+(((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true:false)+" : "+pkgInfo.applicationInfo.loadLabel(pm).toString());
我用這個方法來過濾掉所有systempackage
private boolean isSystemPackage(PackageInfo pkgInfo)
{
Log.v("sys", String.format("%31s", Integer.toBinaryString(pkgInfo.applicationInfo.flags)).replace(' ', '0') +" : "+ pkgInfo.packageName+" : "+(((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true:false)+" : "+pkgInfo.applicationInfo.loadLabel(pm).toString());
Log.v("sys", String.format("%31s", Integer.toBinaryString(ApplicationInfo.FLAG_SYSTEM)).replace(' ', '0') +" : "+ pkgInfo.packageName+" : "+(((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true:false)+" : "+pkgInfo.applicationInfo.loadLabel(pm).toString());
return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true:false;
}
但這種方法不能幫我確定包是不是系統應用。
例如
這是WhatsApp的在LG G Pro主板2
V/sys﹕ 0000000110010000011111001000100 : com.whatsapp : false : WhatsApp
V/sys﹕ 0000000000000000000000000000001 : com.whatsapp : false : WhatsApp
這是注4
V/sys﹕ 0000000110010000011111011000101 : com.whatsapp : true : WhatsApp
V/sys﹕ 0000000000000000000000000000001 : com.whatsapp : true : WhatsApp
這是一個特殊的情況下,我不明白爲什麼在的WhatsApp一些設備是系統包
另一個示例
V/sys﹕ 0000000110110001011111011000101 : com.google.android.apps.plus : true : Google+
V/sys﹕ 0000000000000000000000000000001 : com.google.android.apps.plus : true : Google+
我知道google +是默認安裝的,所以它是一個系統包,但它在App Drawer中。
所以我覺得FLAG_SYSTEM是不適合拿到Android的
所有的應用程序如何獲得在應用程序的抽屜,所有的應用程序?
更新:
現在我用這種方式來獲取所有的應用程序
final Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent, 0);
PackageManager pm = getPackageManager();
for(ResolveInfo ri : resolveInfoList)
{
String appName=ri.activityInfo.loadLabel(pm).toString();
Drawable icon=ri.loadIcon(pm);
Log.v("sys",ri.activityInfo.packageName +":" + appName);
}
但有些信息仍然是不正確
使用的方式,我可以得到正確的應用程序名稱,正確的圖標可繪製,幾乎所有正確的包名稱。
包名仍然有一些錯誤。
例如,這是上述程序的一些輸出
V/sys﹕ com.android.contacts:Contacts
V/sys﹕ com.android.contacts:Phone <<<<wrong
V/sys﹕ com.google.android.apps.plus:Photos <<<<wrong
V/sys﹕ com.google.android.apps.plus:Google+
你可以看到包名是錯誤的,所以我的應用程序會打開錯誤的應用(但可繪製圖標是正確的)
我看了FAST啓動器的源代碼,org.ligi.fast.model.AppInfo
。我們獲取包名的方式是一樣的。
如何以這種方式獲得正確的包名?
我也試過
ri.resolvePackageName
ri.activityInfo.parentActivityName
ri.activityInfo.processName
但是,沒有一個是工作,有的可能讓我的應用程序崩潰。
「'這些軟件包是不可打開的'」什麼是「可打開」軟件包?應用抽屜裏的那個?如果是這樣,請參閱ligi的答案 – pskink
對不起,只要更正單詞 –