現在、次のコードを使用しています。
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
ただし、デバイスの製造元と私がインストールしたアプリが返されます。インストールしたアプリのみが返されるように制限する方法は?
現在、次のコードを使用しています。
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
ただし、デバイスの製造元と私がインストールしたアプリが返されます。インストールしたアプリのみが返されるように制限する方法は?
// Flags: See below
int flags = PackageManager.GET_META_DATA |
PackageManager.GET_SHARED_LIBRARY_FILES |
PackageManager.GET_UNINSTALLED_PACKAGES;
PackageManager pm = getPackageManager();
List<ApplicationInfo> applications = pm.getInstalledApplications(flags);
for (ApplicationInfo appInfo : applications) {
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
// System application
} else {
// Installed by user
}
}
フラグ:
ゼリミールの答えは正しいです。ただし、場合によっては、インストールされているすべてのサードパーティ アプリケーションが表示されないことがあります。設定されApplicationInfo
ているフラグもありますFLAG_UPDATED_SYSTEM_APP
このアプリケーションが組み込みシステム アプリケーションのアップデートとしてインストールされている場合
私のスマートフォンには、Amazone Kindle、Adobe Reader、Slacker Radio などのアプリケーションが含まれています。これらのアプリケーションは電話機に付属していませんでした。Google Play ストアからインストールされました。したがって、それらはサードパーティのアプリと見なすことができます。
したがって、FLAG_UPDATED_SYSTEM_APP
フラグを確認することもできます。
final PackageManager packageManager = _context.getPackageManager();
List<ApplicationInfo> installedApplications =
packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
for (ApplicationInfo appInfo : installedApplications)
{
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0)
{
// IS A SYSTEM APP
}
if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)
{
// APP WAS INSTALL AS AN UPDATE TO A BUILD-IN SYSTEM APP
}
}
pkgAppsList.get(0)を実行すると、ResolveInfoオブジェクトが返されます。アイコンやpackageNameなどの情報を取得するにはどうすればよいですか?
これを行うだけです:
ResolveInfo info = pkgAppsList.get(0);
ApplicationInfo appInfo = info.activityInfo.applicationInfo;
PackageManager packageManager = = getPackageManager();
//And then you retrieve all needed data:
Drawable packageIcon = packageManager.getApplicationIcon(applicationInfo); //Icon
String packageName = applicationInfo.packageName; //Package name
String packageLabel = String.valueOf(packageManager.getApplicationLabel(applicationInfo)) //Package label(app name)
ニコライの答えは正しいですが、イテレータを使用して最適化できます。これは私が思いついたものです:
/**
* Return list of installed user applications
*/
static List<ApplicationInfo> getUserInstalledApplications(Context context) {
// Get installed applications
final PackageManager packageManager = context.getPackageManager();
List<ApplicationInfo> installedApplications =
packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
// Remove system apps
Iterator<ApplicationInfo> it = installedApplications.iterator();
while (it.hasNext()) {
ApplicationInfo appInfo = it.next();
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
it.remove();
}
}
// Return installed applications
return installedApplications;
}
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0);
Kotlin でこれを行う方法を知りたい場合は、以下に示しますが、前述のように Ketan sangle が<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission"/>
AndroidManifest.xml ファイルに追加する必要があります。
val packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
for (packageInfo in packages) {
if (packageInfo.flags and ApplicationInfo.FLAG_SYSTEM != 1) {
//enter what you want to do here
}
}
この場合、システム フラグを使用してシステム アプリを除外しました。ここで他のフラグを見つけることができます。