通过已/未安装的apk获取apk的信息

参考http://blog.csdn.net/feng88724/article/details/6198446,http://blog.chinaunix.net/uid-26898698-id-3896769.html与互联网

众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下

PackageManager packageManager = this.getPackageManager();  

List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);  

通过以上方法,可以得到手机中安装的所有应用程序,既包括了手动安装的apk包的信息,也包括了系统预装的应用软件的信息,要区分这两类软件可使用以下方法:

a.从packageInfoList获取的packageInfo,再通过packageInfo.applicationInfo获取applicationInfo。

b.判断(applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)的值,该值大于0时,表示获取的应用为系统预装的应用,反之则为手动安装的应用。

大家可以看下代码,说明已经写在注释中。

获取应用的代码:


/**
 * 查询手机内非系统应用
 * @param context
 * @return
 */
public static List<PackageInfo> getAllApps(Context context) {
    List<PackageInfo> apps = new ArrayList<PackageInfo>();
    PackageManager pManager = context.getPackageManager();
    //获取手机内所有应用
    List<PackageInfo> paklist = pManager.getInstalledPackages(0);
    for (int i = 0; i < paklist.size(); i++) {
        PackageInfo pak = (PackageInfo) paklist.get(i);
        //判断是否为非系统预装的应用程序
        if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
            // customs applications
            apps.add(pak);
        }
    }
    return apps;
}
 

获取图片、应用名、包名:

PackageManager pManager = MessageSendActivity.this.getPackageManager();
List<PackageInfo> appList  = Utils.getAllApps(MessageSendActivity.this);  

for(int i=0;i<appList.size();i++) {
    PackageInfo pinfo = appList.get(i);
    ShareItemInfo shareItem = new ShareItemInfo();
    //set Icon
 shareItem.setIcon(pManager.getApplicationIcon(pinfo.applicationInfo));
    //set Application Name
    shareItem.setLabel(pManager.getApplicationLabel(pinfo.applicationInfo).toString());
    //set Package Name
    shareItem.setPackageName(pinfo.applicationInfo.packageName);  

}
 


其中 ShareItemInfo 类是我本地自定义的,各位可以忽略!

另为,有人可能在找 分享应用列表,在此一并说下吧。

获取支持分享的应用的代码:

/**
 * 查询手机内所有支持分享的应用
 * @param context
 * @return
 */
public static List<ResolveInfo> getShareApps(Context context){
    List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();
    Intent intent=new Intent(Intent.ACTION_SEND,null);
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.setType("text/plain");
    PackageManager pManager = context.getPackageManager();
    mApps = pManager.queryIntentActivities(intent,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);    

    return mApps;
}  


由于该方法,返回的并不是 PackageInfo 对象。而是 ResolveInfo。因此获取图片、应用名、包名的方法不一样,如下:

PackageManager pManager = MessageSendActivity.this.getPackageManager();  

/*********************查询手机内所有支持分享的应用*********************/
List<ResolveInfo> resolveList  = Utils.getShareApps(MessageSendActivity.this);  

for(int i=0;i<resolveList.size();i++) {
    ResolveInfo resolve = resolveList.get(i);
    ShareItemInfo shareItem = new ShareItemInfo();
    //set Icon
 shareItem.setIcon(resolve.loadIcon(pManager));
    //set Application Name
    shareItem.setLabel(resolve.loadLabel(pManager).toString());
    //set Package Name
    shareItem.setPackageName(resolve.activityInfo.packageName);  

}  




总结:

通过 PackageInfo  获取具体信息方法:

 

包名获取方法:packageInfo.packageName

icon获取获取方法:packageManager.getApplicationIcon(applicationInfo)

应用名称获取方法:packageManager.getApplicationLabel(applicationInfo)

使用权限获取方法:packageManager.getPackageInfo(packageName,PackageManager.GET_PERMISSIONS)

.requestedPermissions

通过 ResolveInfo 获取具体信息方法:

 

包名获取方法:resolve.activityInfo.packageName

icon获取获取方法:resolve.loadIcon(packageManager)

应用名称获取方法:resolve.loadLabel(packageManager).toString()

通过apk获取包名 入口名

方法一:使用aapt    //aapt是sdk自带的一个工具,在sdk\builds-tools\目录下

1.以ES文件浏览器为例,命令行中切换到aapt.exe目录执行:aapt dump badging E:\apk\es3.apk

2.运行后的结果中以下两行分别是应用包名package和入口activity名称

package: name=’com.estrongs.android.pop’
launchable-activity: name=’com.estrongs.android.pop.view.FileExplorerActivity’

