admin管理员组

文章数量:1551505

介绍

  项目中需要引入腾讯手机管家做安全防护功能,因此需要检测用户手机是否安装了腾讯手机管家,以此来引导用户下载手机管家,这个功能其实也很简单。

首先需要拿到手机管家的包名,不用多说,包名是APP的唯一标识。

取得APP包名的方式有很多,但是个人感觉最方便的还是采用appt工具来对apk进行解析获得apk的详细信息。

aapt简介

aapt即Android Asset Packaging Tool,我们可以在SDK的platform-tools目录下找到该工具。aapt可以查看、 创建、 更新ZIP格式的文档附件(zip, jar, apk)。 也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具,但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序。

主要用法

下面的这个参数列表基本向我们展示了如何使用aapt以及aapt的基本功能了。

aapt l[ist]:列出资源压缩包里的内容。
aapt d[ump]:查看APK包内指定的内容。
aapt p[ackage]:打包生成资源压缩包。
aapt r[emove]:从压缩包中删除指定文件。
aapt a[dd]:向压缩包中添加指定文件。
aapt v[ersion]:打印aapt的版本。

我们关注aapt d[ump]命令参数的用法,这个命令用来查看APK指定的内容,values 参数指定了想要查看的内容

aapt d[ump] [--values] [--include-meta-data] WHAT file.{apk} [asset [asset ...]]
   strings          输出字符串资源
   badging          查看apk包的packageName、versionCode、applicationLabel、launcherActivity、permission等各种详细信息
   permissions      输出权限列表
    resources       输出资源列表
   configurations   输出configurations 配置项
   xmltree          以树形结构输出的xml信息。
   xmlstrings     输出xml文件中所有的字符串信息。

如下图所示,我们拿到了app的包名 com.tencent.qqpimsecure

判断APP是否安装

PackageManager类用来获取当前安装在设备上的所有应用的各种信息。
SDK 说明如下:

/* Class for retrieving various kinds of information related to
the application * packages that are currently installed on the
device. * * You can find this class through {@link
Context#getPackageManager}. */

其中getInstalledPackages方法可以返回设备所有已安装的所有packages信息,参数为过滤条件,此处我们不需要对返回信息做过滤,传入0即可。

  /**
     * Return a List of all packages that are installed
     * on the device.
     */
    public abstract List<PackageInfo> getInstalledPackages(int flags);

通过PackageManager可以拿到系统安装所有的APP 的 PackageInfo 列表,PackageInfo 封装了一个app所有的信息,其实就是在APP安装过程中,系统通过解析AndroidManifest.xml文件 拿到APP信息并封装保存在PackageInfo中的。

以下是PackageInfo的SDK 说明:

/* Overall information about the contents of a package. This
corresponds * to all of the information collected from
AndroidManifest.xml. */

其中成员变量packageName表示应用的包名。

 /**
     * The name of this package.  From the &lt;manifest&gt; tag's "name"
     * attribute.
     */
    public String packageName;

了解了这些,我们可以写代码了。
代码如下:


 public static boolean isAppInstalled(Context context, String packageName) {
        final PackageManager packageManager = context.getPackageManager();
        //取得所有的PackageInfo
        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
        List<String> pName = new ArrayList<>();
        if (pinfo != null) {
            for (int i = 0; i < pinfo.size(); i++) {
                String pn = pinfo.get(i).packageName;
                pName.add(pn);
            }
        }
        //判断包名是否在系统包名列表中
         return pName.contains(packageName);

利用DownLoadManager下载

如果尚未安装指定的应用,则应该从网络下载并安装应用。一个完整的下载服务需要考虑如下一些问题:

  1. 网络通信模块编写
  2. 用户网络类型判断,是否允许移动网络下载
  3. 断点续传或进度控制,中间暂停之后,之后可以继续下载
  4. 下载进度条展示
  5. 文件保存I/O操作
  6. 下载完成进行安装

总之 一个下载模块需要考虑的问题还是很多的,有时候还要做很多适配工作,例如 你通过通知栏进度条展示下载进度,往往在不同的机器上得到形形色色的UI 展示,你还得费心费力去做适配,的确很坑,实际上,我们只需要一个下载服务就可以了。

  从Android 2.3(API level 9)开始,Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作。Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成。

在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支持

本文标签: androidapp