Android: Как узнать имя пакета приложения?
Задача: из названия приложения в appsList[i] узнать имя пакета.
Вы уверены, что в appsList у вас названия приложений? Запустил ради проверки, получил одну длинную строку [ResolveInfo<4056edf8 com.android.mms.ui.ConversationList. ] . Соответственно, заданный вопрос смысла не имеет.
Я считаю, что у вас в корне неверный подход к задаче. Лично я бы создал свой подкласс адаптера с переопределенным getView() и адаптеру передавал бы сразу список (или массив, не суть важно) из ResolveInfo. У объектов ResolveInfo внутри содержится вся необходимая информация.
Вот этот метод возвращает имя пакета вашего приложения
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.13.43306
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
[Android] Как узнать название пакета и activity из apk-приложения
Задача: узнать название пакета Android-приложения в формате apk и запускаемого активити.
Решение:
Можно взять и открыть AndroidManifest.xml, чтобы посмотреть нужные данные, к примеру, через команду cat:
Большая часть содержимого файла AndroidManifest.xml является нечитабельной, т.к. сам файл является двоичным, а то, что поддается чтению, имеет не самый удобный формат для восприятия. Мы видим, что имя пакета имеет название com.mobileshop, но мы не видим название запускаемого активити.
Можно воспользоваться услугами утилиты AAPT (Android Asset Packaging Tool), которая представляет из себя упаковщик для сборки приложения, библиотек и ресурсов в единый apk-файл. Утилита входит в состав Android SDK и располагается в моем случае в директории /Applications/AndroidSDK/build-tools/17.0.0/.
Чтобы узнать название пакета apk-приложения:
./aapt dump badging <path_to_apk> | grep «package»
Чтобы узнать название запускаемого активити apk-приложения:
./aapt dump badging /User/Desktop/HTC_Market_v2.0.apk | grep «launchable-activity»
Русские Блоги
Получить информацию о приложении (пакете) в Android
Стандарты набора персонала Unicorn Enterprise Heavy для Python-инженеров 2019 >>> 
В этом разделе рассказывается, как получить информацию о приложении в системе Android, включая название пакета, метку, значок, занимаемый размер и т. Д. Специально разделены на два
Отдел План такой:
Первая часть: получить название пакета, метку, значок и т. Д. Приложения;
В каждой части для вас приготовлены простые и богатые примеры, вы не пропустите.
Система Android предоставляет нам множество классов управления услугами, включая ActivityManager, PowerManager (управление питанием), AudioManager (управление звуком).
Подождите. Кроме того, он также предоставляет класс управления PackageManger, его основная обязанность — управлять пакетами приложений. Через него мы можем получить информацию о приложении.
Введение: Описание узла файла AnroidManifest.xml:

