隐约记得之前某个应用商场有个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信息的简单案例