Android 识别手机已安装应用

废话不多说 直接上代码

自己做了一个简单的界面,显示出当前手机的应用列表,点击以后并实现跳转。


界面布局文件:

布局文件,只有一个ListView


ListView的Item布局文件:

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<RelativeLayout

android:layout_width="match_parent"

android:layout_height="70dp">

<ImageView

android:id="@+id/iv_app_icon"

android:layout_width="40dp"

android:layout_height="40dp"

android:layout_alignParentLeft="true"

android:layout_centerVertical="true"

android:layout_marginLeft="12dp"/>

<TextView

android:id="@+id/tv_app_name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="10dp"

android:layout_marginLeft="12dp"

android:layout_marginStart="12dp"

android:layout_toEndOf="@+id/iv_app_icon"

android:layout_toRightOf="@+id/iv_app_icon"

android:singleLine="true"

android:text="应用名称"/>

<TextView

android:id="@+id/tv_app_class_name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:layout_marginLeft="12dp"

android:layout_marginStart="12dp"

android:layout_toEndOf="@+id/iv_app_icon"

android:layout_toRightOf="@+id/iv_app_icon"

android:singleLine="true"

android:text="应用包名"/>

<TextView

android:id="@+id/tv_app_version"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:layout_marginLeft="12dp"

android:layout_marginStart="12dp"

android:layout_below="@id/tv_app_class_name"

android:layout_toEndOf="@+id/iv_app_icon"

android:layout_toRightOf="@+id/iv_app_icon"

android:singleLine="true"

android:text="应用版本号"/>

</RelativeLayout>

</LinearLayout>

一个ListView显示一个应用的icon、应用名称、包名和版本号。


下来是Java代码:

public classAppActivityextendsActivity{

privateListViewlv_app_list;

privateAppAdaptermAppAdapter;

publicHandlermHandler=newHandler();

@Override

protected voidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_app);

lv_app_list=(ListView)findViewById(R.id.lv_app_list);

mAppAdapter=newAppAdapter();

lv_app_list.setAdapter(mAppAdapter);

lv_app_list.setOnItemClickListener(newAdapterView.OnItemClickListener() {

@Override

public voidonItemClick(AdapterViewparent,Viewview,intposition,longid) {

//Toast.makeText(AppActivity.this, mAppAdapter.getData().get(position).getAppName(), Toast.LENGTH_SHORT).show();

doStartApplicationWithPackageName(mAppAdapter.getData().get(position).getAppClassName());

}

});

initAppList();

}

private voidinitAppList(){

newThread(){

@Override

public voidrun() {

super.run();

//扫描得到APP列表

finalListappInfos=ApkTool.scanLocalInstallAppList(AppActivity.this.getPackageManager());

mHandler.post(newRunnable() {

@Override

public voidrun() {

mAppAdapter.setData(appInfos);

}

});

}

}.start();

}

classAppAdapterextendsBaseAdapter{

ListmyAppInfos=newArrayList();

public voidsetData(ListmyAppInfos) {

this.myAppInfos=myAppInfos;

notifyDataSetChanged();

}

publicListgetData() {

returnmyAppInfos;

}

@Override

public intgetCount() {

if(myAppInfos!=null&&myAppInfos.size()>0) {

returnmyAppInfos.size();

}

return0;

}

@Override

publicObjectgetItem(intposition) {

if(myAppInfos!=null&&myAppInfos.size()>0) {

returnmyAppInfos.get(position);

}

return null;

}

@Override

public longgetItemId(intposition) {

return0;

}

@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent) {

ViewHoldermViewHolder;

MyAppInfomyAppInfo=myAppInfos.get(position);

if(convertView==null) {

mViewHolder=newViewHolder();

convertView=LayoutInflater.from(getBaseContext()).inflate(R.layout.item_app_info,null);

mViewHolder.iv_app_icon=(ImageView)convertView.findViewById(R.id.iv_app_icon);

mViewHolder.tx_app_name=(TextView)convertView.findViewById(R.id.tv_app_name);

mViewHolder.tx_app_class_name=(TextView)convertView.findViewById(R.id.tv_app_class_name);

mViewHolder.tx_app_version=(TextView)convertView.findViewById(R.id.tv_app_version);

convertView.setTag(mViewHolder);

}else{

mViewHolder=(ViewHolder)convertView.getTag();

}

mViewHolder.iv_app_icon.setImageDrawable(myAppInfo.getImage());

mViewHolder.tx_app_name.setText(myAppInfo.getAppName());

mViewHolder.tx_app_class_name.setText(myAppInfo.getAppClassName());

mViewHolder.tx_app_version.setText(myAppInfo.getVersion());

returnconvertView;

}