1. Введение связанных классов
PackageItemInfo класс
Описание : Базовый класс всех узлов в файле AndroidManifest.xml, предоставляющий основную информацию об этих узлах: метку, значок, метаданные. Это не
Используйте его напрямую, но наследуйте от подкласса, а затем вызовите соответствующий метод.
Часто используемые поля :
Получите значение изображения ресурса в файле R (соответствующее атрибуту android: icon)
Public int labelRes Получить значение метки в файле R (соответствующее атрибуту android: label)
Получить значение имени узла (соответствующее атрибуту android: name) public String name
Получить имя пакета прикладной программы public String packagename (Соответствует атрибуту android: packagename)
Общие методы :
Drawable loadIcon (PackageManager pm) Получить изображение текущего приложения
CharSequence loadLabel (PackageManager pm) Получить метку текущего приложения
Класс ActivityInfo наследуется от PackageItemInfo
Описание : Получить информацию об узле <activity /> или <получатель /> в приложении. Мы можем использовать его для получения любых установленных нами свойств, включая
theme 、 launchMode , Режим запуска и т. Д.
Общий метод Унаследован от класса PackageItemInfo LoadIcon () и loadLabel () в
ServiceInfo класс
Описание : Подобно ActivityInfo, а также унаследовано от PackageItemInfo, за исключением того, что представляет информацию об узле <service>.
Класс ApplicationInfo наследуется от PackageItemInfo
Описание : Получить информацию об узле <application> в конкретной справочной программе.
Описание поля :
Поле флагов: FLAG_SYSTEM Системное приложение
FLAG_EXTERNAL_STORAGE Значит приложение установлено на sdcard
Общий метод Унаследован от loadIcon () и loadLabel () в классе PackageItemInfo.
ResolveInfo класс
Описание : В соответствии с узлом <intent> для получения информации о каталоге верхнего уровня, обычно информация об узле <activity>, <receiver>, <service>.
Часто используемые поля :
public ActivityInfo activityInfo Получить объект ActivityInfo, а именно информацию об узле <activity> или <receiver>.
public ServiceInfo serviceInfo Получить объект ServiceInfo, который является информацией об узле <service>
Общий метод :
Drawable loadIcon(PackageManager pm) Получить изображение текущего приложения
CharSequence loadLabel(PackageManager pm) Получите этикетку текущего приложения
Класс PackageInfo
Описание : Вручную получить информацию о файле AndroidManifest.xml.
Часто используемые поля :
public String packageName Имена пакетов
Public ActivityInfo [] activity activity Вся информация об узле <activity>
Есть только одна информация об узле <application> общедоступная ApplicationInfo applicationInfo
public ActivityInfo[] receivers Вся информация об узле <receiver>, несколько
Public ServiceInfo [] services services Вся информация об узлах <service>, несколько
PackageManger класс
Описание : Получить информацию об установленных приложениях. Его можно получить с помощью метода getPackageManager ().
Общий метод :
public abstract PackageManager getPackageManager()
Функция: получить объект PackageManger
public abstrac t Drawable getApplicationIcon( String packageName)
Параметр: packageName имя пакета
Функция: вернуть значок данного имени пакета, в противном случае вернуть null
public abstract ApplicationInfo getApplicationInfo( String packageName, int flags)
Параметр: имя пакета имя пакета
Флаги ApplicationInfo — это флаги этих флагов, обычно константа может быть назначена напрямую. 0 Мочь
Функция: вернуть объект ApplicationInfo
public abstract List < ApplicationInfo > getInstalledApplications(int flags)
Параметры: флаг вообще GET_UNINSTALLED_PACKAGES , Тогда все ApplicationInfo будут возвращены в это время. Мы можем добавить в ApplicationInfo
Флаги фильтруются, чтобы получить то, что нам нужно.
Функция: вернуть все PackageInfo с заданными условиями
public abstract List < PackageInfo > getInstalledPackages(int flags)
Параметры как указано выше
Функция: вернуть все PackageInfo с заданными условиями
public abstract ResolveInfo resolveActivity( Intent intent, int flags)
Параметр: условие поиска по намерению, действие и категория, настроенные Activity
flags: MATCH_DEFAULT_ONLY : Категория должна иметь действие с CATEGORY_DEFAULT для соответствия
GET_INTENT_FILTERS : Соответствие условию намерения
GET_RESOLVED_FILTER : Просто сопоставьте условие Intent
Функция: возврат к заданному состоянию ResolveInfo Объект (по сути, деятельность)
public abstract List < ResolveInfo > queryIntentActivities( Intent intent, int flags)
Параметры такие же, как указано выше
Функция: вернуть все ResolveInfo Объект (по сути, Activity), объект коллекции
public abstract ResolveInfo resolveService( Intent intent, int flags)
Параметры такие же, как указано выше
Функция: возврат к заданным условиям ResolveInfo Объект (по сути Сервис)
public abstract List < ResolveInfo > queryIntentServices( Intent intent, int flags)
Параметры такие же, как указано выше
Функция: вернуть все заданные условия ResolveInfo Объект (по сути Сервис), объект коллекции
2. ДЕМО-объяснение
Я считаю, что из предыдущего введения вы должны это хорошо знать. По сути, эти классы XXXInfo — это просто информация, которую мы определили в файле AndroidManifest.XML.
Зная этот момент, нетрудно понять.
Ниже я воспользуюсь двумя ДЕМО с короткими ответами, чтобы применить то, что я узнал.
Demo 1 : С помощью метода queryIntentActivities () запросить все системы Android с ACTION_MAIN и CATEGORY_LAUNCHER
Приложение Intent может запускать приложение после щелчка по нему, грубо говоря, оно должно сделать простой Launcher, похожий на приложение Home.
Demo 2 : Получите приложения с помощью метода getInstalledApplications (), а затем отфильтруйте их, чтобы найти сторонние приложения, системные приложения и приложения, установленные на SD-карте, которые нам нужны.
Demo1 :
Рисунок:
1. Файлы макета: есть два основных файла: файл browse_app_list.xml со списком; browse_app_item.xml для элемента списка.
- <?xml version= "1.0" encoding= "utf-8" ?>
- <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
- android:orientation= "vertical" android:layout_width= "fill_parent"
- android:layout_height= "fill_parent" >>
- <ListView android:id= "@+id/listviewApp" android:layout_width= "fill_parent"
- android:layout_height= "fill_parent" ></ListView>
- </LinearLayout>
- <?xml version= "1.0" encoding= "utf-8" ?>
- <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
- android:layout_width= "fill_parent" android:layout_height= "50dip" >
- <ImageView android:id= "@+id/imgApp" android:layout_width= "wrap_content"
- android:layout_height= "fill_parent" ></ImageView>
- <RelativeLayout android:layout_width= "fill_parent" android:layout_marginLeft= "10dip"
- android:layout_height= "40dip" >
- <TextView android:id= "@+id/tvLabel" android:layout_width= "wrap_content"
- android:layout_height= "wrap_content" android:text= "AppLable : " ></TextView>
- <TextView android:id= "@+id/tvAppLabel" android:layout_width= "wrap_content"
- android:layout_toRightOf= "@id/tvLabel" android:layout_height= "wrap_content"
- android:layout_marginLeft= "3dip" android:text= "Label" android:textColor= "#FFD700" ></TextView>
- <TextView android:id= "@+id/tvName" android:layout_width= "wrap_content"
- android:layout_height= "wrap_content" android:layout_below= "@id/tvLabel"
- android:text= "Имена пакетов:" ></TextView>
- <TextView android:id= "@+id/tvPkgName" android:layout_width= "wrap_content"
- android:layout_height= "wrap_content" android:layout_below= "@id/tvAppLabel"
- android:layout_alignLeft= "@id/tvAppLabel" android:textColor= "#FFD700" ></TextView>
- </RelativeLayout>
- </LinearLayout>
2. AppInfo.java: класс модели, который сохраняет информацию о приложении.
- / Категория модели, используемая для хранения информации о приложении
- public class AppInfo <
- private String appLabel; // Метка приложения
- private Drawable appIcon ; // Изображение приложения
- private Intent intent ; // Запускаем Intent приложения, обычно Activity, действие которого — Main, а Category — Lancher
- private String pkgName ; // Название пакета, соответствующее приложению
- public AppInfo()<>
- public String getAppLabel() <
- return appLabel;
- >
- public void setAppLabel(String appName) <
- this .appLabel = appName;
- >
- public Drawable getAppIcon() <
- return appIcon;
- >
- public void setAppIcon(Drawable appIcon) <
- this .appIcon = appIcon;
- >
- public Intent getIntent() <
- return intent;
- >
- public void setIntent(Intent intent) <
- this .intent = intent;
- >
- public String getPkgName() <
- return pkgName ;
- >
- public void setPkgName(String pkgName) <
- this .pkgName=pkgName ;
- >
- >
3. BrowseApplicationInfoAdapter.java: настраиваемый класс адаптера для предоставления представлений для ListView.
- // Пользовательский класс адаптера, настраиваемое представление для listView
- public class BrowseApplicationInfoAdapter extends BaseAdapter <
- private List<AppInfo> mlistAppInfo = null ;
- LayoutInflater infater = null ;
- public BrowseApplicationInfoAdapter(Context context, List<AppInfo> apps) <
- infater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- mlistAppInfo = apps ;
- >
- @Override
- public int getCount() <
- // TODO Auto-generated method stub
- System.out.println( "size" + mlistAppInfo.size());
- return mlistAppInfo.size();
- >
- @Override
- public Object getItem( int position) <
- // TODO Auto-generated method stub
- return mlistAppInfo.get(position);
- >
- @Override
- public long getItemId( int position) <
- // TODO Auto-generated method stub
- return 0 ;
- >
- @Override
- public View getView( int position, View convertview, ViewGroup arg2) <
- System.out.println( "getView at " + position);
- View view = null ;
- ViewHolder holder = null ;
- if (convertview == null || convertview.getTag() == null ) <
- view = infater.inflate(R.layout.browse_app_item, null );
- holder = new ViewHolder(view);
- view.setTag(holder);
- >
- else <
- view = convertview ;
- holder = (ViewHolder) convertview.getTag() ;
- >
- AppInfo appInfo = (AppInfo) getItem(position);
- holder.appIcon.setImageDrawable(appInfo.getAppIcon());
- holder.tvAppLabel.setText(appInfo.getAppLabel());
- holder.tvPkgName.setText(appInfo.getPkgName());
- return view;
- >
- class ViewHolder <
- ImageView appIcon;
- TextView tvAppLabel;
- TextView tvPkgName;
- public ViewHolder(View view) <
- this .appIcon = (ImageView) view.findViewById(R.id.imgApp);
- this .tvAppLabel = (TextView) view.findViewById(R.id.tvAppLabel);
- this .tvPkgName = (TextView) view.findViewById(R.id.tvPkgName);
- >
- >
- >
4. Основная логика проекта MainActivity.java
Пожалуйста, внимательно изучите метод queryIntentActivities () и обратите внимание, что сортировка очень важна.
- <span style= "font-size:13px;" > public class MainActivity extends Activity implements OnItemClickListener <
- private ListView listview = null ;
- private List<AppInfo> mlistAppInfo = null ;
- @Override
- public void onCreate(Bundle savedInstanceState) <
- super .onCreate(savedInstanceState);
- setContentView(R.layout.browse_app_list);
- listview = (ListView) findViewById(R.id.listviewApp);
- mlistAppInfo = new ArrayList<AppInfo>();
- queryAppInfo(); // Запрашиваем всю информацию о приложении
- BrowseApplicationInfoAdapter browseAppAdapter = new BrowseApplicationInfoAdapter(
- this , mlistAppInfo);
- listview.setAdapter(browseAppAdapter);
- listview.setOnItemClickListener( this );
- >
- // Щелкните, чтобы перейти к приложению
- public void onItemClick(AdapterView<?> arg0, View view, int position,
- long arg3) <
- // TODO Auto-generated method stub
- Intent intent = mlistAppInfo.get(position).getIntent();
- startActivity(intent);
- >
- // Получаем всю информацию о запуске Activity, аналогично интерфейсу Launch
- public void queryAppInfo() <
- PackageManager pm = this .getPackageManager(); // Получить объект PackageManager
- Intent mainIntent = new Intent(Intent.ACTION_MAIN, null );
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- // Получение всех объектов ResolveInfo путем запроса.
- List<ResolveInfo> resolveInfos = pm
- .queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY);
- // Вызов системной сортировки, сортировки по имени
- // Эта сортировка очень важна, иначе она может отображать только системные приложения, а не сторонние приложения
- Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(pm));
- if (mlistAppInfo != null ) <
- mlistAppInfo.clear();
- for (ResolveInfo reInfo : resolveInfos) <
- String activityName = reInfo.activityInfo.name; // Получаем имя стартовой активности приложения
- String pkgName = reInfo.activityInfo.packageName; // Получаем имя пакета приложения
- String appLabel = (String) reInfo.loadLabel(pm); // Получаем метку приложения
- Drawable icon = reInfo.loadIcon(pm); // Получаем иконку приложения
- // Подготавливаем намерение для действия запуска приложения
- Intent launchIntent = new Intent();
- launchIntent.setComponent( new ComponentName(pkgName,
- activityName));
- // Создаем объект AppInfo и назначаем его
- AppInfo appInfo = new AppInfo();
- appInfo.setAppLabel(appLabel);
- appInfo.setPkgName(pkgName);
- appInfo.setAppIcon(icon);
- appInfo.setIntent(launchIntent);
- mlistAppInfo.add(appInfo); // Добавляем в список
- System.out.println(appLabel + " activityName—" + activityName
- + " pkgName—" + pkgName);
- >
- >
- >
- ></span>
Хорошо, первая демонстрация завершена. . Чтобы
Demo 2:
Demo2 совпадает с Demo1 в макете и адаптере. Просто использовал getInstalledApplications(), а затем выбирается ApplicationInfo.flags
Нужный нам объект ApplicationInfo.

