猿问
下载APP

以编程方式安装/卸载APK(PackageManager vs意图)

以编程方式安装/卸载APK(PackageManager vs意图)

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

公共抽象字符串getInstallerPackageName(StringPackageName)-检索安装包的应用程序的包名。这将识别该软件包来自哪个市场。

现行方法

使用意向安装APK

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

使用意图卸载APK:

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

这显然不是Android Market安装/卸载软件包的方式。他们使用更丰富版本的PackageManager。这可以通过从AndroidGit存储库下载Android源代码来看到。下面是两个与意图方法相对应的隐藏方法。不幸的是,外部开发人员无法使用它们。但也许他们会在未来?

更好的方法

使用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

差异

  • 当使用意图时,本地包管理器不知道安装来自哪个应用程序。具体来说,getInstallerPackageName(.)返回NULL。

  • 隐藏方法安装包(.)将安装程序包名称作为参数,并且最有可能设置此值。

问题

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

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


犯罪嫌疑人X
浏览 88回答 3
3回答

www说

这目前不适用于第三方应用程序。请注意,即使使用反射或其他技巧来访问installPackage()也没有帮助,因为只有系统应用程序才能使用它。(这是因为它是低级别的安装机制,在用户批准权限之后,所以常规应用程序访问它是不安全的。)另外,installPackage()函数参数在平台版本之间经常发生更改,因此您尝试访问的任何操作都将在平台的其他版本上失败。编辑:此外,值得指出的是,这个安装程序包是最近才添加到平台上的(2.2?)最初并不是用来跟踪谁安装了这款应用程序-它被平台用来确定在使用该应用程序报告bug时该启动谁,以及用于实现Android反馈。(这也是API方法参数更改的次数之一。)至少在推出之后很长一段时间里,Market仍然没有使用它来跟踪它已经安装的应用程序(而且它很可能仍然不使用它),而是使用它来设置Android反馈应用程序(与Market分离)作为“所有者”来处理反馈。

德玛西亚99

Android P+在AndroidManifest.xml中需要此权限。<uses-permission&nbsp;android:name="android.permission.REQUEST_DELETE_PACKAGES"&nbsp;/>然后:Intent&nbsp;intent&nbsp;=&nbsp;new&nbsp;Intent(Intent.ACTION_DELETE);intent.setData(Uri.parse("package:com.example.mypackage"));startActivity(intent);卸载。似乎更容易.。

千万里不及你

API 14级引入了两个新的操作:动作安装包和动作卸载包..这些动作允许你通过额外返回结果额外布尔值,以获得(Un)安装结果通知。调用卸载对话框的示例代码:String&nbsp;app_pkg_name&nbsp;=&nbsp;"com.example.app";int&nbsp;UNINSTALL_REQUEST_CODE&nbsp;=&nbsp;1;Intent&nbsp;intent&nbsp;=&nbsp;new&nbsp;Intent(Intent.ACTION_UNINSTALL_PACKAGE);&nbsp; &nbsp;intent.setData(Uri.parse("package:"&nbsp;+&nbsp;app_pkg_name));&nbsp;&nbsp;intent.putExtra(Intent.EXTRA_RETURN_RESULT,&nbsp;true); &nbsp;startActivityForResult(intent,&nbsp;UNINSTALL_REQUEST_CODE);并在活动#onActivityResult方法:@Overrideprotected&nbsp;void&nbsp;onActivityResult(int&nbsp;requestCode,&nbsp;int&nbsp;resultCode,&nbsp;Intent&nbsp;data)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;super.onActivityResult(requestCode,&nbsp;resultCode,&nbsp;data); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(requestCode&nbsp;==&nbsp;UNINSTALL_REQUEST_CODE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(resultCode&nbsp;==&nbsp;RESULT_OK)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("TAG",&nbsp;"onActivityResult:&nbsp;user&nbsp;accepted&nbsp;the&nbsp;(un)install"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(resultCode&nbsp;==&nbsp;RESULT_CANCELED)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("TAG",&nbsp;"onActivityResult:&nbsp;user&nbsp;canceled&nbsp;the&nbsp;(un)install"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(resultCode&nbsp;==&nbsp;RESULT_FIRST_USER)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.d("TAG",&nbsp;"onActivityResult:&nbsp;failed&nbsp;to&nbsp;(un)install"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答