需求:
将手机中的所有应用图标,以应用名称命名,后缀为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