Применяются следующие фильтрующие приложения:
- package com.qiner.appinfo;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import com.qiner.appinfo.R;
- import android.app.Activity;
- import android.app.Application;
- import android.content.pm.ApplicationInfo;
- import android.content.pm.PackageManager;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ListView;
- public class MainActivity extends Activity <
- public static final int FILTER_ALL_APP = 0 ; // Все приложения
- public static final int FILTER_SYSTEM_APP = 1 ; // Системная программа
- public static final int FILTER_THIRD_APP = 2 ; // Сторонние приложения
- public static final int FILTER_SDCARD_APP = 3 ; // Приложение установлено на SDCard
- private ListView listview = null ;
- private PackageManager pm;
- private int filter = FILTER_ALL_APP;
- private List<AppInfo> mlistAppInfo ;
- private BrowseApplicationInfoAdapter browseAppAdapter = null ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) <
- super .onCreate(savedInstanceState);
- setContentView(R.layout.browse_app_list);
- listview = (ListView) findViewById(R.id.listviewApp);
- if (getIntent()!= null ) <
- filter = getIntent().getIntExtra( "filter" , 0 ) ;
- >
- mlistAppInfo = queryFilterAppInfo(filter); // Запрашиваем всю информацию о приложении
- // Собираем адаптер и регистрируемся в listView
- browseAppAdapter = new BrowseApplicationInfoAdapter( this , mlistAppInfo);
- listview.setAdapter(browseAppAdapter);
- >
- // Запрашиваем конкретную ApplicationInfo на основе условий запроса
- private List<AppInfo> queryFilterAppInfo( int filter) <
- pm = this .getPackageManager();
- // Запрос всех установленных приложений
- List<ApplicationInfo> listAppcations = pm
- .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
- Collections.sort(listAppcations,
- new ApplicationInfo.DisplayNameComparator(pm)); // Сортировать
- List<AppInfo> appInfos = new ArrayList<AppInfo>(); // Сохраняем AppInfo, найденную путем фильтрации
- // Фильтр по условиям
- switch (filter) <
- case FILTER_ALL_APP: // Все приложения
- appInfos.clear();
- for (ApplicationInfo app : listAppcations) <
- appInfos.add(getAppInfo(app));
- >
- return appInfos;
- case FILTER_SYSTEM_APP: // Системная программа
- appInfos.clear();
- for (ApplicationInfo app : listAppcations) <
- if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0 ) <
- appInfos.add(getAppInfo(app));
- >
- >
- return appInfos;
- case FILTER_THIRD_APP: // Сторонние приложения
- appInfos.clear();
- for (ApplicationInfo app : listAppcations) <
- // Несистемная программа
- if ((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0 ) <
- appInfos.add(getAppInfo(app));
- >
- // Изначально системная программа, после ручного обновления пользователем системная программа стала сторонним приложением
- else if ((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 ) <
- appInfos.add(getAppInfo(app));
- >
- >
- break ;
- case FILTER_SDCARD_APP: // Приложение установлено на SDCard
- appInfos.clear();
- for (ApplicationInfo app : listAppcations) <
- if ((app.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ) <
- appInfos.add(getAppInfo(app));
- >
- >
- return appInfos;
- default :
- return null ;
- >
- return appInfos;
- >
- // Создаем объект AppInfo и назначаем его
- private AppInfo getAppInfo(ApplicationInfo app) <
- AppInfo appInfo = new AppInfo();
- appInfo.setAppLabel((String) app.loadLabel(pm));
- appInfo.setAppIcon(app.loadIcon(pm));
- appInfo.setPkgName(app.packageName);
- return appInfo;
- >
- >
На этой основе вы можете создавать более многофункциональные приложения. Больше, чем разговоры об удалении и установке приложений в модуле настроек.
Получение списка приложений в Android

Android SDK предоставляет много средств для работы с системой. В том числе он позволяет получать список приложений, которые установлены на устройстве. Это может быть полезно, когда нужно получить сведения о сторонних приложениях (размер APK, путь до приложения, имя пакета и т.д.). Например, в наших приложениях получение списка, содержащего сторонние приложения, играет большую роль: в GreenBro с помощью этого списка выводятся сведения о приложениях, а также выполняются различные действия.

В Менеджере системных приложений и APK Extractor же список приложений необходим, чтобы удалять приложения и извлекать APK из приложений соответственно.
В этой статье мы рассмотрим, как можно получать список приложений, установленных на устройстве, а также как происходит установка приложений на устройство.
Класс PackageManager
PackageManager предоставляет API, который фактически управляет установкой, удалением и обновлением приложений. Когда мы устанавливаем файл APK, PackageManager анализирует этот APK и выводит результат.
Получить экземпляр класса PackageManager можно с помощью метода getPackageManager(). PackageManager предоставляет методы для запросов к установленным пакетам и соответствующим разрешениям.
Где хранятся файлы APK на Android?
В зависимости от типа данных, на Androiid файлы могут храниться в следующих местах:
- Предустановленные и системные приложения (Камера, Браузер и т.д.) хранятся в /system/app/
- Установленные пользователем приложения хранятся в /data/app/
- PackageManager создаёт каталог /data/data/<имя пакета>/ для хранения базы данных, файлов с предпочтениями, нативных библиотек и кеша.
Как PackageManager хранит информацию о приложении?
Менеджер пакетов хранит информацию о приложении в трёх файлах, расположенных в /data/system.
packages.xml
Этот XML-файл содержит список разрешений и пакеты\приложения. Он хранит две вещи: разрешения и пакет. Например:
Разрешения хранятся в теге <permissions>. Каждое разрешение имеет три атрибута: name, package и protection. Атрибут name это имя разрешения, которое мы используем в AndroidManifest.xml. Атрибут package указывает на пакет, которому принадлежит разрешение, в большинстве случаев это «android». Атрибут protection указывает на уровень безопасности.
Тег <package> содержит 10 атрибутов и несколько подтегов.
| Атрибут | Описание |
| name | Имя пакета |
| codePath | Путь установки APK |
| nativeLibraryPath | Нативная библиотека, расположенная по умолчанию в /data/data/<имя пакета>/lib |
| flag | Хранит флаги ApplicationInfo |
| ft | Время в шестнадцатtричном формате |
| lt | Время установки в шестнадцатеричном формате |
| ut | Время последнего обновления в шестнадцатеричном формате |
| version | Код версии из AndroidManifest.xml |
| sharedUserId | Идентификатор пользователя Linux, который будет использоваться совместно с другими приложениями. |
| userId | Идентификатор пользователя Linux |
Подтеги же здесь следующие:
- <sigs> представляет собой информацию о сигнатуре, атрибут count — количество тегов <cert>.
- <cert> это ключ сертификата, атрибут index представляет собой глобальный индекс сертификата.
- <perms> содержат разрешения, которые разработчик установил в AndroidManifest.xml
packages.list
Это простой текстовый файл, содержащий имя пакета, идентификатор пользователя, флаги и каталог data.
package-stopped.xml
Этот файл содержит список пакетов, которые были остановлены. Остановленные приложения не могут принимать широковещательные сообщения.
Получаем список приложений
Рассмотрим получение списка установленных приложений на примере GreenBro.
При запуске приложения запускается AsyncTask, внутри которого получаем экземпляр PackageManager и затем копируем в список List<ApplicationInfo> все данные об установленных приложениях.
Метод getInstalledApplications() принимает в качестве параметра флаг GET_META_DATA, который определяет, что нам нужные метаданные каждого пакета.
Результатом является список объектов ApplicationInfo для каждого установленного приложения. Класс ApplicationInfo предоставляет подробную информацию о пакете, собранную из тега <application> в AndroidManifest.xml, нам оттуда нужны лишь самые важные данные.
Поэтому в цикле проверяем каждый объект из полученного списка и записывать данные в собственный класс AppInfo, чтобы затем использовать в основном потоке.
Здесь с помощью метода getPackageInfo() класса PackageManager мы получаем общую информацию о приложении по заданному имени пакета. После эта информация объединяется с информацией, полученной от getInstalledApplications() и сохраняется в объекте AppInfo со следующими полями:
- title — название приложения
- packageName — имя пакета
- sourceDir — полный путь до APK приложения
- publicSourceDir — путь до общедоступных частей sourceDir
- versionName — имя версии
- isSystem — определяет, является ли приложение системным
- size — размер приложения (в удобной форме)
- longSize — размер приложения в long
- dataDir — полный путь к каталогу data
- nativeLibraryDir — путь до нативных библиотек
- modified — дата последнего изменения
- firstInstallTime — дата установки
- lastUpdateTime — дата последнего обновления
- enabled — определяет, включено ли приложение
Чтобы узнать название приложения, можно также воспользоваться PackageManager, как показано ниже.
Проверка же на то, является ли приложение системным, тоже достаточно проста и показана ниже.
В конце работы AsyncTask возвращает результат обратно в основной поток. Вот и всё, мы загрузили себе список всех установленных на устройстве приложений и можем продолжить с ним работу.
Получение списка приложений в Android : 4 комментария
Подскажите пожалуйста, в конструкции:
final PackageManager pm = context.getPackageManager();
List apps = new ArrayList();
List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
Чем является «context»?
Это локальная переменная, Вы можете передавать контекст из активити или фрагмента
» List packages = pm.getInstalledApplications( »
а есть ли функция наподобие getRunnedApplications(), которая выдает список запущенных последних приложений?
как отличить приложение от сервиса? Проверка на системное приложение не помогает