Android 以编程方式从同一应用程序本身安装更新的Apk。[更新Apk]
我正在使用以下代码从我的应用程序安装应用程序Android 以编程方式从同一应用程序本身安装更新的Apk。[更新Apk],android,apk,android-install-apk,Android,Apk,Android Install Apk,我正在使用以下代码从我的应用程序安装应用程序 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/InstallTest.apk")), "application/vnd.android.package-archive"); intent.s
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/InstallTest.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
让上面代码的包为com.xyz.one。
现在,如果我使用上述代码安装任何其他软件包应用程序,那么它就可以正常工作。
但是,如果我为同一应用程序的更新apk版本(即com.xyz.one)尝试相同的代码,那么它会给出“解析包时出现问题”
有人请帮助我如何从同一个应用程序本身以编程方式安装apk
注意:我的更新apk存在于外部存储器中
谢谢您是否尝试过使用该操作 您可以使用它直接启动应用程序安装程序,并使用一些参数来控制apk文件和安装选项
(
EXTRA\u INSTALLER\u PACKAGE\u NAME
,EXTRA\u NOT\u UNKNOWN\u SOURCE
,EXTRA\u ALLOW\u REPLACE
,以及EXTRA\u RETURN\u RESULT
)您尝试过使用该操作吗
您可以使用它直接启动应用程序安装程序,并使用一些参数来控制apk文件和安装选项
(
EXTRA\u INSTALLER\u PACKAGE\u NAME
,EXTRA\u NOT\u UNKNOWN\u SOURCE
,EXTRA\u ALLOW\u REPLACE
,以及EXTRA\u RETURN\u RESULT
)下面的代码对我来说很好,我想你可能会错过文件://前缀
下面的代码对我来说很好,我想你可能会错过文件://前缀
如果您在电话中有本地文件,或者您可以通过编程方式下载:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(
Uri.fromFile(
new File(Environment.getExternalStorageDirectory() + "/download/" + "NameOfFille.apk")
), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
如果您在电话中有本地文件,或者您可以通过编程方式下载:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(
Uri.fromFile(
new File(Environment.getExternalStorageDirectory() + "/download/" + "NameOfFille.apk")
), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
关于通过文件下载更新Android应用程序,有太多的问题,而且已经发生了太多的变化,所以我觉得在这一点上进行更新是很好的,就是这样 该代码已经在安卓O及以上版本、安卓N及以下版本和所有作品上进行了测试 在清单文件中,要支持Android O及以上版本,您需要
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
以及真正起作用的代码:
private fun checkAndroidVersionAndInstallApk() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (MyApplication.context.packageManager.canRequestPackageInstalls()) {
installApk()
} else {
startActivityForResult(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:${requireContext().packageName}")), INSTALL_PACKAGES_REQUESTCODE)
}
} else {
installApk()
}
}
private fun installApk() {
val intent = Intent(Intent.ACTION_VIEW)
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val contentUri = FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.FileProvider", File(appUpdateApk))
intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
} else {
intent.setDataAndType(Uri.fromFile(File(appUpdateApk)), "application/vnd.android.package-archive")
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
requireContext().startActivity(intent)
requireActivity().finish()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
logInfo("VersionCheckFragment::onActivityResult: $requestCode")
when (requestCode) {
INSTALL_PACKAGES_REQUESTCODE -> checkAndroidVersionAndInstallApk()
else -> {
}
}
}
关于通过文件下载更新Android应用程序,有太多的问题,而且已经发生了太多的变化,所以我觉得在这一点上进行更新是很好的,就是这样 该代码已经在安卓O及以上版本、安卓N及以下版本和所有作品上进行了测试 在清单文件中,要支持Android O及以上版本,您需要
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
以及真正起作用的代码:
private fun checkAndroidVersionAndInstallApk() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (MyApplication.context.packageManager.canRequestPackageInstalls()) {
installApk()
} else {
startActivityForResult(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:${requireContext().packageName}")), INSTALL_PACKAGES_REQUESTCODE)
}
} else {
installApk()
}
}
private fun installApk() {
val intent = Intent(Intent.ACTION_VIEW)
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val contentUri = FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.FileProvider", File(appUpdateApk))
intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
} else {
intent.setDataAndType(Uri.fromFile(File(appUpdateApk)), "application/vnd.android.package-archive")
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
requireContext().startActivity(intent)
requireActivity().finish()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
logInfo("VersionCheckFragment::onActivityResult: $requestCode")
when (requestCode) {
INSTALL_PACKAGES_REQUESTCODE -> checkAndroidVersionAndInstallApk()
else -> {
}
}
}
您尝试过手动安装apk吗?@DhavalPatel是手动安装,正在安装。您尝试过手动安装apk吗?@DhavalPatel是手动安装,正在安装。是,我已经尝试过,但似乎不起作用。是,我已经尝试过,但似乎不起作用。
private fun checkAndroidVersionAndInstallApk() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (MyApplication.context.packageManager.canRequestPackageInstalls()) {
installApk()
} else {
startActivityForResult(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:${requireContext().packageName}")), INSTALL_PACKAGES_REQUESTCODE)
}
} else {
installApk()
}
}
private fun installApk() {
val intent = Intent(Intent.ACTION_VIEW)
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val contentUri = FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.FileProvider", File(appUpdateApk))
intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
} else {
intent.setDataAndType(Uri.fromFile(File(appUpdateApk)), "application/vnd.android.package-archive")
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
requireContext().startActivity(intent)
requireActivity().finish()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
logInfo("VersionCheckFragment::onActivityResult: $requestCode")
when (requestCode) {
INSTALL_PACKAGES_REQUESTCODE -> checkAndroidVersionAndInstallApk()
else -> {
}
}
}