classViewHolder{

ImageViewiv_app_icon;

TextViewtx_app_name,tx_app_class_name,tx_app_version;

}

}

private voiddoStartApplicationWithPackageName(Stringpackagename) {

//通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等

PackageInfopackageinfo=null;

try{

packageinfo=getPackageManager().getPackageInfo(packagename,0);

}catch(PackageManager.NameNotFoundExceptione) {

e.printStackTrace();

}

if(packageinfo==null) {

return;

}

//创建一个类别为CATEGORY_LAUNCHER的该包名的Intent

IntentresolveIntent=newIntent(Intent.ACTION_MAIN,null);

resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);

resolveIntent.setPackage(packageinfo.packageName);

//通过getPackageManager()的queryIntentActivities方法遍历

ListresolveinfoList=getPackageManager()

.queryIntentActivities(resolveIntent,0);

ResolveInforesolveinfo=resolveinfoList.iterator().next();

if(resolveinfo!=null) {

// packagename =参数packname

StringpackageName=resolveinfo.activityInfo.packageName;

//这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]

StringclassName=resolveinfo.activityInfo.name;

// LAUNCHER Intent

Intentintent=newIntent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_LAUNCHER);

//设置ComponentName参数1:packagename参数2:MainActivity路径

ComponentNamecn=newComponentName(packageName,className);

intent.setComponent(cn);

startActivity(intent);

}

}

}


用到的工具类 ApkTool:


public class ApkTool{

static String TAG="ApkTool";

public staticListmLocalInstallApps=null;

public staticListscanLocalInstallAppList(PackageManagerpackageManager) {

ListmyAppInfos=newArrayList();

try{

ListpackageInfos=packageManager.getInstalledPackages(0);

for(inti=0;i

PackageInfopackageInfo=packageInfos.get(i);

//过滤掉系统app

//if ((ApplicationInfo.FLAG_SYSTEM & packageInfo.applicationInfo.flags) != 0) {

//    continue;

//}

MyAppInfomyAppInfo=newMyAppInfo();

ApplicationInfoinfo=packageInfo.applicationInfo;

myAppInfo.setAppName(info.loadLabel(packageManager).toString());

myAppInfo.setAppClassName(packageInfo.packageName);

myAppInfo.setVersion(String.valueOf(packageInfo.versionName));

if(packageInfo.applicationInfo.loadIcon(packageManager)==null) {

continue;

}

myAppInfo.setImage(packageInfo.applicationInfo.loadIcon(packageManager));

myAppInfos.add(myAppInfo);

}

}catch(Exceptione){

Log.e(TAG,"===============获取应用包信息失败");

}

returnmyAppInfos;

}

}


以上就是所有有关的代码,下面贴上一张效果图


显示出手机APP列表并包括详细信息,点击以后跳转到相应应用


 --DemoHandler

保存下来,总有一天,你会用到。


CoderTung 的第 篇知识储备。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 122,797评论 15 534
  • #Android 基础知识点总结 ---------- ##1.adb - android debug bridg...
    Myth骞阅读 1,252评论 2 7
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 2,667评论 0 4
  • 本文参加#未完待续,就要表白#活动, 本人承诺,文章内容为原创,且未在其他 平台发表过。 如果我爱你, 就把潸然的...
    sdut王涛阅读 67评论 1 5
  • 我一个人走着 悠悠地走着 身旁路过 一对恩爱的小情侣 我就在想 这个时候的你 大概也像这样 搂着一个女孩吧 我仿佛...
    舒绘阅读 11评论 0 0