Question

I am studying android launcher at the moment.

I've succeeded in making the launcher with Gridview with sample code from the web.

However, I don't want to show all the apps installed on the phone, just wanna show selected apps.

Is there any way to do that?

package com.example.gridlauncher;

import java.util.List;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;

public class MainActivity extends Activity {

 PackageManager myPackageManager;

 public class MyBaseAdapter extends BaseAdapter {

  private Context myContext;
  private List<ResolveInfo> MyAppList;

  MyBaseAdapter(Context c, List<ResolveInfo> l){
   myContext = c;
   MyAppList = l;
  }

  @Override
  public int getCount() {
   return MyAppList.size();
  }

  @Override
  public Object getItem(int position) {
   return MyAppList.get(position);
  }

  @Override
  public long getItemId(int position) {
   return position;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {

   ImageView imageView;
   if (convertView == null) {
    // if it's not recycled, initialize some attributes
    imageView = new ImageView(myContext);
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setPadding(8, 8, 8, 8); 
   } else {
    imageView = (ImageView)convertView; 
   }

   ResolveInfo resolveInfo = MyAppList.get(position);
   imageView.setImageDrawable(resolveInfo.loadIcon(myPackageManager));

   return imageView;

  }

 }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        myPackageManager = getPackageManager();

        Intent intent = new Intent(Intent.ACTION_MAIN, null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> intentList = getPackageManager().queryIntentActivities(intent, 0);

        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setAdapter(new MyBaseAdapter(this, intentList));

        gridview.setOnItemClickListener(myOnItemClickListener);
    }

    OnItemClickListener myOnItemClickListener =
      new OnItemClickListener(){

    @Override
    public void onItemClick(AdapterView<?> parent, View view,
      int position, long id) {
     ResolveInfo cleckedResolveInfo = 
       (ResolveInfo)parent.getItemAtPosition(position);
     ActivityInfo clickedActivityInfo = 
       cleckedResolveInfo.activityInfo;

     Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.setClassName(
          clickedActivityInfo.applicationInfo.packageName,
          clickedActivityInfo.name);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
          Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        startActivity(intent);

    }

    };

}
Was it helpful?

Solution

Between

List<ResolveInfo> intentList = getPackageManager().queryIntentActivities(intent, 0);

and

gridview.setAdapter(new MyBaseAdapter(this, intentList));

just add a white list filter to remove the unneeded items from intentList.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top