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,我想你甚至不需要文件提供者。谢谢你的帮助,找到了它!我刚开始对这些创新感到困惑。我认为只能从内部存储目录
进行访问。