2016-12-10 1 views
1

Нам нужно открыть файл MS office & (.docx, .xlsx, pptx, .png, .bmp, .mp4, .avi и т. Д.) Из локального хранилища мобильного приложения с использованием Xamarin.FormsXamarin.Forms - Как открыть файлы, хранящиеся в локальном хранилище

Нам не нужно открывать файл внутри приложения. Просто нам нужно вызвать соответствующее приложение в устройстве для открытия его типа файла.

Мы пробовали: Device.OpenUri(new Uri("https://www.w3.org/TR/PNG/iso_8859-1.txt")) однако текстовый файл открывается в браузере, мы хотим открыть эти файлы в своем приложении или, по крайней мере, должно появиться окно с просьбой выбрать приложение для открытия файла.

Примечание: Мы используем Xamarin.Forms для Windows, 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; } 
} 
} 
Смежные вопросы