gpt4 book ai didi

android - 使用 Android 使用 Microsoft Office 移动应用程序以编辑模式打开本地文件

转载 作者:行者123 更新时间:2023-12-02 03:01:41 26 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,我想从中启动 MS office 应用程序来查看和编辑 office 文件。例如,打开存储在设备本地的docx,以便在MS-Word 移动应用程序中进行编辑。

以前我们打开这样的文件时,文件 URI 是在 Intent 中传递的,例如“com.microsoft.office.word”包名称。该文件将在 Word for Android 中打开,用户可以对其进行编辑和保存。没问题。

现在我们必须进行更改,以便我们使用 FileProvider class of Android具有读写权限。通过此实现,其他应用程序可以编辑文件,但适用于 Android 的 Microsoft Office 应用程序以只读模式打开,无法更改它。

这似乎是其他人也会遇到的常见问题,如其他 stackoverflow 问题所示:

When using Android file provider, files don't have correct permissions despite FLAG_GRANT_WRITE_URI_PERMISSION being flagged in intent

Xamarin.Forms Android FileProvider: GrantWriteUriPermission not always working

我也找到了这个 link with information about how to invoke the office apps in msdn , 但它似乎很不完整,我无法使其与 Intent 和本地文件一起工作(我只是不知道如何发送 ms-word:ofe|u|file 以便它识别它,它总是提示找不到文件)。

有谁知道如何使用 FileProvider 从 Android 版 Microsoft Office 中的 Android 应用程序以编辑模式打开本地文件?

我没有发布任何代码,因为它没有问题。任何其他应用都可以正常工作,但 Microsoft Office 应用除外。

最佳答案

我写了一个通用的打开例程,然后像下面这样分解了各个文件类型。执行以下操作后,我没有遇到任何问题。希望这会有所帮助。 (注意 - 我只添加了调用这个词 - 但使用此处 SO 文章中的类型(What is a correct mime type for docx, pptx etc?)

public static Java.IO.File CopyDocuments(Java.IO.File source, string realName)
{

//string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments); <-- old method
string path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
if (!System.IO.Directory.Exists(Path.Combine(path, "appname")))
System.IO.Directory.CreateDirectory(Path.Combine(path, "appname"));

string dbPath = Path.Combine(path,"appname", realName);
Java.IO.File destination = new Java.IO.File(dbPath);

try
{
//if (destination.Exists())
// destination.Delete();

if (!destination.Exists())
{
using (FileStream fs = new FileStream(source.AbsolutePath, FileMode.Open, FileAccess.Read))
{
using (var br = new BinaryReader(fs))
{
using (var bw = new BinaryWriter(new FileStream(dbPath, FileMode.Create)))
{
byte[] buffer = new byte[2048];
int length = 0;
while ((length = br.Read(buffer, 0, buffer.Length)) > 0)
{
bw.Write(buffer, 0, length);
}
}
}
}
}

return destination;
}
catch (Exception ex)
{
Toast.MakeText(Xamarin.Forms.Forms.Context, "Error Copying: " + ex.Message, ToastLength.Long).Show();
}
return null;
}

public void LaunchApp(string fileLocation, string realName)
{
var file = new Java.IO.File(fileLocation);

if (!file.Exists())
return;

file = CopyDocuments(file, realName);

Intent intent = null;
var extension = System.IO.Path.GetExtension(fileLocation).ToLower();

switch (extension)
{
case ContentService.DocxExtension:
intent = ReturnWord(file, true);
break;
case ContentService.DocExtension:
intent = ReturnWord(file, false);
break;
case ContentService.TxtExtension:
case PlayerLync.Services.ContentService.RtfExtension:
intent = ReturnText(file);
break;
case ContentService.XlsExtension:
intent = ReturnExcel(file, false);
break;
case ContentService.XlsxExtension:
intent = ReturnExcel(file, true);
break;
case ContentService.PPExtension:
intent = ReturnPowerPoint(file, false);
break;
case ContentService.PPXExtension:
intent = ReturnPowerPoint(file, true);
break;
case ContentService.Mp3Extension:
//contentType = ContentType.Audio;
break;
default:
//contentType = ContentType.Unknown;
break;
}

try
{
Xamarin.Forms.Forms.Context.StartActivity(intent);
}
catch (Exception ex)
{
... log error
}
}

private Intent ReturnWord(Java.IO.File file, bool isEx)
{
var intent = new Intent(Intent.ActionView);
Android.Net.Uri uri = FileProvider.GetUriForFile(Xamarin.Forms.Forms.Context, "your_package.fileprovider", file);// --> old method Android.Net.Uri.FromFile(file); //
intent.AddFlags(ActivityFlags.GrantReadUriPermission);
intent.AddFlags(ActivityFlags.GrantWriteUriPermission);
intent.AddFlags(ActivityFlags.GrantPersistableUriPermission);
intent.PutExtra(Intent.ExtraStream, uri);
if (!isEx)
{
intent.SetDataAndType(uri, "application/vnd.msword");
}
else
{
intent.SetDataAndType(uri, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
}
return intent;
}

将这一切放在 Android 项目中并做一个自定义渲染器以从 Xamarin Forms 访问它

关于android - 使用 Android 使用 Microsoft Office 移动应用程序以编辑模式打开本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45505243/

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