2016-12-10 69 views
1

ローカルストレージからメディアファイル(.docx、.xlsx、pptx、.png、.bmp、.aviなど)を開く必要があります。モバイルアプリケーションのXamarin.Formsを使用Xamarin.Forms - ローカルストレージに保存されているファイルを開く方法

私たちはアプリケーション内でファイルを開く必要はありません。ちょうど、そのファイルタイプを開くためにデバイス内のそれぞれのアプリケーションを呼び出す必要があります。

私たちは試しました: Device.OpenUri(new Uri("https://www.w3.org/TR/PNG/iso_8859-1.txt"))ただし、テキストファイルがブラウザで開いています。これらのファイルをアプリケーションで開くか、ファイルを開くアプリケーションを選択するウィンドウが表示されます。

注:Windows用のXamarin.Forms、Android用の& iOSアプリケーションを使用しています。このリンクは、あなたが答えを取得する場合

+2

あなたはすべてのプラットフォームで同じ経験を取得することができなくなります。 Androidについては、インテントを参照してください。 iOS(そして私もWindowsと思う)ではカスタムURLスキームを見ています。しかし、特にAppleは、どの他のアプリケーションがデバイス上にあるかを検出するための厳しいポリシーを実施しています。だから、いくらか努力するでしょう。私はストレスを与えたいと思います。共有コードの方法でこれを行うつもりはありません –

答えて

0

は、以下を参照してください。 https://forums.xamarin.com/discussion/52724/handling-a-file-open-with-or-share-options

あなたはこのためにDependecyServiceを使用する必要があります。ここに私のソリューションです:

//Interface in PCL 
public interface IDocumentViewer 
{ 
void ShowDocumentFile(string filepaht, string mimeType); 
} 

//Android 
[assembly: Dependency(typeof(DocumentViewer_Droid))] 

namespace YourApp.Droid 
{ 
public class DocumentViewer_Droid : IDocumentViewer 
{ 
    public void ShowDocumentFile(string filepath, string mimeType 
    { 
     var uri = Android.Net.Uri.Parse("file://" + filepath); 
     var intent = new Intent(Intent.ActionView); 
     intent.SetDataAndType(uri, mimeType); 
     intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask); 

     try 
     { 
      Forms.Context.StartActivity(Intent.CreateChooser(intent, "Select App")); 
     } 
     catch(Exception ex) 
     { 
      //Let the user know when something went wrong 
     } 
    } 
} 
} 

//iOS 
[assembly: Dependency(typeof(DocumentViewer_iOS))] 

namespace.YourApp.iOS 
{ 
public class DocumentViewer_iOS : IDocumentViewer 
{ 
    public void ShowDocumentFile(string filepath, string mimeType) 
    { 
     var fileinfo = new FileInfo(filepath); 
     var previewController = new QLPreviewController(); 
     previewController.DataSource = new PreviewControllerDataSource(fileinfo.FullName, fileinfo.Name); 

     UINavigationController controller = FindNavigationController(); 

     if(controller != null) 
     { 
      controller.PresentViewController((UIViewController)previewController, true, (Action)null); 
     } 
    } 

    private UINavigationController FindNavigationController() 
    { 
     foreach(var window in UIApplication.SharedApplication.Windows) 
     { 
      if(window.RootViewController.NavigationController != null) 
      { 
       return window.RootViewController.NavigationController; 
      } 
      else 
      { 
       UINavigationController value = CheckSubs(window.RootViewController.ChildViewControllers); 
       if(value != null) 
       { 
        return value; 
       } 
      } 
     } 
    } 

    private UINavigationController CheckSubs(UIViewController[] controllers) 
    { 
     foreach(var controller in controllers) 
     { 
      if(controller.NavigationController != null) 
      { 
       return controller.NavigationController; 
      } 
      else 
      { 
       UINavigationController value = CheckSubs(controller.ChildViewControllers) 
       if(value != null) 
       { 
        return value; 
       } 
      } 

      return null; 
     } 
    } 
} 

public class DocumentItem : QLPreviewItem 
{ 
    private string _title; 
    private string _uri; 

    public DocumentItem(string title, string uri) 
    { 
     _title = title; 
     _uri = uri; 
    } 

    public override string ItemTitle 
    { get { return _title; } } 

    public override NSUrl ItemUrl 
    { get { return NSUrl.FromFilename(_uri)); } }    
} 

public class PreviewControllerDataSource : QLPreviewControllerDataSource 
{ 
    private string _url; 
    private string _filename; 

    public PreviewControllerDataSource(string url, string filename) 
    { 
     _url = url; 
     _filename = filename; 
    } 

    public override IQLPreviewItem GetPreviewItem(QLPreviewController controller, nint index) 
    { 
     return (IQLPreviewItem)new DocumentItem(_filename, _url); 
    } 

    public override nint PreviewItemCount(QLPreviewController controller) 
    { return (nint)1; } 
} 
} 
関連する問題