В этом уроке узнаем, как получить список всех установленных приложений на Android. Но начать я его хочу с небольшого обзора полезного приложения — оно называется Hexlock, и позволяет блокировать доступ к выбранным приложениям на вашем устройстве, с помощью пароля или графического ключа. Я уже слышу ваши неодобрительные возгласы, но не спешите уходить — по ходу обзора расскажу вам одну историю, с этим приложением связанную.
Исходный код примера из урока — под видео:
Итак, получение списка всех android приложений, установленных на устройстве полезен, когда вы разрабатываете приложение для обмена apk файлов с другими устройствами, или когда вы разрабатываете приложение app локер, наподобие того, который я показал вам в начале урока.
Взгляните на код простого приложения, которое позволяет это делать. Макет главного сласса содержит список ListView, второй макет содержит разметку элемента списка. Он используется адаптером для представления сведения о приложении. Он показывает значок приложения, название приложения и пакет приложения.
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
list_item.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/app_icon" android:layout_width="50dp" android:layout_height="50dp" android:padding="3dp" android:scaleType="centerCrop" android:contentDescription="@null" tools:src="@drawable/ic_launcher"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center|center_vertical" android:orientation="vertical" android:paddingLeft="5dp"> <TextView android:id="@+id/app_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:textStyle="bold" tools:text="Application Name"/> <TextView android:id="@+id/app_package" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" tools:text="app.package.name"/> </LinearLayout> </LinearLayout>
Класс MainActivity наследуется от ListActivity. Это главный класс, который используется для инициализации списка установленных приложений.
MainActivity.java:
package com.example.listofapps;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends ListActivity {
private PackageManager packageManager = null;
private List applist = null;
private AppAdapter listadapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
packageManager = getPackageManager();
new LoadApplications().execute();
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
ApplicationInfo app = applist.get(position);
try{
Intent intent = packageManager.getLaunchIntentForPackage(app.packageName);
if(intent != null) {
startActivity(intent);
}
} catch(ActivityNotFoundException e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
} catch(Exception e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
private List checkForLaunchIntent(List list) {
ArrayList appList = new ArrayList();
for(ApplicationInfo info : list) {
try{
if(packageManager.getLaunchIntentForPackage(info.packageName) != null) {
appList.add(info);
}
} catch(Exception e) {
e.printStackTrace();
}
}
return appList;
}
private class LoadApplications extends AsyncTask<Void, Void, Void> {
private ProgressDialog progress = null;
@Override
protected Void doInBackground(Void... params) {
applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
listadapter = new AppAdapter(MainActivity.this, R.layout.list_item, applist);
return null;
}
@Override
protected void onPostExecute(Void result) {
setListAdapter(listadapter);
progress.dismiss();
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
progress = ProgressDialog.show(MainActivity.this, null, "Loading apps info...");
super.onPreExecute();
}
}
}
Класс PackageManager используется для получения информации о пакетах приложений, которые в настоящее время установлены на устройстве. Получить экземпляр класса PackageManager можно методом getPackageManager(). PackageManager предоставляет методы для выполнения запросов об установленных пакетах и связанных разрешениях, и т.д. В этом примере мы получаем список установленных приложений в Android.
Так как получение списка приложений от PackageManager является продолжительной задачей, это делается в AsyncTask.
Метод packageManager.getInstalledApplications() возвращает список всех пакетов приложений, которые установлены на устройстве. Флаг GET_META_DATA позволяет извлекать любые мета данные, связанные с разрешениями. Если мы установим флаг GET_UNINSTALLED_PACKAGES, будет возвращен список всех приложений, включая те, которые удалены с признаком DONT_DELETE_DATA , то есть частично удалены, и после них остались папки данных.
Кроме того этот класс использует listadapter — объект пользовательского класса AppAdapter для ListView. Он унаследуется от ArrayAdapter.
AppAdapter.java:
package com.example.listofapps;
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.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class AppAdapter extends ArrayAdapter{
private List appList = null;
private Context context;
private PackageManager packageManager;
public AppAdapter(Context context, int resource,
List objects) {
super(context, resource, objects);
this.context = context;
this.appList = objects;
packageManager = context.getPackageManager();
}
@Override
public int getCount() {
return ((null != appList) ? appList.size() : 0);
}
@Override
public ApplicationInfo getItem(int position) {
return ((null != appList) ? appList.get(position) : null);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(null == view) {
LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.list_item, null);
}
ApplicationInfo data = appList.get(position);
if(null != data) {
TextView appName = (TextView) view.findViewById(R.id.app_name);
TextView packageName = (TextView) view.findViewById(R.id.app_package);
ImageView iconView = (ImageView) view.findViewById(R.id.app_icon);
appName.setText(data.loadLabel(packageManager));
packageName.setText(data.packageName);
iconView.setImageDrawable(data.loadIcon(packageManager));
}
return view;
}
}
Здесь мы объявляем список, контекст и packageManager.
В методе getView строим элемент списка. Получаем LayoutInflater методом контекста getSystemService(Class) для наполнения макета.
Затем в главном классе в методе onPostExecute выводим список. Метод setListAdapter предоставляет курсор для представления списка. На вход ему идет listadapter.
Вот так работает этот небольшой пример, выводится список всех установленных приложений, отображаются иконка, название приложения, а также имя пакета.
Скачать приложение Hexlock от Liquidum Limited
Приложение Applications Info: ссылка
<<Git – работаем с удаленным репозиторием на GitHub | Инструменты android разработчика
Как создавать android приложения без среды разработки | Инструменты android разработчика>>