【笔记】PackageManager获取App基本信息实现Apk导出、分享、卸载

隐约记得之前某个应用商场有个App分享的功能,这个应用分享不是发个下载链接地址,而是通过把本地App发送给其他用户的形式。这几天正好想给朋友发个工具App,但就是找不到这个功能的应用,网上也没找到这个工具App的下载链接(主要是自己也不知道之前从哪下载的了。。。)

获取已安装应用列表

        PackageManager packageManager = getPackageManager();
        List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES);

查看PackageInfo类,可以发现应用的包名、版本号、安装时间、应用签名,以及应用中Activity列表、广播列表、服务列表、需要的权限列表等都可以从该类直接获取。

  • public String packageName;//包名
  • public int versionCode;//版本号
  • public String versionName;//版本名称
  • public ApplicationInfo applicationInfo;//应用信息
  • public long firstInstallTime;//第一次安装时间
  • public long lastUpdateTime;//最后一次更新时间
  • public ActivityInfo[] activities;//应用Activity信息
  • public ActivityInfo[] receivers;//应用广播接收者信息
  • public ServiceInfo[] services;//应用服务信息
  • public ProviderInfo[] providers;//应用内容提供者信息
  • public String[] requestedPermissions;//应用使用的权限信息
  • public Signature[] signatures;//应用签名信息
  • ...

获取已安装应用时我们传了PackageManager.MATCH_UNINSTALLED_PACKAGES,传该值只能获取少量应用信息,Activity、Receiver、Service等信息取值只能获取到null。

PackageManager类里面包含很多标签,在PackageManager#getInstalledPackages里按需使用:

  • public static final int GET_ACTIVITIES = 0x00000001;//需要包含Activity信息
  • public static final int GET_RECEIVERS = 0x00000002;//需要包含广播接受者信息
  • public static final int GET_SERVICES = 0x00000004;//需要包含服务信息
  • public static final int GET_PROVIDERS = 0x00000008;//需要包含内容提供者
  • public static final int GET_SIGNATURES = 0x00000040;//需要包含签名
  • ...

注:如果应用比较大(例如:QQ),使用PackageManager.GET_META_DATA获取到的信息可能比较多会导致PackageManager对象died

实现应用分享

    private void shareApk(File file, String title) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_SEND);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType("application/vnd.android.package-archive");
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(Intent.createChooser(intent, title));
    }
文件分享很简单就是以上代码,问题是获取到获取到Apk的路径。

我们都知道App在安装完成之后在data目录下其实都有一个base.apk,这就是我们用于分享的apk路径,此时就需要用到PackageInfo里的ApplicationInfo了。

  • public String processName;//进程名称
  • public String className;//应用实现的Application类名
  • public String sourceDir;//base.apk路径
  • public String dataDir;//缓存路径
  • public String nativeLibraryDir;//JNI文件路径
  • ...

以下是一个查看App信息的简单案例




源码




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值