安卓Launcher之获取手机安装的应用列表,安卓launcher

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓Launcher之获取手机安装的应用列表,安卓launcher相关的知识,希望对你有一定的参考价值。

Launcher中最主要的就是获取所有应用列表的入口以及图标,一般获取的方法有两种:

PackageInfo

ResolveInfo

运行获取所有APP的Launcher并且允许进行点击事件,进入到应用

技术分享

下面通过这两种方法获取到所有应用的列表:

建立基本数据:

PakageMod.java

public class PakageMod {

    public String pakageName;
    public String appName;
    public Drawable icon;

    public PakageMod() {
        super();
    }
    
    public PakageMod(String pakageName, String appName, Drawable icon) {
        super();
        this.pakageName = pakageName;
        this.appName = appName;
        this.icon = icon;
    }
}

建立适配器:

public class DemoGridAdapter extends BaseAdapter {

    private LayoutInflater inflater;
    private List<PakageMod> datas;

    public DemoGridAdapter(Context context, List<PakageMod> datas) {
        super();
        inflater = LayoutInflater.from(context);
        this.datas = datas;
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            // 使用View的对象itemView与R.layout.item关联
            convertView = inflater.inflate(R.layout.apps, null);
            holder = new ViewHolder();
            holder.icon = (ImageView) convertView.findViewById(R.id.apps_image);
            holder.label = (TextView) convertView
                    .findViewById(R.id.apps_textview);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.icon.setImageDrawable(datas.get(position).icon);
        holder.label.setText(datas.get(position).appName);

        return convertView;

    }

    class ViewHolder {
        private ImageView icon;
        private TextView label;
    }
}

建立适配器的视图:

<?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="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/apps_image"
        android:layout_width="48dip"
        android:layout_height="48dip"
        android:icon="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/apps_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxEms="5"
        android:maxLines="1"
        android:text="good" />

</LinearLayout>

下面在Activity中获取到列表并显示到GridView中,并点击进入应用;

使用PackageInfo

public class PackageInfoDemo extends Activity {

    private GridView gridview;
    private PackageManager pManager;
    private List<PakageMod> datas;
    private String tag = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_main);
        // 取得gridview
        gridview = (GridView) findViewById(R.id.gridview);
        // 获取图片、应用名、包名
        pManager = PackageInfoDemo.this.getPackageManager();
        List<PackageInfo> appList = getAllApps(PackageInfoDemo.this);
        datas = new ArrayList<PakageMod>();
        for (int i = 0; i < appList.size(); i++) {
            PackageInfo pinfo = appList.get(i);
            PakageMod shareItem = new PakageMod();
            // 设置图片
            shareItem.icon = pManager.getApplicationIcon(pinfo.applicationInfo);
            // 设置应用程序名字
            shareItem.appName = pManager.getApplicationLabel(
                    pinfo.applicationInfo).toString();
            // 设置应用程序的包名
            shareItem.pakageName = pinfo.applicationInfo.packageName;

            datas.add(shareItem);

        }
        gridview.setAdapter(new baseAdapter(this, datas));

        // 点击应用图标时,做出响应
        gridview.setOnItemClickListener(new ClickListener());
    }

    public static List<PackageInfo> getAllApps(Context context) {

        List<PackageInfo> apps = new ArrayList<PackageInfo>();
        PackageManager pManager = context.getPackageManager();
        // 获取手机内所有应用
        List<PackageInfo> packlist = pManager.getInstalledPackages(0);
        for (int i = 0; i < packlist.size(); i++) {
            PackageInfo pak = (PackageInfo) packlist.get(i);
            // if()里的值如果<=0则为自己装的程序,否则为系统工程自带
            if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
                // 添加自己已经安装的应用程序
                // apps.add(pak);
            }
            apps.add(pak);
        }
        return apps;
    }

    private class ClickListener implements OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long arg3) {
            Intent intent = new Intent();
            intent = PackageInfoDemo.this.getPackageManager()
                    .getLaunchIntentForPackage(datas.get(position).pakageName);
            startActivity(intent);
        }
    }
}

