Android開發之獲取所有軟件信息
程序運行效果圖:
程序代碼:
/** * 獲取所有軟件信息 * 1.通過異步的方式顯示系統中所有軟件 * 2.單擊打開指定軟件 * 3.將所有軟件的包名和activity名保存的本地SharedPreferences * @author jph * Date:2014.09.21 */ public class ScanPackage1 extends Activity { /**掃描成功**/ private final static int FLAG_LOAD_SUCCESS=0x10001; private final static int SCANNING=0x10002; private ListView list; private List<Map<String, Object>>items=new ArrayList<Map<String,Object>>(); private SimpleAdapter adapter; // 取得所有安裝軟件信息 private List<PackageInfo> allPackageInfos; // 取得自己安裝的軟件信息 private List<PackageInfo> userPackageInfos; // 取得系統安裝的軟件信息 private List<PackageInfo> sysPackageInfos; Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case FLAG_LOAD_SUCCESS://完成掃描 break; case SCANNING://正在掃描 items.add((Map<String, Object>) msg.obj); //通知適配器數據改變 adapter.notifyDataSetChanged(); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sp_layout); list=(ListView)findViewById(R.id.list); new ScanThread().start(); adapter=new SimpleAdapter(this, items, R.layout.line, new String[]{ "imgIco","appName","packageName" }, new int[]{R.id.imgIco,R.id.tvAppName,R.id.tvAppDesc}); list.setAdapter(adapter); //ViewBinder該類可以幫助SimpleAdapter加載圖片(如:Bitmap,Drawable) adapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // TODO Auto-generated method stub if(view instanceof ImageView && data instanceof Drawable){ ImageView iv = (ImageView) view; iv.setImageDrawable((Drawable) data); return true; }else{ return false; } } }); list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub try { PackageInfo pInfo=allPackageInfos.get(arg2); Intent intent=new Intent(); intent.setComponent(new ComponentName(pInfo.packageName, pInfo.activities[0].name)); startActivity(intent); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }); } // ***************--------*創建一個線程加載安裝程序*--------------*******************// private class ScanThread extends Thread { @Override public void run() { // 取得系統安裝所有軟件信息 allPackageInfos = getPackageManager().getInstalledPackages( PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_ACTIVITIES); // 定義用戶安裝軟件信息包 userPackageInfos = new ArrayList<PackageInfo>(); // 定義系統安裝軟件信息包 sysPackageInfos = new ArrayList<PackageInfo>(); // 循環取出所有軟件信息 for (int i = 0; i < allPackageInfos.size(); i++) { // 得到每個軟件信息 PackageInfo temp = allPackageInfos.get(i); ApplicationInfo appInfo = temp.applicationInfo; if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 || (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { //系統軟件 sysPackageInfos.add(temp); } else { //用戶自己安裝軟件 userPackageInfos.add(temp); } //獲取程序的圖標 Drawable ico=ScanPackage1.this.getPackageManager().getApplicationIcon(appInfo); //獲取程序的名稱 String appName=(String) ScanPackage1.this.getPackageManager().getApplicationLabel(appInfo); Map<String, Object>item=new HashMap<String, Object>(); //獲取程序的包名 String packageName=appInfo.packageName; item.put("imgIco", ico); item.put("appName", appName); item.put("packageName", packageName); Message message = new Message(); message.what =SCANNING; message.obj = item; mHandler.sendMessage(message); } saveInfo(sysPackageInfos, userPackageInfos); mHandler.sendEmptyMessage(FLAG_LOAD_SUCCESS); } }; /** * 將系統中所裝程序的信息寫入到配置文件 * @param sysPackageInfos 系統安裝軟件信息包 * @param userPackageInfos 用戶安裝軟件信息包 */ private void saveInfo(List<PackageInfo> sysPackageInfos,List<PackageInfo> userPackageInfos) { //將用戶安裝的軟件添加到添加到系統軟件的集合中 sysPackageInfos.addAll(userPackageInfos); SharedPreferences sp = this.getSharedPreferences("appInfs", MODE_PRIVATE); Editor editor = sp.edit(); for (int i = 0; i < sysPackageInfos.size(); i++) { try { //獲取程序的包名 String packageName = sysPackageInfos.get(i).packageName; // 取出activity信息 ActivityInfo activityInfo = sysPackageInfos.get(i).activities[0]; // 取出activity名字 String activityName=activityInfo.name; //將程序的信息寫入到配置文件 editor.putString(packageName, activityName); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } editor.commit(); } }
來自:http://blog.csdn.net/fengyuzhengfan/article/details/39451989
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!