美文网首页我爱编程
Android 识别手机已安装应用

Android 识别手机已安装应用

作者: cccccccxxxxxx | 来源:发表于2017-02-08 21:46 被阅读117次

    废话不多说 直接上代码

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


    界面布局文件:

    布局文件,只有一个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 识别手机已安装应用

        本文链接:https://www.haomeiwen.com/subject/lrtbittx.html