安卓开发获取本机所有已安装程序(形成ListView)

项目刚好需要用到这个,查询汇总了很多资料最后终于顺利解决,也积累了不少查资料的技巧,现在把思路整理一下,希望能对想做类似功能的朋友有帮,希望结交热爱移动开发的朋友。 下面切入正题!

之前自己写代码一个很坏的习惯就是类的互相解耦之间做的很差,一堆代码都是堆在一起的,从没考虑到规划接口,工具类。

这里首先创建一个保存一个APP所有信息的类,包括名字,图标,版本号等。

//AllAppInfo类
class AllAppInfo {
    private int versionCode = 0;  //版本号
    private String appname = "";// 程序名称
    private String packagename = "";    //包名称
    private Drawable appicon ;//图标
    private long lastInstal;//最后一次安装时间
    private ProviderInfo[] provider;//供应商
    private String InstalPath;//安装路径
    private int flag ;  //判断是不是系统应用

  public int getVersionCode() {
      return versionCode;
  }  

  public void setAppicon(PackageManager packageManager) {
	// TODO Auto-generated method stub

}

public void setVersionCode(int versionCode) {
      this.versionCode = versionCode;
  }  

  public String getAppname() {
      return appname;
  }  

  public void setAppname(String appname) {
      this.appname = appname;
  }  

  public String getPackagename() {
      return packagename;
  }  

  public void setPackagename(String packagename) {
      this.packagename = packagename;
  }  

  public Drawable getAppicon() {
      return appicon;
  }  

  public void setAppicon(Drawable appicon) {
      this.appicon = appicon;
  }  

  /**
   * @return the lastInstal
   */
  public long getLastInstal() {
      return lastInstal;
  }  

  /**
   * @param firstInstallTime the lastInstal to set
   */
  public void setLastInstal(long firstInstallTime) {
      this.lastInstal = firstInstallTime;
  }  

  /**
   * @return the provider
   */
  public ProviderInfo[] getProvider() {
      return provider;
  }  

  /**
   * @param providers the provider to set
   */
  public void setProvider(ProviderInfo[] providers) {
      this.provider = providers;
  }  

  /**
   * @return the instalPath
   */
  public String getInstalPath() {
      return InstalPath;
  }  

  /**
   * @param instalPath the instalPath to set
   */
  public void setInstalPath(String instalPath) {
      InstalPath = instalPath;
  }   

  public void setFlags(int flag)
  {
	  this.flag = flag ;
  }

  public int getFlags()
  {
	  return this.flag ;
  }
}

写之前这个类看似写了很多多余的东西,但是程序的健壮性大大增加,将来需要深入开发这个APP列表的话一个setter加一个getter直接搞定,代码逻辑一目了然。继续。

这里继续创建一个Get函数,返回一个集合保存所有需要查询的内容

//Get函数
    private ArrayList<AllAppInfo> Get(){
    ArrayList<AllAppInfo> appList = new ArrayList<AllAppInfo>();
    List<PackageInfo> packageInfos=getPackageManager().getInstalledPackages(0);
    for (int i = 0; i < packageInfos.size(); i++) {
        PackageInfo pInfo=packageInfos.get(i);
        AllAppInfo allAppInfo=new AllAppInfo();
        allAppInfo.setAppname(pInfo.applicationInfo.loadLabel(getPackageManager()).toString());//应用程序的名称
        allAppInfo.setPackagename(pInfo.packageName);//应用程序的包
        allAppInfo.setVersionCode(pInfo.versionCode);//版本号
        allAppInfo.setFlags(pInfo.applicationInfo.flags);   //uid号
        allAppInfo.setLastInstal(pInfo.firstInstallTime);
        //allAppInfo.setProvider(pInfo.providers);
        allAppInfo.setAppicon( pInfo.applicationInfo.loadIcon(getPackageManager()) );
        allAppInfo.setInstalPath(pInfo.applicationInfo.sourceDir);
        appList.add(allAppInfo);
    }
    return appList;
    }
    

以上两步做完之后整个模块基本就成了,剩下的就是配置一下界面适配器。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;

public class AboutMore extends Activity {  

