2016-04-27 4 views
0

Это моя проблема: я могу получить список установленных приложений на своем устройстве, но мне нужно иметь список только с определенными приложениями в списке. Я имею в виду, например, я бы показывал в списке только мои приложения. Как я могу это сделать? Могу ли я просто посмотреть имя пакета? Есть ли другой способ отфильтровать этот список, чтобы показать приложения, которые я хочу? Это код, я использую:Список установленных приложений по пакету

Адаптер:

public class LocalAppListAdapter extends ArrayAdapter<ApplicationInfo> { 
    private List<ApplicationInfo> appsList = null; 
    private Context context; 
    private PackageManager packageManager; 

    public LocalAppListAdapter(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.local_app_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; 
    } 
}; 

А класс я использую, чтобы получить список:

public class LocalAppList extends AppCompatActivity { 
    private PackageManager packageManager = null; 
    private List<ApplicationInfo> applist = null; 
    private LocalAppListAdapter listadaptor = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.local_app_list); 

     packageManager = getPackageManager(); 

     new LoadApplications().execute(); 
    } 



    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 LocalAppListAdapter(LocalAppList.this, R.layout.local_app_list, applist); 

      return null; 
     } 

     @Override 
     protected void onCancelled() { 
      super.onCancelled(); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      ListView list = (ListView) findViewById(R.id.localAppList); 
      list.setAdapter(listadaptor); 
      progress.dismiss(); 
      super.onPostExecute(result); 
     } 

     @Override 
     protected void onPreExecute() { 
      progress = ProgressDialog.show(LocalAppList.this, null, "Loading application info..."); 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
     } 
    } 
} 

Так что это на самом деле полный список со всеми приложениями .. Мне нужно найти способ фильтрации списка, показывающего, например, только приложения Google или которые я хочу показать.

+1

Внесите свой фильтр в 'checkForLaunchIntent()', добавив только элементы в список результатов, если они соответствуют вашим критериям. – CommonsWare

+0

На самом деле это была одна из моих идей, но я не мог найти выход. У вас есть идея? Можете ли вы показать мне, какие реализации мне нужно делать? –

+0

Нет, потому что я не знаю, что означает «например, только приложения Google или которые я хочу показать». В общем, используйте «ApplicationInfo» и «PackageManager», чтобы определить, принадлежит ли это приложение в списке. – CommonsWare

ответ

0

Этот метод можно использовать для отображения списка установленного приложения, в котором он фильтрует все приложения уровня системы, то есть приложение, которое невозможно запустить.

/** 
* This method is used to fetch all the application installed in device. 
* @param Context 
* @return List<ApplicationInfo> 
*/ 
public static List<ApplicationInfo> getInstalledApplication(Context c) 
{ 
    List<ApplicationInfo> installedApps = c.getPackageManager().getInstalledApplications(PackageManager.PERMISSION_GRANTED); 
    List<ApplicationInfo> launchableInstalledApps = new ArrayList<ApplicationInfo>(); 
    for(int i =0; i<installedApps.size(); i++) 
    { 
     if(c.getPackageManager().getLaunchIntentForPackage(installedApps.get(i).packageName) != null) 
     { 
      //If you're here, then this is a launch-able app 
      launchableInstalledApps.add(installedApps.get(i)); 
     } 
    } 
    return launchableInstalledApps; 
} 

Надеюсь, это поможет.