0

我用它來從包名稱打開應用如何獲取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 

但是,沒有一個是工作,有的可能讓我的應用程序崩潰。

+0

「'這些軟件包是不可打開的'」什麼是「可打開」軟件包?應用抽屜裏的那個?如果是這樣,請參閱ligi的答案 – pskink

+0

對不起,只要更正單詞 –

回答

2

你可以這樣來做:

final Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 
    final List<ResolveInfo> resolveInfoList = ctx.getPackageManager().queryIntentActivities(mainIntent, 0); 

瞭解更多詳情您可以看看這個發射器的源:即要在發射可見 https://github.com/ligi/FAST

+0

這種方式是工作,但仍然有一些問題,我會更新我的問題基礎上的這個答案。 –

2

活動指定具體的intent-filter

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

您可以在PackageManager中使用它來獲取可啓動活動的列表。

List<ResolveInfo> list = packageManager.queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER), 0); 
相關問題