Android 下得到 未安装APK包含信息 等
很多情况下,我们需要通过APK文件来得到它的一些信息。 (此时此APK不一定被安装了)
0. 基础知识:
可以通过android.content.Context的方法 getPackageManager()得到一个PackageManager实例。
PackageManager有一个方法:
PackageInfo getPackageArchiveInfo (String archiveFilePath, int flags);
其中参数一:archiveFilePath。就是指一个APK文件绝对路径。
请注意它的返回值。是个PackageInfo。它包含Pakcage所有信息,可以认为,这些信息都是从AndroidManifest.xml中收集而来。
1. 得到APK中Activity信息:
PackageInfo中包含:public ActivityInfo[] activities
它会得到AndroidManifest.xml中<application>中所有<Activity> tag.
例如:
ActivityInfo:从 AndroidManifest.xml's <activity> and <receiver> tags得到的信息。
可以从这一项中得到和Activity有关的所有信息。这些内容都是从<activity>或<receiver>中得到。
例1:得到Activity各信息:
想要得到Activity信息,需要参数2设置为: PackageManager.GET_ACTIVITIES
//注意:此处第一次看到ProcessName:
//The name of the process this component should run in. From the "android:process" attribute or, //if not set, the same as applicationInfo.processName
//即此项从main.xml中得到,为android:process项目内容。如果没有设置,则与applicationInfo.processName相同。(注1)
//Activity 所在的PackageName。应该与上面PockageInfo中得到的PackageName相同。
Log.w("3DiJoy", "Activity Name:" + PI.activities[0].name);
2. 得到APK中Application信息:
Information collected from the <application> tag, or null if there was none。
呵呵,如之前所述,其实PackageInfo中所有项目都是从Main.xml中取到的,之前的Activity如此,现在的Application也是如此。
PackageInfo中有一项:
public ApplicationInfo applicationInfo
3.得到APK中版本信息:
Log.w("3DiJoy", "PackageInfo . PackageName:" + PI.packageName);
分别从: <manifest> tag's versionCode attribute和 <manifest> tag's versionName attribute.中得到信息。
注1:
ProcessName相关内容:
PI.activities[0].processName .它其实是activityInfo的父类: android.content.pm.ComponentInfo
此信息从main.xml的 "android:process" attribute中得到。如果没有设置,则与applicationInfo.processName相同。
注2:
PI.applicationInfo.processName
此Application将要运行的ProcessName.从Main.xml的"process" attribute得到。如果没有设置,则应该与PackageName相同。
注3:
PI.applicationInfo.packageName
Application所在的PackageName。
但Sam发现:
在Android2.2下。
从Activity中取得ProcessName,为null.(PI.activities[0].processName)
但从Application中取得packageName却是正确的(PI.applicationInfo.packageName, 与PI.packageName相同)
getPackageArchiveInfo () 的参数1, archive 指的就是APK文件。
1)获取apk文件的图标
- public static Drawable getApkFileIcon(String apkPath, Context context) {
- PackageManager pm = context.getPackageManager();
- PackageInfo info = pm.getPackageArchiveInfo(apkPath,
- PackageManager.GET_ACTIVITIES);
- if (info != null) {
- ApplicationInfo appInfo = info.applicationInfo;
- if (appInfo != null) {
- try {
- appInfo.publicSourceDir = apkPath;
- return pm.getApplicationIcon(appInfo);
- } catch (OutOfMemoryError e) {
- }
- }
- }
- return null;
- }
2)获取AndroidManifest.xml中<meta-data>标签中定义的值
- PackageManager manager = this.getPackageManager();
- try {
- // 设置PackageManager.GET_META_DATA标识位是必须的
- PackageInfo info = manager.getPackageInfo(this.getPackageName(),
- PackageManager.GET_CONFIGURATIONS | PackageManager.GET_META_DATA);
- Object myChannel = info.applicationInfo.metaData.get("meta-data-key");
- if ((myChannel != null) && (myChannel instanceof Integer)) {
- // do something
- }
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
Android 下得到 未安装APK包含信息 等的更多相关文章
- android获取未安装APK签名信息及MD5指纹
站在巨人的肩膀上写博客: http://blog.csdn.net/wulianghuan/article/details/18400581 http://www.jb51.net/article/7 ...
- Android 8.0+ 更新安装apk失败的问题
最近做项目发现Android 8.0+ 更新安装apk时 出现安装失败的情况 总结原因是 缺少安装的权限 Android 8.0 (Android O)为了针对一些流氓软件引导用户安装其他无关应用. ...
- Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类
前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载 声明 欢迎转载, ...
- 加载未安装APK中的类
一.前提 目的:动态加载SD卡中Apk的类. 注意:被加载的APK是未安装的. 相关:本文是本博另外一篇文章:Android动态加载jar/dex的升级版. 截图: 成功截图: 二.准备 准备被调用A ...
- 我的Android进阶之旅------>解决Android Studio编译后安装apk报错:The APK file does not exist on disk
1.错误描述 今天用Android Studio编译应用后安装APK的时候,报错了,错误如下所示: The APK file build\outputs\apk\OYP_2.3.4_I2Base_64 ...
- Android 在代码中安装 APK 文件
废话不说,上代码 private void install(String filePath) { Log.i(TAG, "开始执行安装: " + filePath); File a ...
- 安卓(Android)手机如何安装APK?
我大天朝的安卓手机只能在一个被阉割的APP市场里玩耍,有些APP可能需要直接安装APK文件.APK 是 Android Package (安卓安装包)安卓手机如何安装APK呢? 在电脑上下载安装APK ...
- Android手机提示“未安装应用程序”
用eclipse调试应用时,遇到了这个问题,网上给出的解决方案倒是挺多,但似乎一个都没奏效,而且我手机也重启了,还是有问题,郁闷ing- 然后看到一篇文章指出,可能不是签名和SD的卡问题,而是我们 ...
- Android笔记(预安装APK)
一般一个安卓的产品在出厂时,会预安装许多APK,关于这些APP,主要分为下面这几类 1.系统级别APK 这一类应用一般是:电话/设置或者厂家自己特定的应用. 2.系统预安装APK 因为商业原因,产品出 ...
随机推荐
- db2安装要设置tcp、ip
1.注册表变量DB2COMM是否已经设置了值,是什么级别的?db2set -all | grep -i "DB2COMM" (in unix like os)db2set -all ...
- Windows 小端存储
小端->高高低低(高位存在高地址,低位存在低地址)
- C# 反射相关的东西
public class PlugingManager { //插件装载器 public ArrayList Plugins = new ArrayList(); ...
- MFC中修改默认启动对话框方法
// CMyAppEApp 初始化 BOOL CMyAppEApp::InitInstance(){// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dl ...
- 二分查找(Binary Search)的基本实现
关于二分查找法二分查找法主要是解决在"一堆数中找出指定的数"这类问题. 而想要应用二分查找法,这"一堆数"必须有一下特征: 1,存储在数组中2,有序排列 所以如 ...
- iwlist等工具的移植
http://blog.csdn.net/jk110333/article/details/8658054 参考了这边文章 -------------------------------------- ...
- 转:12C PDB 配置不同的PDB监听端口
How to Define PDB Listeners With Different Ports In A Multitenant Setup Goal This Note will discuss ...
- CentOS 下配置CUPS
一.共享打印机的设置 1.在http://www.openprinting.org/printer/HP/HP-LaserJet_1010检查打印机的支持情况,两个企鹅以上表示Mostly,支持大部分 ...
- java基础增强
Eclipse使用: java Compile配置的是java编译环境 java Build path配置的是java运行环境 运行环境的版本必须高于编译环境的版本.否则报错 工程上 右键--prop ...
- MFC笔记<持续更新>
1.设置垂直滚动条的位置在末尾 SCROLLINFO si; GetScrollInfo(SB_VERT, &si, SIF_PAGE | SIF_RANGE | SIF_POS); si.f ...