`
kalogen
  • 浏览: 886591 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

最简单的获取未安装APK文件图标、包名的方法

 
阅读更多
package lab.sodino.fetchapkicon;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

public class FetchAPKIconAct extends Activity {
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  showUninstallAPKIcon("/sdcard/APK/JarodYv.FishPool.apk");
  getUninatllApkInfo(this, "/sdcard/APK/JarodYv.FishPool.apk");
 }
 
 public void getUninatllApkInfo(Context context, String archiveFilePath) {
  PackageManager pm = context.getPackageManager();
  PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
  if (info != null) {
   ApplicationInfo appInfo = info.applicationInfo;
   Drawable icon = pm.getApplicationIcon(appInfo);
   ImageView image = (ImageView) findViewById(R.id.apkIconByTradition);
   image.setVisibility(View.VISIBLE);
   image.setImageDrawable(icon);
  }
 }
 //
 private void showUninstallAPKIcon(String apkPath) {
  String PATH_PackageParser = "android.content.pm.PackageParser";
  String PATH_AssetManager = "android.content.res.AssetManager";
  try {
   // apk包的文件路径
   // 这是一个Package 解释器, 是隐藏的
   // 构造函数的参数只有一个, apk文件的路径
   // PackageParser packageParser = new PackageParser(apkPath);
   Class pkgParserCls = Class.forName(PATH_PackageParser);
   Class[] typeArgs = new Class[1];
   typeArgs[0] = String.class;
   Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
   Object[] valueArgs = new Object[1];
   valueArgs[0] = apkPath;
   Object pkgParser = pkgParserCt.newInstance(valueArgs);
   Log.d("ANDROID_LAB", "pkgParser:" + pkgParser.toString());
   // 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
   DisplayMetrics metrics = new DisplayMetrics();
   metrics.setToDefaults();
   // PackageParser.Package mPkgInfo = packageParser.parsePackage(new
   // File(apkPath), apkPath,
   // metrics, 0);
   typeArgs = new Class[4];
   typeArgs[0] = File.class;
   typeArgs[1] = String.class;
   typeArgs[2] = DisplayMetrics.class;
   typeArgs[3] = Integer.TYPE;
   Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",
     typeArgs);
   valueArgs = new Object[4];
   valueArgs[0] = new File(apkPath);
   valueArgs[1] = apkPath;
   valueArgs[2] = metrics;
   valueArgs[3] = 0;
   Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);
   // 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
   // ApplicationInfo info = mPkgInfo.applicationInfo;
   Field appInfoFld = pkgParserPkg.getClass().getDeclaredField("applicationInfo");
   ApplicationInfo info = (ApplicationInfo) appInfoFld.get(pkgParserPkg);
   // uid 输出为"-1",原因是未安装,系统未分配其Uid。
   Log.d("ANDROID_LAB", "pkg:" + info.packageName + " uid=" + info.uid);
   // Resources pRes = getResources();
   // AssetManager assmgr = new AssetManager();
   // assmgr.addAssetPath(apkPath);
   // Resources res = new Resources(assmgr, pRes.getDisplayMetrics(),
   // pRes.getConfiguration());
   Class assetMagCls = Class.forName(PATH_AssetManager);
   Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);
   Object assetMag = assetMagCt.newInstance((Object[]) null);
   typeArgs = new Class[1];
   typeArgs[0] = String.class;
   Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod("addAssetPath",
     typeArgs);
   valueArgs = new Object[1];
   valueArgs[0] = apkPath;
   assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);
   Resources res = getResources();
   typeArgs = new Class[3];
   typeArgs[0] = assetMag.getClass();
   typeArgs[1] = res.getDisplayMetrics().getClass();
   typeArgs[2] = res.getConfiguration().getClass();
   Constructor resCt = Resources.class.getConstructor(typeArgs);
   valueArgs = new Object[3];
   valueArgs[0] = assetMag;
   valueArgs[1] = res.getDisplayMetrics();
   valueArgs[2] = res.getConfiguration();
   res = (Resources) resCt.newInstance(valueArgs);
   CharSequence label = null;
   if (info.labelRes != 0) {
    label = res.getText(info.labelRes);
   }
   // if (label == null) {
   // label = (info.nonLocalizedLabel != null) ? info.nonLocalizedLabel
   // : info.packageName;
   // }
   Log.d("ANDROID_LAB", "label=" + label);
   // 这里就是读取一个apk程序的图标
   if (info.icon != 0) {
    Drawable icon = res.getDrawable(info.icon);
    ImageView image = (ImageView) findViewById(R.id.apkIconBySodino);
    image.setVisibility(View.VISIBLE);
    image.setImageDrawable(icon);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

 

 

 

 

 /**

* @param aContext

* @param aApkPath

* 要读取的apk路径

* @throws Exception

*/

public ApkInfoUtil(Context aContext , String aApkPath) throws Exception

{

PackageManager pm = aContext.getPackageManager();

pi = pm.getPackageArchiveInfo(aApkPath, 0);

 

AssetManager am = AssetManager.class.newInstance();

Method method = AssetManager.class.getDeclaredMethod("addAssetPath", String.class);

method.invoke(am, aApkPath);

iRes = new Resources(am, aContext.getResources().getDisplayMetrics(), aContext.getResources().getConfiguration());

 

}

 

 

 

 

分享到:
评论

相关推荐

    获取第三方apk的包名启动类名icon.rar

    以下是一个简单的获取APK图标的方法: ```java Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(apkPath + "!/res/drawable-mdpi/ic_launcher.png")); ``` 这个代码假设图标位于drawable-mdpi...

    apk解包打包工具

    APK文件包含了应用的所有代码、资源、图标、权限声明等。本文将详细介绍如何使用apk解包打包工具,以及相关步骤,适合初学者学习。 首先,我们要理解APK解包的目的是什么。解包APK是为了查看应用的源代码、资源文件...

    Android 主题之安装的APK主题文件

    首先,我们要明白APK文件是什么。APK是Android应用程序的包文件格式,它包含了应用的所有组成部分,如代码、资源文件、图标等。当用户下载一个主题APK,其实就是在下载一个包含主题元素(如启动器图标、壁纸、通知栏...

    apkhelper.zip

    它能够帮助我们快速获取APK文件的关键信息,如外部版本号、内部版本号、包名、应用图标(icon)以及MD5哈希值等,这些信息对于开发者、测试人员和安全分析者来说具有重要的价值。现在,让我们一起深入了解APKHelper...

    apk反编译必备工具包(macOS平台)

    Apktool是一个开源的工具,主要用于对APK文件进行解包、反编译、修改和重新打包。它能够解析APK中的资源文件,包括XML布局、图片、字符串等,并将它们以人类可读的形式呈现出来。使用Apktool,你可以查看应用程序的...

    android应用管理器+apk+文档+简单uml

    通过阅读文档,开发者可以了解如何调用特定的函数或方法来实现特定功能,比如获取应用列表、安装APK等。 最后,UML(Unified Modeling Language)是一种标准的图形化建模语言,用于软件设计和系统建模。在这个案例...

    判断安卓apk的版本号

    PHP是一种服务器端脚本语言,通常用于构建Web应用,但也可以用来处理APK文件以获取其中的信息,如版本号。在本案例中,提供的文件可能是一个简单的PHP脚本集合,用于检查和管理Android APK的版本更新。 `Apkparser....

    传送提取APK文件工具

    源码AppPlus,App+是一个MD风格的用于传送、提取APK文件的开源工具软件。 优雅体面的提取APK 在工作过程中,有时需要反编译一些软件的APK,此时这些软件就存在于自己的手机,但是无法直接获得从手机中获取APK,...

    最简单的输入法.zip

    总之,这个"最简单的输入法.zip"是一个很好的学习资源,无论是对于初学者还是有一定经验的Android开发者,都能从中获取到实践经验和理论知识。通过深入研究这个项目,开发者可以掌握创建自定义输入法的关键技术和...

    Android APP

    APK文件包含了应用的所有组件,包括代码、资源、图片以及相关的配置文件。用户可以通过点击APK文件来安装应用程序,就像Windows系统中的.exe可执行文件一样。在本例中,"Tina.apk"很可能是一个小型的Android应用程序...

    实现带图标的Listview

    - `getView(int position, View convertView, ViewGroup parent)`: 这是最重要的方法,它负责创建或复用ListView的列表项视图。在这里,我们将使用LayoutInflater实例化`list_item.xml`布局,并设置ImageView和...

    android 桌面定制

    2. **图标包**:图标包包含了一组替换原生应用图标的自定义图标,用户可以通过下载安装来改变桌面应用的外观。这些图标通常设计独特,风格各异,例如扁平化、手绘、拟物化等。 3. **壁纸**:选择个性化的壁纸可以极...

    Android内核剖析之ActivityManger

    - `HashSet<String> pkgList`: 存储该进程中包含的所有APK文件的包名。 - `int maxAdj`: 进程的最大调整值,用于OOM(Out Of Memory)情况下的进程优先级评估。 - `int curAdj`: 当前调整值。 2. **...

    Android 获取手机所有已安装的应用,并可以打开它

    这就是一个简单的Android获取手机所有已安装应用并能打开它们的Demo。通过这个例子,我们可以学习到如何使用PackageManager获取应用信息、动态请求权限以及使用Intent启动应用等关键知识点。这个Demo可以作为理解...

    3C_All-in-One_Toolbox_Pro_v2.2e.apk

    ★文件浏览器*是一个非常简单但功能强大的浏览器,可以使用根目录,按日期,大小和流媒体文件排序以及更新权限,所有权和安全性上下文。本地或任何Samba网络共享 ★应用程序管理器*提供了您期望的所有功能,以及...

    安卓应用-教育学习-同桌教育手机版 v1.0.zip

    1. 应用程序安装包(APK文件):如 "同桌教育手机版_v1.0.apk",这是用户在Android设备上安装应用的文件。 2. 说明文档:可能包括 "ReadMe.txt" 或 "UserGuide.pdf",提供应用的使用指南和注意事项。 3. 图标资源:...

    凯立德安卓手机

    安装过程通常很简单,只需通过手机的文件管理器找到该apk文件,点击进行安装,遵循提示完成操作即可。 在使用凯立德导航时,用户可以享受到多种实用功能,如路径规划、实时路况查询、语音播报、离线地图下载等。...

    使用Android系统隐藏API

    以下是一个简单的示例,展示了如何使用隐藏API来解析一个APK文件并获取相关信息: ```java // 定义APK文件路径 String apkPath = "/sdcard/qq.apk"; // 创建PackageParser对象 PackageParser packageParser = new ...

    Eclipse 开发 Android, Hello, DatePicker (学习7)

    5. `bin` - 编译后生成的二进制文件和资源的目录,包括APK文件。 6. `src` - 存放源代码的目录,每个Java类对应一个文件。 7. `res` - 资源文件夹,包含应用的布局(layout)、图标(drawable)、字符串(values)等...

    Android插件框架Android-Plugin-Framework.zip

    “ant clean debug install” 直接将插件apk安装到系统中,PluginMain工程会监听系统的应用安装广播,监听到插件apk安装广播后, 再自动调用PluginLoader.installPlugin("/data/app/插件apk文件.apk")进行插件安装。...

Global site tag (gtag.js) - Google Analytics