2017-08-04 6 views
1

私は、オフィスのファイルを表示および編集するためのMSオフィスアプリを起動するAndroidアプリを開発しています。たとえば、MS-Wordモバイルアプリで編集用にデバイスにローカルに保存されているdocxを開きます。Androidを使用してMicrosoft Officeモバイルアプリで編集モードでローカルファイルを開く

以前は、ファイルURIをインテントで渡したファイルを開いていました。 "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をも発見しましたしかし、それは非常に不完全なようだと私はそれが意図とローカルファイル(私はちょうどms - wordを送信する方法を知らない:or | |ファイルを認識するようにすることができませんでしたそれは、それは常にそれがファイルを見つけることができないと文句を言う)。

誰かがFileProviderを使用してAndroid用Microsoft Officeのアンドロイドアプリから編集モードでローカルファイルを開く方法を知っていますか?

私はそれが問題ではないので、コードを掲載していません。他のアプリは正常に動作しますが、Microsoft Officeアプリは正常に動作します。

答えて

0

私は共通のオープンルーチンを書いて、以下のような個々のファイルタイプを見つけました。私は次のことをした後に問題はなかった。うまくいけば、これは役に立ちます。 (注 - 私は単語の呼び出しを追加した - しかし、このすべてのAndroidプロジェクトに置き

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

ここでSOの記事(What is a correct mime type for docx, pptx etc?)から型を使用し、Xamarinは

フォームからアクセスするためのカスタムレンダラを行います
関連する問題