Как получить список всех установленных приложений на Android

В этом уроке узнаем, как получить список всех установленных приложений на 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.

Вот так работает этот небольшой пример, выводится список всех установленных приложений, отображаются иконка, название приложения, а также имя пакета.

device-2015-11-12-171536

Скачать приложение Hexlock от Liquidum Limited

Приложение Applications Info: ссылка

<<Git – работаем с удаленным репозиторием на GitHub | Инструменты android разработчика

Как создавать android приложения без среды разработки | Инструменты android разработчика>>

Коментарі: 2
Додати коментар