zoukankan      html  css  js  c++  java
  • 安卓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


  • 相关阅读:
    【数学】三分法
    【数学】【背包】【NOIP2018】P5020 货币系统
    【数学】【CF27E】 Number With The Given Amount Of Divisors
    【单调队列】【P3957】 跳房子
    【极值问题】【CF33C】 Wonderful Randomized Sum
    【DP】【CF31E】 TV Game
    【神仙题】【CF28D】 Don't fear, DravDe is kind
    【线段树】【CF19D】 Points
    【字符串】KMP字符串匹配
    【二维树状数组】【CF10D】 LCIS
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5213669.html
Copyright © 2011-2022 走看看