Android——获取手机应用图标

需求:

将手机中的所有应用图标,以应用名称命名,后缀为jpg,存放在SD卡中

思路:

1.通过getPackageManager().getInstalledPackages(0)获取已安装的包的信息PackageInfo

2.通过包信息PackageInfo获取包名、版本名、版本号、当然还有应用图标Drawable对象

3.将Drawable对象转换成Bitmap对象再存储即可(。。。目前只能这样了,暂时不知道如何对Drawable进行处理)

 

代码:

 1 package com.example.utils;
 2 
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 import java.util.List;
 6 
 7 import android.app.Activity;
 8 import android.content.pm.PackageInfo;
 9 import android.graphics.Bitmap;
10 import android.graphics.Canvas;
11 import android.graphics.PixelFormat;
12 import android.graphics.drawable.Drawable;
13 import android.os.Bundle;
14 
15 public class MainActivity extends Activity {
16 
17     @Override
18     protected void onCreate(Bundle savedInstanceState) {
19         super.onCreate(savedInstanceState);
20         setContentView(R.layout.activity_main);
21 
22         // 获取PackageInfo
23         List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);
24 
25         // 获取需要的信息并存储(当然这里可以用增强for循环)
26         for (int i = 0; i < packages.size(); i++) {
27             PackageInfo packageInfo = packages.get(i);
28             String appName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
29             Drawable appIcon = packageInfo.applicationInfo.loadIcon(getPackageManager());
30 
31             // 将drawable转成Bitmap对象
32             Bitmap bm = drawableToBitmap(appIcon);
33 
34             // 指定存储路径以及存储文件名格式
35             File dir = new File("/sdcard/Pictures/");
36             File outputImg = new File(dir, appName + ".jpg");
37             
38             // Bitmap存储过程
39             try {
40                 FileOutputStream out = new FileOutputStream(outputImg);
41                 bm.compress(Bitmap.CompressFormat.PNG, 90, out);
42                 out.flush();
43                 out.close();
44                 LogUtil.e("test", "已经保存" + i);
45             } catch (Exception e) {
46                 // 不处理异常了
47             }
48 
49         }
50     }
51 
52     /**
53      * 将Drawable转成Bitmap
54      * @param drawable
55      * @return
56      */
57     public Bitmap drawableToBitmap(Drawable drawable) {
58 
59         Bitmap bitmap = Bitmap.createBitmap(
60 
61         drawable.getIntrinsicWidth(),
62 
63         drawable.getIntrinsicHeight(),
64 
65         drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
66 
67         : Bitmap.Config.RGB_565);
68 
69         Canvas canvas = new Canvas(bitmap);
70 
71         // canvas.setBitmap(bitmap);
72 
73         drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
74                 drawable.getIntrinsicHeight());
75 
76         drawable.draw(canvas);
77 
78         return bitmap;
79 
80     }
81 }

 

 

为了方便,将之封装成一个Util

 

 1 import java.io.File;
 2 import java.io.FileOutputStream;
 3 import java.util.List;
 4 
 5 import android.content.Context;
 6 import android.content.pm.PackageInfo;
 7 import android.graphics.Bitmap;
 8 import android.graphics.Canvas;
 9 import android.graphics.PixelFormat;
