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 因为商业原因,产品出 ...
随机推荐
- python解决接口测试获取手机验证码问题
最近在做接口测试的时候遇到一个问题,就是有个很重要的接口要用到手机短信验证码,而其他接口都依赖于这个验证码,如果没有短信验证码就不能进行下面接口的测试,所以为了定时的验证线上的接口是否正常,而且又不修 ...
- vmware 命令行启动虚拟机
在redhat enterprise 5.3安装了vmware workstation,如何用vmware 命令行启动指定虚拟机?/usr/bin/vmware[root@node0 ~]# /usr ...
- Java编译成功,用java 运行class时出现错误解决方法
java -classpath class file's address; filename
- 1.Java为什么能跨平台运行?请简述原理
因为它有虚拟机(JVM),JAVA程序不是直接在电脑上运行的,是在虚拟机上进行的,每个系统平台都是有自己的虚拟机(JVM),所以JAVA语言能跨平台. 1, java代码不是直接运行在CPU上,而是运 ...
- viewpager处理(二):设置当前item时,让viewpager不出现滑动动画
我们在使用viewpager.setCurrentItem(position);的时候,viewpager出现滑动动画,如何去掉这个动画呢? 可以用viewpager.setCurrentItem(p ...
- textarea内容太多, 鼠标点击全部显示
strRight+="<td bordercolor='#DEDEDE' width='500px' height='50'><div title='"+data ...
- wifi的UI控制。打不开UI
部分主要是您要清楚WiFi作为什么功能,即WiFi是仅仅作为station功能,还是要开启p2p功能,当WiFi作为station功能时候开启的是wpa_supplicant服务,当WiFi作为p2p ...
- Zabbix3.0 客户端搭建
zabbix客户端安装 我们这边使用编译安装 软件包版本 zabbix-3.0.3.tar.gz 添加用户组 #groupadd zabbix #useradd -s /sbin/nologin -g ...
- Django urls常用匹配语法
url from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', vi ...
- SQL语句创建access表
CREATE TABLE Persons(ID AutoIncrement primary key,Id_P int NOT NULL,LastName varchar(255) NOT NULL,s ...