注:在android sdk目录搜索可以找到aapt.exe,如果没有可以下载apktool。

方法二:查看AndroidManifest.xml

1.使用apktool反编译app:apktool.bat d es3.apk E:\apk\es

2.打开AndroidManifest.xml

manifest节点的package属性值是应用的包名:<manifest package=”com.estrongs.android.pop”>

查找android.intent.action.MAIN和android.intent.category.LAUNCHER对应的activity,该activity对应的android:name属性既是入口activity名称,如下:

<activity android:theme=”@*android    tyle/Theme.NoTitleBar” android:label=”@string/app_name” android:name=”com.estrongs.android.pop.view.FileExplorerActivity”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>

android.intent.action.MAIN决定应用程序最先启动的Activity

android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里

时间: 2024-11-02 20:39:38

通过已/未安装的apk获取apk的信息的相关文章

获取apk签名信息(已经安装和未安装的)

import java.io.File; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Iterator; import ja

android动态加载已安装和未安装的apk资源

在android开发中动态加载已安装和未安装的apk资源,是很有用的,可以用来实现换肤功能等等.今天我们来学习. 首先新建一个工程plugpicinstall,我们需要往该工程的asset目录和drawable目录下拷贝一些呆会需要加载的图片.运行该工程,即安装. 我们先看看如何实现加载已经安装的apk中的资源: 我们需要先写两个方法,用来获取对应的已安装的apk的context对象和resource对应的id,如下: /** * 该方法用来获取已经安装的apk对应的context对象 * @r

android得到已安装和未安装apk的信息

在获取apk资源时候最重要的一个类就是PackageManager,我们可以通过这个类得到各种想要的东西,首先是得到已经安装的apk的基本信息,包括label,和图标等资源: PackageManager pm = getPackageManager(); List<PackageInfo> apkInfos = pm.getInstalledPackages(0); ArrayList<String> infos_name = new ArrayList<String>

Android菜鸟笔记- 获取未安装的APK图标、版本、包名、名称、是否安装、安装、打开

周末闲来无事,把Android的基础知识拿出来复习复习,今天主题是<获取未安装的APK图标.版本.包名.名称.是否安装.跳转安装.打开> 一.获取APK图标 通常读取APK的图标可以用,PackageManager里面的getApplicationIcon(ApplicationInfo)来得到一个drawable.但实际使用的时候经常只能得到一个默认的图标,根本不是APK的图标. 参考小米开源文件管理器,结合实践,代码如下: /* * 采用了新的办法获取APK图标,之前的失败是因为andro

Android菜鸟笔记- 获取未安装的APK图标、版本号、包名、名称、是否安装、安装、打开

周末闲来无事,把Android的基础知识拿出来复习复习,今天主题是<获取未安装的APK图标.版本号.包名.名称.是否安装.跳转安装.打开> 一.获取APK图标 通常读取APK的图标能够用,PackageManager里面的getApplicationIcon(ApplicationInfo)来得到一个drawable.但实际使用的时候常常仅仅能得到一个默认的图标.根本不是APK的图标. 參考小米开源文件管理器,结合实践,代码例如以下: /* * 採用了新的办法获取APK图标.之前的失败是由于a

获取未安装的APK图标

/* * 采用了新的办法获取APK图标,之前的失败是因为android中存在的一个BUG,通过 * appInfo.publicSourceDir = apkPath;来修正这个问题,详情参见: * http://code.google.com/p/android/issues/detail?id=9151 */ public static Drawable getApkIcon(Context context, String apkPath) { PackageManager pm = con

Android 下得到 未安装APK包含信息 等

很多情况下,我们需要通过APK文件来得到它的一些信息. (此时此APK不一定被安装了) 0. 基础知识:可以通过android.content.Context的方法 getPackageManager()得到一个PackageManager实例.PackageManager有一个方法:PackageInfo getPackageArchiveInfo (String archiveFilePath, int flags):其中参数一:archiveFilePath.就是指一个APK文件绝对路径.

Java 获取APK安装程序的包名

Java 获取APK安装程序的包名核心的两个类: ResPackage ApkDecoder package com.temobi.util; import java.io.File; import java.util.Set; import brut.androlib.AndrolibException; import brut.androlib.ApkDecoder; import brut.androlib.res.data.ResPackage; public class APKUtil

android获取APK签名信息及MD5指纹

1.获取APK的签名信息 01 private String showUninstallAPKSignatures(String apkPath) { 02          String PATH_PackageParser = "android.content.pm.PackageParser"; 03          try { 04              // apk包的文件路径 05              // 这是一个Package 解释器, 是隐藏的 06