10 import android.graphics.drawable.Drawable;
11 
12 public class IconUtil {
13     private IconUtil() {
14         // 不允许实例化这个对象
15         throw new UnsupportedOperationException("cannot be instantiated");
16     }
17 
18     /**
19      * 将手机上所有的图标存放到saveDir目录下.<br/>
20      * 使用时需要在Manifest中声明两个权限:<br/>
21      * android.permission.WRITE_EXTERNAL_STORAGE.<br/>
22      * 
23      * android.permission.MOUNT_UNMOUNT_FILESYSTEMS.<br/>
24      * @param context
25      * @param saveDir 存放的手机文件夹目录,如new File("/sdcard/Pictures/");
26      * @return i表示图标数量,i=0表示未获取到图标
27      */
28     public static int saveIcon(Context context, File saveDir) {
29         // 获取PackageInfo
30         List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0);
31         int i = 0;
32         int size = packages.size();
33         for (i = 0; i < size; i++) {
34             // 从PackageInfo中获取应用名称和应用图标(Drawable)
35             PackageInfo packageInfo = packages.get(i);
36             String appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString();
37             Drawable appIcon = packageInfo.applicationInfo.loadIcon(context.getPackageManager());
38 
39             // 将drawable转成Bitmap对象
40             Bitmap bm = drawableToBitmap(appIcon);
41 
42             // 指定存储路径以及存储文件名格式
43             File outputImg = new File(saveDir, appName + ".png");
44             
45             // Bitmap存储过程
46             try {
47                 FileOutputStream out = new FileOutputStream(outputImg);
48                 bm.compress(Bitmap.CompressFormat.PNG, 90, out);
49                 out.flush();
50                 out.close();
51             } catch (Exception e) {
52                 // 暂不处理异常
53             }
54             
55         }
56         return i;
57     }
58     
59     /**
60      * 将Drawable转换成Bitmap
61      * @param drawable
62      * @return
63      */
64     public static Bitmap drawableToBitmap(Drawable drawable) {
65 
66         Bitmap bitmap = Bitmap.createBitmap(
67 
68         drawable.getIntrinsicWidth(),
69 
70         drawable.getIntrinsicHeight(),
71 
72         drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
73 
74         : Bitmap.Config.RGB_565);
75 
76         Canvas canvas = new Canvas(bitmap);
77 
78         // canvas.setBitmap(bitmap);
79 
80         drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
81                 drawable.getIntrinsicHeight());
82 
83         drawable.draw(canvas);
84 
85         return bitmap;
86 
87     }
88 }

 

 

使用举例:MainActivity

注意:Manifest权限声明

 

注意需要声明权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

 

 1 import java.io.File;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Environment;
 6 import android.widget.TextView;
 7 
 8 public class MainActivity extends Activity {
 9 
10     private File iconDir;
11     private TextView textView;
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16         textView = (TextView) findViewById(R.id.text);
17         textView.setText("正在获取...");
18 
19     }
20     @Override
21     protected void onResume() {
22         // TODO Auto-generated method stub
23         super.onResume();
24         // 指定存储路径
25         String path = Environment.getExternalStorageDirectory().toString() + "/Icons";
26         iconDir = new File(path);
27         if (!iconDir.exists()) {
28             boolean sucess = iconDir.mkdirs();
29             if(sucess){
30                 
31                 int i = IconUtil.saveIcon(this, iconDir);
32                 textView.setText("总共获取了  "+i+"  个图标!");
33             }else{
34                 textView.setText("创建文件夹失败!");
35             }
36             
37         }else {
38             
39             int i = IconUtil.saveIcon(this, iconDir);
40             textView.setText("总共获取了  "+i+"  个图标!");
41             
42         }
43     }
44 
45     
46 }

 

 

参考:http://www.cnblogs.com/mainroadlee/archive/2011/05/23/android_get_installed_app.html

posted @ 2015-12-01 17:35  洱海  阅读(4658)  评论(0编辑  收藏  举报
.First { margin: 10px 0; font-family: 'Microsoft Yahei'; text-align: left; padding: 6px 20px; color: #fff; background: #55895B; font-size: 20px; border-radius: 4px; clear: both; } .Second { margin: 10px 0; font-family: 'Microsoft Yahei'; padding: 6px 20px; background: #93C8A2; color: white; font-size: 18px; border-radius: 4px; clear: both; } .Third { margin: 10px 0; padding: 6px 20px; font-family: 'Microsoft Yahei'; margin: 15px 0; font-size: 16px; color: black; background: #C6EFD2; border-radius: 4px; clear: both; } .note { margin: 10px 0; padding: 15px 20px 15px 60px; background: #FCFAA9 url('http://images.cnblogs.com/cnblogs_com/libaoheng/305804/o_yellow-pin.png') no-repeat 20px 0; font-size: 15px; font-family: 'Microsoft Yahei'; box-shadow: 0 0 8px #aaa; clear: both; } .demo { text-align: left; padding: 6px 20px; overflow: auto; border-radius: 4px; background: orange; color: #fff; font-size: 16px; clear: both; } .cnblogs_Highlighter { border: solid 1px #ccc; clear: both; } .cnblogs_code { background: #EFFFF4; border: solid 0px #939393; font-size: 14px; clear: both; padding: 10px 20px; } .cnblogs_code pre { font-size: 14px; } .cnblogs_code span { font-family: Courier New; font-size: 14px; }