Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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
Java 如何在Android 10中以编程方式从未知源更新应用程序_Java_C#_Android_Xamarin.android - Fatal编程技术网

Java 如何在Android 10中以编程方式从未知源更新应用程序

Java 如何在Android 10中以编程方式从未知源更新应用程序,java,c#,android,xamarin.android,Java,C#,Android,Xamarin.android,在版本android 10之前,我通过DownloadManager下载该应用程序来更新它,并通过Intent在StartActivity中运行它来安装它。但在安卓10中,这种方法不再有效。我发现只有一个例子使用了PackageManager,但不幸的是没有任何效果。在输出OnNewIntent上,我总是得到结果-PackageInstallStatus.FailureInvalid。该示例被重新设计为从请求的http流记录到会话中,并从文件记录到原始会话中。但这没有问题,我从文件中尝试了它。它

在版本
android 10
之前,我通过
DownloadManager
下载该应用程序来更新它,并通过
Intent
StartActivity
中运行它来安装它。但在安卓10中,这种方法不再有效。我发现只有一个例子使用了
PackageManager
,但不幸的是没有任何效果。在输出
OnNewIntent
上,我总是得到结果-
PackageInstallStatus.FailureInvalid
。该示例被重新设计为从请求的http流记录到会话中,并从文件记录到原始会话中。但这没有问题,我从文件中尝试了它。它真的有用吗?也许有一些特点?我还获得安装软件包的权限

void WebUpdateApk()
    {
        Action update = async () =>
        {
            if (PackageManager.CanRequestPackageInstalls() == true)
            {
                var packageInstaller = PackageManager.PackageInstaller;
                var sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall);
                int sessionId = packageInstaller.CreateSession(sessionParams);
                var session = packageInstaller.OpenSession(sessionId);

                try
                {
                    var url = "http://mywebsite.com/getapk.php?apk=myapp.apk";
                    var httpResponse = await new HttpClient().GetAsync(url, HttpCompletionOption.ResponseContentRead);
                    try
                    {
                        if (httpResponse.StatusCode == System.Net.HttpStatusCode.OK)
                        {
                            Stream input = await httpResponse.Content.ReadAsStreamAsync();
                            try
                            {
                                var packageInSession = session.OpenWrite("package", 0, -1);
                                try
                                {
                                    if (input != null)
                                    {
                                        input.CopyTo(packageInSession);
                                    }
                                    else
                                    {
                                        throw new Exception("Inputstream is null");
                                    }
                                }
                                finally
                                {
                                    packageInSession.Close();
                                }
                            }
                            finally
                            {
                                input.Close();
                            }
                        }
                    }
                    catch { }
                    finally
                    {
                        httpResponse.Dispose();
                    }
                }
                catch { }

                Intent intent = new Intent(Application.Context, Class);
                intent.SetAction("SESSION_API_PACKAGE_INSTALLED");
                PendingIntent pendingIntent = PendingIntent.GetActivity(this, 0, intent, 0);
                IntentSender statusReceiver = pendingIntent.IntentSender;
                session.Commit(statusReceiver);
            }
            else
            {
                Toast.MakeText(this, "No Package Installer Permission", ToastLength.Long).Show();
            }
        };
        if (PackageManager.CanRequestPackageInstalls() == false)
        {
            RestartActivity = update;
            StartActivity(new Intent(Android.Provider.Settings.ActionManageUnknownAppSources,
                Android.Net.Uri.Parse("package:" + Android.App.Application.Context.PackageName)));
        }
        else update();
    }
    protected override void OnNewIntent(Intent intent)
    {
        Bundle extras = intent.Extras;
        if ("SESSION_API_PACKAGE_INSTALLED".Equals(intent.Action))
        {
            var status = extras.GetInt(PackageInstaller.ExtraStatus);
            var message = extras.GetString(PackageInstaller.ExtraStatusMessage);
            switch (status)
            {
                case (int)PackageInstallStatus.PendingUserAction:
                    // Ask user to confirm the installation
                    var confirmIntent = (Intent)extras.Get(Intent.ExtraIntent);
                    StartActivity(confirmIntent);
                    break;
                case (int)PackageInstallStatus.Success:
                    //TODO: Handle success
                    break;
                case (int)PackageInstallStatus.Failure:
                case (int)PackageInstallStatus.FailureAborted:
                case (int)PackageInstallStatus.FailureBlocked:
                case (int)PackageInstallStatus.FailureConflict:
                case (int)PackageInstallStatus.FailureIncompatible:
                case (int)PackageInstallStatus.FailureInvalid:
                case (int)PackageInstallStatus.FailureStorage:
                    //TODO: Handle failures
                    break;
            }
            Toast.MakeText(this, "OnNewIntent status = " + status.ToString(), ToastLength.Long).Show();
        }
    }

我不理解你的代码,也不知道它与新的意图有什么关系,但在Android 10设备上,我可以像以前一样安装/更新带有ACTION_VIEW和提供apk文件的文件提供商的应用程序。如果无法访问外部存储,如何下载apk文件?从应用程序存储库中,我无法使用“操作”视图安装/更新应用程序。我不知道应用程序存储库是什么意思。您可以下载到GetFileDir()(但不带DownloadManagwr)和GetExternalFileDir(null),而无需任何权限。
如果无法访问外部存储,如何下载apk文件?
您的应用程序不需要下载管理器提供的功能。如果你使用从管理者那里获得的uri,我想你甚至不需要文件提供者。谢谢你的帮助,找到了它!我刚开始对这些创新感到困惑。我认为只能从
内部存储目录
进行访问。