使用ResolveInfo

public class ResolveInfoDemo extends Activity {
    private GridView gridview;
    private PackageManager pManager;
    private List<PakageMod> datas;
    private String tag = "ResolveInfoDemo";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_main);
        // 取得gridview
        gridview = (GridView) findViewById(R.id.gridview);

        // 获取图片、应用名、包名
        pManager = this.getPackageManager();

        datas = new GetAllApps(this).getDatas();
        gridview.setAdapter(new DemoGridAdapter(this, datas));
        gridview.setOnItemClickListener(new ClickListener());
    }

    // 当用户点击应用程序图标时,将对这个类做出响应
    private class ClickListener implements OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int arg2,
                long arg3) {
            Intent intent = new Intent();
            intent = getPackageManager().getLaunchIntentForPackage(
                    datas.get(arg2).pakageName);
            startActivity(intent);
        }

    }
}

GetAllApps.java

public class GetAllApps {

    private Context mContext;
    private PackageManager packageManager;
    private int mIconDpi;
    private String tag = "GetAllApps";
    private List<PakageMod> datas = new ArrayList<PakageMod>();
    
    public GetAllApps(Context mContext){
        this.mContext = mContext;
         ActivityManager activityManager =
                    (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        packageManager = mContext.getPackageManager();
         mIconDpi = activityManager.getLauncherLargeIconDensity();
    }
    
    public void loadAllAppsByBatch() {
        List<ResolveInfo> apps = null;
        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        apps = packageManager.queryIntentActivities(mainIntent, 0);
        for (int i = 0; i < apps.size(); i++) {
            String packageName = apps.get(i).activityInfo.applicationInfo.packageName;
            String title = apps.get(i).loadLabel(packageManager).toString();
            Drawable icon = null;
            if(title == null){
                title = apps.get(i).activityInfo.name;
            }
            ActivityInfo info = apps.get(i).activityInfo;
            icon = getFullResIcon(info);
            datas.add(new PakageMod(packageName,title,icon));
        }
    }

    public Drawable getFullResIcon(ActivityInfo info) {
        Resources resources;
        try {
            resources = packageManager.getResourcesForApplication(
                    info.applicationInfo);
        } catch (PackageManager.NameNotFoundException e) {
            resources = null;
        }
        if (resources != null) {
            int iconId = info.getIconResource();            
            if (iconId != 0) {
                return getFullResIcon(resources, iconId);
            }
        }
        return getFullResDefaultActivityIcon();
    }
    
    public Drawable getFullResDefaultActivityIcon() {
        return getFullResIcon(Resources.getSystem(),
                android.R.mipmap.sym_def_app_icon);
    }
    
    public Drawable getFullResIcon(Resources resources, int iconId) {
        Drawable d;
        try {
            // requires API level 15 (current min is 14):
            d = resources.getDrawableForDensity(iconId, mIconDpi);
        } catch (Resources.NotFoundException e) {
            d = null;
        }

        return (d != null) ? d : getFullResDefaultActivityIcon();
    }

    public List<PakageMod> getDatas() {
        loadAllAppsByBatch();
        return datas;
    }
}

里getDrawableForDensity需要是15版本以上的SDK支持,所有低版本的Launcher不可以使用;

本博文使用的两种方法都不需要配置任何权限;

Android4.2的Launcher中使用ResolveInfo进行获取所用的应用列表,这里的ResolveInfo的Demo也是从Launcher源码中抄出来的;

或许还有第3种方法.......待续;

本文来自于CSDN博客,转载请联系作者;
注明出处http://blog.csdn.net/dreamintheworld/article/details/39718581


以上是关于安卓Launcher之获取手机安装的应用列表,安卓launcher的主要内容,如果未能解决你的问题,请参考以下文章

手机的“launcher3"停止运行怎么办?”

安卓手机怎么反ROOT检测

安卓Android开发:获取手机上可分享的应用列表

安卓Android开发:获取手机上可分享的应用列表

安卓Android开发:获取手机上可分享的应用列表

如何在安卓手机上安装所有应用程序