Android PackageManager
class is used to retrieve information on the application packages that are currently installed on the device. You can get an instance of PackageManager class by calling getPackageManager()
. PackageManager provides methods for querying and manipulating installed packages and related permissions, etc. In this Android example, we we get list of installed apps in Android.
PackageManager packageManager = getPackageManager(); List<ApplicationInfo> list = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
packageManager.getInstalledApplications()
return a List of all application packages that are installed on the device. If we set the flag GET_UNINSTALLED_PACKAGES
has been set, a list of all applications including those deleted with DONT_DELETE_DATA
(partially installed apps with data directory) will be returned.
1. Creating application layout in xml
activity_main.xml
As you can see in the attached screenshot, we will be creating a ListView to show all of the installed applications in android.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
snippet_list_row.xml
This layout is being used by the ListView Adapter for representing application details. It shows application icon, application name and application package.
<?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="wrap_content" > <ImageView android:id="@+id/app_icon" android:layout_width="50dp" android:layout_height="50dp" android:padding="3dp" android:scaleType="centerCrop" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical" android:orientation="vertical" android:paddingLeft="5dp" > <TextView android:id="@+id/app_name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:textStyle="bold" /> <TextView android:id="@+id/app_paackage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" /> </LinearLayout> </LinearLayout>
2. Writing Java class
AllAppsActivity.java
This is the main application class that is used to initialize and list the installed applications. As getting the list of application details from PackageManage is a long running task, we will do that in AsyncTask. Also, this class is using custom Adapter “ApplicationAdapter” for custom ListView.
package com.javatechig.listapps; import java.util.ArrayList; import java.util.List; import android.app.AlertDialog; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.Toast; public class AllAppsActivity extends ListActivity { private PackageManager packageManager = null; private List<ApplicationInfo> applist = null; private ApplicationAdapter listadaptor = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); packageManager = getPackageManager(); new LoadApplications().execute(); } public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { boolean result = true; switch (item.getItemId()) { case R.id.menu_about: { displayAboutDialog(); break; } default: { result = super.onOptionsItemSelected(item); break; } } return result; } private void displayAboutDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.about_title)); builder.setMessage(getString(R.string.about_desc)); builder.setPositiveButton("Know More", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://stacktips.com")); startActivity(browserIntent); dialog.cancel(); } }); builder.setNegativeButton("No Thanks!", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); builder.show(); } @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 (null != intent) { startActivity(intent); } } catch (ActivityNotFoundException e) { Toast.makeText(AllAppsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(AllAppsActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); } } private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) { ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>(); for (ApplicationInfo info : list) { try { if (null != packageManager.getLaunchIntentForPackage(info.packageName)) { 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)); listadaptor = new ApplicationAdapter(AllAppsActivity.this, R.layout.snippet_list_row, applist); return null; } @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(Void result) { setListAdapter(listadaptor); progress.dismiss(); super.onPostExecute(result); } @Override protected void onPreExecute() { progress = ProgressDialog.show(AllAppsActivity.this, null, "Loading application info..."); super.onPreExecute(); } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } } }
ApplicationAdapter.java
package com.javatechig.listapps; 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 ApplicationAdapter extends ArrayAdapter<ApplicationInfo> { private List<ApplicationInfo> appsList = null; private Context context; private PackageManager packageManager; public ApplicationAdapter(Context context, int textViewResourceId, List<ApplicationInfo> appsList) { super(context, textViewResourceId, appsList); this.context = context; this.appsList = appsList; packageManager = context.getPackageManager(); } @Override public int getCount() { return ((null != appsList) ? appsList.size() : 0); } @Override public ApplicationInfo getItem(int position) { return ((null != appsList) ? appsList.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.snippet_list_row, null); } ApplicationInfo applicationInfo = appsList.get(position); if (null != applicationInfo) { TextView appName = (TextView) view.findViewById(R.id.app_name); TextView packageName = (TextView) view.findViewById(R.id.app_paackage); ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); appName.setText(applicationInfo.loadLabel(packageManager)); packageName.setText(applicationInfo.packageName); iconview.setImageDrawable(applicationInfo.loadIcon(packageManager)); } return view; } };
Download Complete Example
Download complete Eclipse project source code from GitHub.
nice
nothing you have to change. Just follow the basic steps to create fragments. most/all codes should be reusable.
I just need to display the applications list. do you know if I need all those code. As I don’t want next screen about the information. Just the app list.
appreciate if you can help me out.
Thank you
You probably want to remove onItemClick() and displayAboutDialog() method.
Please do paste the logcat error. ll help in finding the cause.
thanks a lot it works.
how can we list the apps with specific permission like apps with SMS_SEND permission ? can you suggest some idea..
You can use below code snippet to find out the permissions used for each of the application. And write your own logic to filter if the app contains SMS_SEND permission.
PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName, PackageManager.GET_PERMISSIONS);
String[] requestedPermissions = packageInfo.requestedPermissions;
Will this work if i have to check whether a particular app uses internet data? I actually want the list of apps using internet data(in background) and an option to stop it from consuming data in my app. Thanks 🙂
Sorry. We dont have the example as you looking for.. You have to tweak the example to fit your requirement
It will be helpful if you can specify what is not working.
yeah ok now it working but how to set on off functionality with each app ,means when scrolled on it should be open that app but when it scrolled off i should not open that app
how to add on off functionality with each installed app which is shown in list view
how to add on off functionality with each installed app which is shown in list view
as like below snap thanks in advance because i developing school project so please help me
You can design your custom list row with
Switch
widget.Similar example is here
http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html
i already tried with switch but i did not get clear solution
Perfect. Thanks you.
Hi, is this code open source? Can I used it to create my own application for the Google play store?
Yes. It is purely open source and you are free to use in your own app.
I also do not know….
This is an error. Thanks for pointing it out.
This suppose to be if (null != applicationInfo) {
fixed the same.
What is the variable data?
This is an error. Thanks for pointing it out.
This suppose to be applicationInfo
Hi Panigrahy,
How can we display the apps in Alphabetical Order. and it is stuttering very much while scrolling, I think it is due to loading of app’s icon, is there any way to reduce the stutter?
Thanks in advance. 🙂
You need to cache the app icons yourself. Before that just have a check if the ViewHolder pattern solves this problem.
Thanks for the code, it has served me well, I needed to make an application that can uninstall android applications 🙂
I added the option to sort the list, uninstall, see information, run. And thank you for the code 🙂
Can u give me code about show permissions of each app ? tks so much
hello sir how can i get this list of installed application in tab view
how can i uninstall any app from that list
Hey, thanks a lot. all is well
hello Brother i want to develop an app which monitors when an installed app has started running and stopped then find the duration and store them in database
Hi
How can I get Application Adapter class to loadLable (app Name) string in main class.
hello ,
how can i stop any particular app from getting open
Hi there This has helped allot but i would like to save all the apps with their Logos in a database and then display them is the list view. how can i do that? Thanx in advance.
can i get the list of uninstalled application form my device
How can I get the list of currently running apps in my phone?
How to get AndroidManifest.xml file for all the apps?
All information can be retrieved form ApplicationInfo class
How to display this list inside a spinner
For reference :
http://stackoverflow.com/questions/39332562/how-to-display-package-name-app-name-app-icon-of-installed-apps-in-spinner
Hi bro, iam newbie in android so can u help me..:'(, can we get the name of each apk then compare it with the name in databse?how to to that?please do help me and interesting to know the answer for this question above “how can we list the apps with specific permission like apps with SMS_SEND permission ? can you suggest some idea..” 🙂
Thanks for your Tutorial,
how to add a button to disable / enable app in the list?
How can i stop installed app notifications that i want with code? I wanna stop them in list view
how can i get the list of apps which are not used for long time? and also how to uninstall the apps from the list
Thanks, Bro it’s working like a Magic.
if i want to add hide installed app icons system on this project what i need to do?