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.

例如:

<application android:label="@string/app_name"

android:debuggable="true">

<activity android:name=".HelloJni"

                  android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

ActivityInfo:从 AndroidManifest.xml‘s <activity> and <receiver> tags得到的信息。

可以从这一项中得到和Activity有关的所有信息。这些内容都是从<activity>或<receiver>中得到。

例1:得到Activity各信息:
想要得到Activity信息,需要参数2设置为: PackageManager.GET_ACTIVITIES 

PackageInfo PI = PM.getPackageArchiveInfo("/data/hellojni.apk",PackageManager.GET_ACTIVITIES);

//PackageInfo中得到的PackageName

Log.w("3DiJoy", "PackageInfo . PackageName:" + PI.packageName); Log.w("3DiJoy", String.format("There are [%d] Activity", PI.activities.length));

Log.w("3DiJoy", String.format("Activity in Porcess Name: [%s]", PI.activities[0].processName));

//注意:此处第一次看到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 in Package PackageName:" + PI.activities[0].packageName);

//Activity Name:<activity android:name=".HelloJni"。中读取到的
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

Log.w("3DiJoy", "Appliction DataDir:" + PI.applicationInfo.dataDir);

Log.w("3DiJoy", "Application SourceDir:" + PI.applicationInfo.sourceDir);

//Log.w("3DiJoy", "Application JNI LIbdir:" + PI.applicationInfo.nativeLibraryDir);

Log.w("3DiJoy", "Application permission:" + PI.applicationInfo.permission);

Log.w("3DiJoy", "Application in porcessName is :" + PI.applicationInfo.processName);//(注2)

Log.w("3DiJoy", String.format("minSDK Version: [%d]", PI.applicationInfo.targetSdkVersion));

Log.w("3DiJoy", "Application Name:" + PI.applicationInfo.name);

Log.w("3DiJoy", "Application in Package " + PI.applicationInfo.packageName);

3.得到APK中版本信息:

//<manifest> tag‘s "name" attribute.
Log.w("3DiJoy", "PackageInfo . PackageName:" + PI.packageName);

Log.w("3DiJoy", "PackageInfo . Version String:" + PI.versionName);

Log.w("3DiJoy", String.format("Version code:[%d]", PI.versionCode));
分别从: <manifest> tag‘s versionCode attribute和 <manifest> tag‘s versionName attribute.中得到信息。


注1: 
ProcessName相关内容:
PI.activities[0].processName .它其实是activityInfo的父类: android.content.pm.ComponentInfo

的成员变量。是指此activity所运行的Process的名字。
此信息从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中取得ProcessName也为空。(PI.applicationInfo.processName)
但从Application中取得packageName却是正确的(PI.applicationInfo.packageName, 与PI.packageName相同)

注4:
getPackageArchiveInfo () 的参数1, archive 指的就是APK文件。

1)获取apk文件的图标

[java] view plaincopyprint?

  1. public static Drawable getApkFileIcon(String apkPath, Context context) {
  2. PackageManager pm = context.getPackageManager();
  3. PackageInfo info = pm.getPackageArchiveInfo(apkPath,
  4. PackageManager.GET_ACTIVITIES);
  5. if (info != null) {
  6. ApplicationInfo appInfo = info.applicationInfo;
  7. if (appInfo != null) {
  8. try {
  9. appInfo.publicSourceDir = apkPath;
  10. return pm.getApplicationIcon(appInfo);
  11. } catch (OutOfMemoryError e) {
  12. }
  13. }
  14. }
  15. return null;
  16. }

 

2)获取AndroidManifest.xml中<meta-data>标签中定义的值

[java] view plaincopyprint?

  1. PackageManager manager = this.getPackageManager();
  2. try {
  3. // 设置PackageManager.GET_META_DATA标识位是必须的
  4. PackageInfo info = manager.getPackageInfo(this.getPackageName(),
  5. PackageManager.GET_CONFIGURATIONS | PackageManager.GET_META_DATA);
  6. Object myChannel = info.applicationInfo.metaData.get("meta-data-key");
  7. if ((myChannel != null) && (myChannel instanceof Integer)) {
  8. // do something
  9. }
  10. } catch (NameNotFoundException e) {
  11. e.printStackTrace();
  12. }
时间: 2024-11-07 20:08:51

Android 下得到 未安装APK包含信息 等的相关文章

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

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

Android下实现静默安装指定APK

什么是静默安装?既是可以在不提示用户的情况下,进行APK的安装. 有的时候,根据业务需求,需要实现静默安装APK,但是Android提供的安装接口是需要提示用户的前提下安装. 以下提供一个静默安装的解决方案(通过执行命令行的方式实现,需ROOT权限): new Thread() { public void run() { Process process = null; OutputStream out = null; InputStream in = null; try { // 请求root

Linux-rpm命令-查看已安装软件包信息及未安装rpm包信息

博文说明[前言]: 本文将通过个人口吻介绍rpm命令,包括查看已安装软件包信息及未安装rpm包信息. 在目前时间点[2017年6月12号]下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容. 正文: RPM常用命令中的各种缩写选项,其实是有依据的,弄明白之后,其实很好玩,我们可以参考下方:q=queryp=packagei=infol=listf=filec=conf... 一:查看系统已

Android 8.0+ 更新安装apk失败的问题

最近做项目发现Android 8.0+ 更新安装apk时 出现安装失败的情况  总结原因是 缺少安装的权限 Android 8.0 (Android O)为了针对一些流氓软件引导用户安装其他无关应用.在应用权限设置的"特殊访问权限"中,加入了"安装其他应用"的设置. 简单的方法  可以直接在Manifest.xml中加入下面的权限:(亲测可用) <uses-permissionandroid:name="android.permission.REQU

我的Android进阶之旅------&gt;解决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_6476_official_debug.apk does not exist on disk. Error while Installing APK 如下图所示 2.解决方法 1.尝试了Build -> Clean Project再编译,还是无效 2.尝试重启Android Studio无效 然后我去打

Android 在代码中安装 APK 文件

废话不说,上代码 private void install(String filePath) { Log.i(TAG, "开始执行安装: " + filePath); File apkFile = new File(filePath); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >

Android手机提示&ldquo;未安装应用程序&rdquo;

用eclipse调试应用时,遇到了这个问题,网上给出的解决方案倒是挺多,但似乎一个都没奏效,而且我手机也重启了,还是有问题,郁闷ing-   然后看到一篇文章指出,可能不是签名和SD的卡问题,而是我们自己的AndroidManifest.xml有问题,然后我想了想,刚刚我似乎只改了这个,然后svn还原,一切正常了-   太吐血了,折腾一上午了- -!   参考: 关于android开发出现"你的手机上未安装应用程序"问题

android 入门-使用adb安装apk到多设备

我想用adb 安装apk 到设备上现在出现了2个. 提示我没有找到设备 安装不用进去adb shell 这是你存放apk文件夹路径 下面安装apk到手机上 下面安装apk到模拟器上 下面卸载apk

Android下得到APK包含信息

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