Получаем список приложений пользователя

Здравствуйте. В этом уроке мы научимся получать список приложений, установленных на смартфоне и и выводить их в ListView.

Для начала нам нужно получить объект класса PackageManager вызвав метод getPackageManager() у активити или любых других наследников класса Context. PackageManager — класс для получения различной информации, связанной с пакетами приложений, которые уже установлены на устройстве.

PackageManager pm = context.getPackageManager();

Вызываем метод getInstalledApplications у PackageManager’а и получаем в ответ List с объектами класса ApplicationInfo.

List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

На вход методу мы подаем константу PackageManager.GET_META_DATA, по которой PackageManager определяет, что именно мы хотим получить.

Нам нужно создать разметку для пунктов ListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="10dp"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    android:background="#ffffff"
    android:orientation="horizontal"
    android:padding="10dp" >

    <ImageView
        android:id="@+id/app_item_image"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_gravity="center_vertical"
        android:layout_marginRight="10dp"
        android:adjustViewBounds="true"
        android:scaleType="fitXY" />

    <TextView
        android:id="@+id/app_item_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_vertical"
        android:padding="10dp"
        android:textColor="#000000" />

</LinearLayout>

Создадим кастомный адаптер, унаследовавшись от BaseAdapter:

package ru.javahelp.applicationslist;

import java.util.List;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class AppListAdapter extends BaseAdapter {

	private List<ApplicationInfo> packages;
	private LayoutInflater inflater;
	private PackageManager pm;
	
	public AppListAdapter(Context context, PackageManager pm, List<ApplicationInfo> packages) {
		this.packages = packages;
		this.pm = pm;
		
		inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public int getCount() {

		return packages.size();
	}

	@Override
	public ApplicationInfo getItem(int p1) {

		return packages.get(p1);
	}

	@Override
	public long getItemId(int p1) {

		return p1;
	}

	@Override
	public View getView(int position, View v, ViewGroup parent) {
		
		View view = null;
		ViewHolder viewHolder;

		if (v == null) {
			viewHolder = new ViewHolder();
			view = inflater.inflate(R.layout.app_list_item, parent, false);
			viewHolder.tvAppLabel = (TextView) view
					.findViewById(R.id.app_item_text);
			viewHolder.ivAppIcon = (ImageView) view
					.findViewById(R.id.app_item_image);
			view.setTag(viewHolder);
		} else {
			view = v;
			viewHolder = (ViewHolder) view.getTag();
		}
		
		ApplicationInfo app = packages.get(position);

		viewHolder.tvAppLabel.setText(app.loadLabel(pm).toString());
		viewHolder.ivAppIcon.setImageDrawable(app.loadIcon(pm));

		return view;
	}

	static class ViewHolder {
		private TextView tvAppLabel;
		private ImageView ivAppIcon;
	}

}

Далее передаем полученные данные адаптеру:

AppListAdapter appListAdapter = new AppListAdapter(this, pm, packages);

Выводим все это в ListView:

appList.setAdapter(appListAdapter);

Вот, что у нас получилось:

PVL2qSsIy6Y

 

Дополнительная информация

Я специально не стал усложнять пример и добавлять лишние поля в пункты. Кроме имени и иконки приложений вы также можете узнать версию приложения, расположение установочного APK-файла, разрешения приложения и т. д.

String packageName = packageInfo.packageName;
String apkDir = packageInfo.sourceDir;
	try {
		PackageInfo pInfo = pm.getPackageInfo(packageInfo.packageName, 0);
		String version = pInfo.versionName;
		String[] reqPermission = pInfo.requestedPermissions; // список разрешений приложения (может вернуть null)
	} catch (PackageManager.NameNotFoundException e) {}

 

Исходники примера: ApplicationsList.

Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *