Using UIDocumentPickerViewController in Xamarin forms as a dependency service

Hello Guys, You can use following code for picking any type of documents to mention in code using iOS Devices-


use follwing interface:

public interface IMedia
{
 Task<string> OpenDocument();
 }


 public Task<string> OpenDocument()
    {

        var task = new TaskCompletionSource<string>();
        try
        {
            OpenDoc(GetController(), (obj) =>
            {
                if (obj == null)
                {
                    task.SetResult(null);
                    return;
                }
                var aa = obj.AbsoluteUrl;
                task.SetResult(aa.Path);
            });
        }
        catch (Exception ex)
        {
            task.SetException(ex);
        }
        return task.Task;
    }

    static Action<NSUrl> _callbackDoc;

    public static void OpenDoc(UIViewController parent, Action<NSUrl> callback)
    {
        _callbackDoc = callback;
        var version = UIDevice.CurrentDevice.SystemVersion;
        int verNum = 0;
        Int32.TryParse(version.Substring(0, 2), out verNum);

        var allowedUTIs = new string[]
        {
        UTType.UTF8PlainText,
        UTType.PlainText,
        UTType.RTF,
        UTType.PNG,
        UTType.Text,
        UTType.PDF,
        UTType.Image,
        UTType.Spreadsheet,
        "com.microsoft.word.doc",
        "org.openxmlformats.wordprocessingml.document",
        "com.microsoft.powerpoint.ppt",
        "org.openxmlformats.spreadsheetml.sheet",
        "org.openxmlformats.presentationml.presentation",
        "com.microsoft.excel.xls",

        };

        // Display the picker
        var pickerMenu = new UIDocumentMenuViewController(allowedUTIs, UIDocumentPickerMode.Import);
        pickerMenu.DidPickDocumentPicker += (sender, args) =>
        {
            if (verNum < 11)
            {
                args.DocumentPicker.DidPickDocument += (sndr, pArgs) =>
                {
                    UIApplication.SharedApplication.OpenUrl(pArgs.Url);
                    pArgs.Url.StopAccessingSecurityScopedResource();

                    var cb = _callbackDoc;
                    _callbackDoc = null;
                    pickerMenu.DismissModalViewController(true);
                    cb(pArgs.Url.AbsoluteUrl);
                };
            }
            else
            {
                args.DocumentPicker.DidPickDocumentAtUrls += (sndr, pArgs) =>
                {
                    UIApplication.SharedApplication.OpenUrl(pArgs.Urls[0]);
                    pArgs.Urls[0].StopAccessingSecurityScopedResource();

                    var cb = _callbackDoc;
                    _callbackDoc = null;
                    pickerMenu.DismissModalViewController(true);
                    cb(pArgs.Urls[0].AbsoluteUrl);
                };
            }
            // Display the document picker
            parent.PresentViewController(args.DocumentPicker, true, null);
        };

        pickerMenu.ModalPresentationStyle = UIModalPresentationStyle.Popover;
        parent.PresentViewController(pickerMenu, true, null);
        UIPopoverPresentationController presentationPopover = pickerMenu.PopoverPresentationController;
        if (presentationPopover != null)
        {
            presentationPopover.SourceView = parent.View;
            presentationPopover.PermittedArrowDirections = UIPopoverArrowDirection.Down;
        }
    }

Now you need to call using following code:

var filePath = await DependencyService.Get<IMedia>().OpenDocument();

For pick document in Android, you can use following code

  public class IntentHelper
 {

  public const int DocPicker = 101;
  static Action<string> _callback;
  public static async void ActivityResult(int requestCode, Result resultCode, Intent data)
{  if (requestCode == RequestCodes.DocPicker)
    {
        if (data.Data == null)
        {
            _callback(null);
        }
        else
        {
            var destFilePath = FilePath.GetPath(CurrentActivity, data.Data);
            _callback(destFilePath);
        }
    }
}

 public static Activity CurrentActivity
{
    get
    {
        return (Xamarin.Forms.Forms.Context as MainActivity);
    }
}

 public static void OpenDocPicker(Action<string> callback)
{
    _callback = callback;
    var intent = new Intent(Intent.ActionOpenDocument);
    intent.AddCategory(Intent.CategoryOpenable);
    intent.SetType("*/*");
    CurrentActivity.StartActivityForResult(intent, RequestCodes.DocPicker);
}
}

For pick document in Android, you can use following code:

public class IntentHelper
{
    public const int DocPicker = 101;
    static Action<string> _callback;

    public static async void ActivityResult(int requestCode, Result resultCode, Intent data)
    {

        if (requestCode == RequestCodes.DocPicker)
        {
            if (data.Data == null)
            {
                _callback(null);
            }
            else
            {
                var destFilePath = FilePath.GetPath(CurrentActivity, data.Data);
                _callback(destFilePath);
            }
        }
    }

    public static Activity CurrentActivity
    {
        get
        {
            return (Xamarin.Forms.Forms.Context as MainActivity);
        }
    }


    public static void OpenDocPicker(Action<string> callback)
    {
        _callback = callback;
        var intent = new Intent(Intent.ActionOpenDocument);
        intent.AddCategory(Intent.CategoryOpenable);
        intent.SetType("*/*");
        CurrentActivity.StartActivityForResult(intent, RequestCodes.DocPicker);
    }
}

Use below code to access the helper class: public class Media:

IMedia {
    public Task<string> OpenDocument() { 
        var task = new TaskCompletionSource<string>(); 
        try {            
            IntentHelper.OpenDocPicker((path) => { task.SetResult(path); }); 
        } catch (Exception ex) {  
            task.SetResult(null); 
        } 
        return task.Task; 
    } 
}