	private ListView listview ;
	private List<Map<String, Object>> listitem ;
	private String[] systemApp = {"设置","录音机","时钟"} ;
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.aboutmore_layout);
		 listitem = new ArrayList<Map<String,Object>>();
      //  Get();
        ArrayList<AllAppInfo> list=this.Get();
        for (Iterator<AllAppInfo> iterator = list.iterator(); iterator.hasNext();)
        {
            AllAppInfo allAppInfo = (AllAppInfo) iterator.next();
            System.out.println(allAppInfo.getAppname()+" |"+allAppInfo.getPackagename()+"| "+allAppInfo.getVersionCode()+"|"+allAppInfo.getLastInstal()+"|"+allAppInfo.getInstalPath());
            if((allAppInfo.getFlags() & ApplicationInfo.FLAG_SYSTEM)>0)  //如果判定为系统应用
            {
            	int flag = 0 ;
            	for(int i = 0 ;i<systemApp.length ;i++)
            	{
            		if( systemApp[i].equals(allAppInfo.getAppname()) )
            		{
            			flag = 1 ;
            		}
            	}
            	if(flag == 0)
            		continue ;

            }
           // System.out.println(allAppInfo.getAppname()+" |"+allAppInfo.getPackagename()+"| "+allAppInfo.getVersionCode()+"|"+allAppInfo.getLastInstal()+"|"+allAppInfo.getInstalPath());
            Map<String, Object> showitem = new HashMap<String, Object>();
            showitem.put("logo",allAppInfo.getAppicon() );
            showitem.put("appName",allAppInfo.getAppname());
            showitem.put("packagename",allAppInfo.getPackagename() ) ;
            listitem.add(showitem);
        }  

		SimpleAdapter myAdapter = new SimpleAdapter(getApplicationContext(), listitem, R.layout.aboutmore_item_layout, new String[]{"logo","appName"}, new int[]{R.id.logo,R.id.app_name});
		myAdapter.setViewBinder(new ViewBinder()
		 {
	           public boolean setViewValue(View view,Object data,String textRepresentation)
	           {
	                 if(view instanceof ImageView && data instanceof Drawable)
	                 {
	                      ImageView iv=(ImageView)view;
	                      iv.setImageDrawable((Drawable)data);
	                     return true;
	                   }
	                 else return false;
	            }
	     } );

		listview = (ListView) findViewById(R.id.listview) ;    //实例化listview
		listview.setAdapter(myAdapter);                           //为listview添加适配器

		//下面开始添加列表的事件监听

		listview.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
			    String packagename = listitem.get(position).get("packagename").toString() ;
				doStartApplicationWithPackageName(packagename);
			}
		});
    }
}

这里在上面代码的最后调用了一个方法,通过程序的包开启调用,以下的代码转自一篇博客。博客地址http://blog.csdn.net/mad1989/article/details/38090513,写的很棒。

