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