gpt4 book ai didi

android - 为什么我不能在 Android N+ 中附加文件?

转载 作者:行者123 更新时间:2023-11-29 16:33:13 26 4
gpt4 key购买 nike

我正在开发一个将一些 HTML 表格导出为附件的应用程序。我注意到,如果我尝试将 HTML 表格附加到 Gmail、Google Drive 或 Android N+ 中的任何电子邮件提供商,我的代码将不起作用,但它可以将文件上传到 OneDrive、WhatsApp、Skype 等。没有任何问题。

这是我当前的代码:

Intent share = new Intent(Intent.ActionSend);
share.SetType("text/html");
share.AddFlags(ActivityFlags.NewDocument);

var file = CreateDirFile($"Meeting_{DateTime.Now.ToString("dd_MM_yyyy_HH_mm_ss")}.html");

try
{
FileOutputStream fout = new FileOutputStream(file);
fout.Write(System.Text.Encoding.ASCII.GetBytes($"<!DOCTYPE html><html><body><table><tr><td>1</td><td>2</td><td>3</td></tr></table></body></html>"));
fout.Close();
}
catch
{
Toast.MakeText(context, context.GetString("Please check your storage configuration.").Show();
}

if (Build.VERSION.SdkInt < BuildVersionCodes.N)
{
share.PutExtra(Intent.ExtraStream, Android.Net.Uri.FromFile(file.AbsoluteFile));
}
else
{
share.AddFlags(ActivityFlags.GrantReadUriPermission);
share.PutExtra(Intent.ExtraStream, Android.Net.Uri.Parse(file.Path));
}
share.PutExtra(Intent.ExtraSubject, $"Meeting {DateTime.Now.ToString("dd-MM-yyyy")}");
context.StartActivity(Intent.CreateChooser(share, "Email:"));

CreateDirFile 函数:

private Java.IO.File CreateDirFile(string fileName)
{
string root = null;
if (Android.OS.Environment.IsExternalStorageEmulated)
{
root = Android.OS.Environment.ExternalStorageDirectory.ToString();
}
else
{
root = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
}

Java.IO.File myDir = new Java.IO.File($"{root}/Meetings");
myDir.Mkdir();

Java.IO.File file = new Java.IO.File(myDir, fileName);

if (file.Exists())
{
file.Delete();
file.CreateNewFile();
}

return file;
}

我已经测试了很多组合,甚至应用了以下代码 Android.Net.Uri.Parse(file.Path) 因为它在 SO 或其他论坛的不同答案中被建议,但它没有按预期工作。

你们有遇到过类似的问题吗?你知道我应该改变什么吗?提前致谢。

最佳答案

没有尝试此代码,但它应该可以工作。至少它对我有用很多次。

在您的 onCreate 方法中尽早添加此代码。

if(Build.VERSION.SDK_INT >= 24){
try{
Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
m.invoke(null);
} catch (Exception e){
e.printStackTrace();
}
}

此代码的作用是禁用 android api 版本 24 及更高版本中的严格模式文件 uri 规则。此代码用于强制将 FileProvider 用于旨在通过公共(public) URI 对象共享包含文件的对象的应用程序。事实证明,大多数时间和其他许多时间一样,这是不必要的。

关于android - 为什么我不能在 Android N+ 中附加文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53581004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com