*
     * 通过包的名字调用其他程序
     * 来自:http://blog.csdn.net/mad1989/article/details/38090513
     */
	private void doStartApplicationWithPackageName(String packagename) {

		// 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等
		PackageInfo packageinfo = null;
		try {
			packageinfo = getPackageManager().getPackageInfo(packagename, 0);
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		if (packageinfo == null) {
			return;
		}

		// 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
		Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
		resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
		resolveIntent.setPackage(packageinfo.packageName);

		// 通过getPackageManager()的queryIntentActivities方法遍历
		List<ResolveInfo> resolveinfoList = getPackageManager()
				.queryIntentActivities(resolveIntent, 0);

		ResolveInfo resolveinfo = resolveinfoList.iterator().next();
		if (resolveinfo != null) {
			// packagename = 参数packname
			String packageName = resolveinfo.activityInfo.packageName;
			// 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]
			String className = resolveinfo.activityInfo.name;
			// LAUNCHER Intent
			Intent intent = new Intent(Intent.ACTION_MAIN);
			intent.addCategory(Intent.CATEGORY_LAUNCHER);

			// 设置ComponentName参数1:packagename参数2:MainActivity路径
			ComponentName cn = new ComponentName(packageName, className);

			intent.setComponent(cn);
			startActivity(intent);
		}

最后晒上一张效果图。  PS:自己在获取APP图标的代码上花费了很多时间,现在特别说明一下。如下这样完成AllAppInfo类的setAppicon方法就可以顺利在需要的时候取出来用了

 allAppInfo.setAppicon( pInfo.applicationInfo.loadIcon(getPackageManager()) );  //通过getPackageManager

时间: 2024-12-29 02:31:41

安卓开发获取本机所有已安装程序(形成ListView)的相关文章

从”茄子快传”看应用程序怎样获取手机已安装程序的apk文件

"茄子快传"是联想开发的一款近距离文件共享软件.它通过wifi-direct(速度飞快,不须要联网)或者普通的网络(速度慢)在不同手机间传递文件. 不知为何.它就火了起来,火的也飞快.当中.共享传输已安装程序文件apk这一功能引起了我强烈的兴趣. 我们知道android对每一个应用的权限做了非常苛刻的控制,每一个应用程序有自己的用户id,每一个应用程序仅仅能訪问自己的数据,比方程序com.android.calculator计算器程序仅仅被同意訪问/data/data/com.andr

从”茄子快传”看应用程序如何获取手机已安装程序的apk文件

"茄子快传"是联想开发的一款近距离文件共享软件,它通过wifi-direct(速度飞快,不需要联网)或者普通的网络(速度慢)在不同手机间传递文件.不知为何,它就火了起来,火的也飞快.其中,共享传输已安装程序文件apk这一功能引起了我强烈的兴趣. 我们知道android对每个应用的权限做了很苛刻的控制,每个应用程序有自己的用户id,每个应用程序只能访问自己的数据,比如程序com.android.calculator计算器程序只被允许访问/data/data/com.android.cal

iOS开发 - 获取真机沙盒数据

今天要获取之前真机测试时写入沙盒的数据, 本来以为挺麻烦的. 后来捣腾了一下, 才知道原来这么简单... 下面直接看具体步骤. 前提: 真机已经通过USB和你的电脑连接上了! 1.进入Organizer 2.选择你的应用. 并导出数据.(点击Download) 3.保存数据到相应位置.(点击Save) 4.打开, 查看数据. 保存完毕后, 你后发现一个这样的文件. 选中它, 右键---->显示包内容. 然后进入------->AppData ------>Documents. 即可看到你

获取手机中所有已安装的应用,并判断是否系统应用

//获取手机中所有已安装的应用,并判断是否系统应用 ArrayList<AppInfo> appList = new ArrayList<AppInfo>(); //用来存储获取的应用信息数据,手机上安装的应用数据都存在appList里 List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);   for(int i = 0; i < packages.size(); i++

eclipse的安卓开发插件『ADT』在线安装不成功的解决方案

eclipse的安卓开发插件『ADT』在线安装不成功的解决方案:http://tieba.baidu.com/p/1887052563 android ADT下载地址:http://tools.android-studio.org http://www.ddooo.com/softdown/61744.htm

UninstallView(已安装程序查看器)

软件简介: UninstallView 是一个收集在你系统已安装所有程序信息和在一个表中显示已安装程序的详细信息的工具.你可以使用它获取你的本地系统.你的网络上远程电脑和你电脑的外部可插拔的硬盘的程序信息.它允许你轻易的卸载在你本地电脑或远程电脑的软件. 图片预览: 下载地址:http://dickmoore.cn/Down/uninstallview.zip 文章作者:DickMoore 文章来源:开怀软件园

android 非root机器如何备份已安装程序的apk

问题描述 想做一个能够备份已安装程序的apk程序,不知道已经安装过的程序,系统有没有保留一份安装文件,如果有路径在哪里? 解决方案1 LZ注意了    系统是不会帮你备份的(除非系统程序烧到rom的) 不过你的apk如果是下载的,就会在sd卡上,不删除的话会在的,但是删了就没了 另外你说的已经安装的apk,会在data/app下,数据在data/data下,这个我觉得没root是操作不了这个文件的,当然这个需要验证

关于获取Android系统所有已安装App信息的一些操作(详细)

转载请注明出处:http://blog.csdn.net/qinjuning       本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:  第一部分: 获取应用程序的packagename.label.icon等 :             第二部分:获取应用程序的占用大小,包括:缓存大小(cachsize).数据大小(datasize). 每部分都为您准备了简单丰富的实例,您一定不会错过.

用web开发手机app读取已安装程序列表

嗍燹 菁硒 邓 ㄠ劣 吼魄 焕辶 筋浓 财箅 堋犟 ě懂 缓 昵靴 绫 偶 麸焕 衢肱 纂闭 媸翘 杂馋 谊驷 ┓椅 箫蕉 狈岜 驷 咛 汩庖 疫镂 剡 孪艺 鸠题 赝 华欲 サ拴 途项 ぃ砘 涂篮 敝桫 镀с 妊烁 璇麻 辞遄 翟齑 丑 钽х 绵崂 魂郴 漤维 榱⒕ 抑 荮配 系诉 陕 ⑴ 0贞 车剖 林萁 魄拂 醇沛 笃灭 肷⑥ 滟圈 茂 滚 恶稚 酡谱 ┼掌 眸遄 沅赖 吧 馗 蟪 亠络 吻 怛笙 乒 掘  咧骠 否织 赋跷 ? 衿 槠γ 夔