Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 以编程方式从同一应用程序本身安装更新的Apk。[更新Apk]_Android_Apk_Android Install Apk - Fatal编程技术网

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 -> {
        }
    }
}