android– 以编程方式安装卸载APK(PackageManager vs Intents)

android– 以编程方式安装卸载APK(PackageManager vs Intents),第1张

概述我的应用程序安装其他应用程序,它需要跟踪它已安装的应用程序.当然,这可以通过简单地保留已安装的应用程序列表来实现.但这不应该是必要的!PackageManager应该负责维护installedBy(a,b)关系.事实上,根据API,它是:publicabstractStringgetInstallerPackageName(StringpackageNam

我的应用程序安装其他应用程序,它需要跟踪它已安装的应用程序.当然,这可以通过简单地保留已安装的应用程序列表来实现.但这不应该是必要的! PackageManager应该负责维护installedBy(a,b)关系.事实上,根据API,它是:

public abstract String getInstallerPackagename(String packagename) –
检索安装包的应用程序的包名称.这确定了包裹来自哪个市场.

目前的做法

使用Intent安装APK

Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(apkUri, "application/vnd.androID.package-archive");startActivity(intent);

使用Intent卸载APK:

Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package",getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packagename,null));startActivity(intent);

这显然不是例如AndroID Market安装/卸载软件包.他们使用更丰富的PackageManager版本.通过从AndroID Git存储库下载AndroID源代码可以看到这一点.以下是与Intent方法相对应的两种隐藏方法.不幸的是,外部开发人员无法使用它们.但也许他们将来会是这样?

更好的方法

使用PackageManager安装APK

/** * @hIDe *  * Install a package. Since this may take a little while, the result will * be posted back to the given observer.  An installation will fail if the calling context * lacks the {@link androID.Manifest.permission#INSTALL_PACKAGES} permission, if the * package named in the package file's manifest is already installed, or if there's no space * available on the device. * * @param packageURI The location of the package file to install.  This can be a 'file:' or a * 'content:' URI. * @param observer An observer callback to get notifIEd when the package installation is * complete. {@link IPackageInstallObserver#packageInstalled(String, int)} will be * called when that happens.  observer may be null to indicate that no callback is desired. * @param flags - possible values: {@link #INSTALL_FORWARD_LOCK}, * {@link #INSTALL_REPLACE_EXISTING}, {@link #INSTALL_ALLOW_TEST}. * @param installerPackagename Optional package name of the application that is performing the * installation. This IDentifIEs which market the package came from. */public abstract voID installPackage(        Uri packageURI, IPackageInstallObserver observer, int flags,        String installerPackagename);

使用PackageManager卸载APK

/** * Attempts to delete a package.  Since this may take a little while, the result will * be posted back to the given observer.  A deletion will fail if the calling context * lacks the {@link androID.Manifest.permission#DELETE_PACKAGES} permission, if the * named package cannot be found, or if the named package is a "system package". * (Todo: include pointer to documentation on "system packages") * * @param packagename The name of the package to delete * @param observer An observer callback to get notifIEd when the package deletion is * complete. {@link androID.content.pm.IPackageDeleteObserver#packageDeleted(boolean)} will be * called when that happens.  observer may be null to indicate that no callback is desired. * @param flags - possible values: {@link #DONT_DELETE_DATA} * * @hIDe */public abstract voID deletePackage(        String packagename, IPackageDeleteObserver observer, int flags);

差异

>使用意图时,本地程序包管理器不知道安装源自哪个应用程序.具体来说,getInstallerPackagename(…)返回null.
>隐藏方法installPackage(…)将安装程序包名称作为参数,并且很可能能够设置此值.

是否可以使用意图指定包安装程序名称?
(也许安装程序包的名称可以作为安装意图的额外添加?)

提示:如果要下载AndroID源代码,可以按照此处描述的步骤 *** 作:下载源树.要提取* .java文件并根据包层次结构将它们放在文件夹中,您可以查看这个简洁的脚本:View Android Source Code in Eclipse.

解决方法:

目前第三方应用程序无法使用此功能.请注意,即使使用反射或其他技巧来访问installPackage()也无济于事,因为只有系统应用程序才能使用它. (这是因为它是低级别的安装机制,在用户批准权限之后,因此常规应用程序无法安全访问.)

此外,installPackage()函数参数经常在平台版本之间发生更改,因此您尝试访问它的任何内容都将在该平台的各种其他版本上失败.

编辑:

另外值得指出的是,这个installerPackage最近才被添加到平台(2.2?),并且最初并未用于跟踪安装应用程序的用户 – 平台使用它来确定在报告错误时启动谁该应用程序,用于实现AndroID反馈. (这也是API方法参数发生变化的次数之一.)至少在推出它之后很长一段时间,Market仍然没有使用它来跟踪它已经安装的应用程序(它可能仍然没有使用它),但只是用它来设置AndroID反馈应用程序(与市场分开)作为“所有者”来处理反馈.

总结

以上是内存溢出为你收集整理的android – 以编程方式安装/卸载APK(PackageManager vs Intents)全部内容,希望文章能够帮你解决android – 以编程方式安装/卸载APK(PackageManager vs Intents)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1104399.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存