2

My app loads different types of files from my server to the device storage.

For all my files i want to open, i have the path of the files in the storage.

For .pdf-Files I am using a WebView which opens the .pdf-Files at the given path (for example) Therefore I split the path

var fileType = path.Split('.').Last().ToLower();

and if the fileType is pdf, I open the WebView.

For .docx, .xlsx, etc. files, I want my app to ask me, what program I want to use to open the file.

I do not want to open the file explorer (for example via an Intent.CreateChooser if you want to choose an image from the galerie)

I just know the path from a file in the storage, and I want to open this file directly.

I thought there would be a simple solution for Android Xamarin. However, I have not found anything working yet.

EDIT: Short & clear:

I have the path storage/emulated/0/MyApp/myFile.docx and I need a method that takes the path, detects if there are apps that can open this file, and if there are, asks me to choose an app to open the file.

Aiko West
  • 791
  • 1
  • 10
  • 30
  • `For .pdf-Files I am using a WebView which opens the .pdf-Files at the given path `. Impossible. A WebView cannot display a .pdf file. – greenapps Apr 06 '18 at 09:54
  • There should be something like Intent.ACTION_VIEW in Xamarin too. – greenapps Apr 06 '18 at 09:55
  • @greenapps you are right, the WebView cannot display a .pdf file. Since this is not the topic of this question, I wasn't going into detail how I display the pdf. But if someone is interested, I am using `webView.LoadUrl(string.Format("file:///android_asset/pdfjs/web/viewer.html?file={0}", pathTmp));` to open a PDF via WebView with just my given path of the file in the storage – Aiko West Apr 06 '18 at 10:08
  • `viewer.html` Interesting! A pdf to html convertor. Who wrote the source for that file? What is its secret? – greenapps Apr 06 '18 at 10:36
  • @greenapps No secrets :) https://stackoverflow.com/questions/11613505/how-to-open-local-pdf-file-in-webview-in-android?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa – Aiko West Apr 06 '18 at 10:46
  • Do you want to use a method to detect the apps only by the file's path? If so, 1) you need get the file's type ,2) open the file. – Robbit Apr 12 '18 at 09:06

1 Answers1

2

1) Use ActionView to open the file:

  private void openFile(File file)
    { 
        Intent intent = new Intent();
        intent.AddFlags(ActivityFlags.NewTask);
        intent.SetAction(Intent.ActionView);
        string type = getMIMEType(file);
        intent.SetDataAndType(Uri.FromFile(file), type);
        StartActivity(intent);
    }

2)Get the MIME type by file extension:

private string getMIMEType(File file)
{
    string type = "*/*";
    string fName = file.Name; 
    int dotIndex = fName.LastIndexOf(".");
    if (dotIndex < 0)
    {
        return type;
    }
    // get the file extension
    string end = fName.Substring(dotIndex, fName.Length).ToLower();
    if (end == "") return type;
    //from MIME_MapTable to get the respond type  
    for (int i = 0; i < MIME_MapTable.Length; i++)
    {
        if (end.Equals(MIME_MapTable[i,0]))
            type = MIME_MapTable[i,1];
    }
    return type;
}

3) Here is the MIME_MapTable array:

   public string[,] MIME_MapTable = new string[,] {

            {".3gp",    "video/3gpp"},
            {".apk",    "application/vnd.android.package-archive"},
            {".asf",    "video/x-ms-asf"},
            {".avi",    "video/x-msvideo"},
            {".bin",    "application/octet-stream"},
            {".bmp",      "image/bmp"},
            {".c",        "text/plain"},
            {".class",    "application/octet-stream"},
            {".conf",    "text/plain"},
            {".cpp",    "text/plain"},
            {".doc",    "application/msword"},
            {".exe",    "application/octet-stream"},
            {".gif",    "image/gif"},
            {".gtar",    "application/x-gtar"},
            {".gz",        "application/x-gzip"},
            {".h",        "text/plain"},
            {".htm",    "text/html"},
            {".html",    "text/html"},
            {".jar",    "application/java-archive"},
            {".java",    "text/plain"},
            {".jpeg",    "image/jpeg"},
            {".jpg",    "image/jpeg"},
            {".js",        "application/x-javascript"},
            {".log",    "text/plain"},
            {".m3u",    "audio/x-mpegurl"},
            {".m4a",    "audio/mp4a-latm"},
            {".m4b",    "audio/mp4a-latm"},
            {".m4p",    "audio/mp4a-latm"},
            {".m4u",    "video/vnd.mpegurl"},
            {".m4v",    "video/x-m4v"},
            {".mov",    "video/quicktime"},
            {".mp2",    "audio/x-mpeg"},
            {".mp3",    "audio/x-mpeg"},
            {".mp4",    "video/mp4"},
            {".mpc",    "application/vnd.mpohun.certificate"},
            {".mpe",    "video/mpeg"},
            {".mpeg",    "video/mpeg"},
            {".mpg",    "video/mpeg"},
            {".mpg4",    "video/mp4"},
            {".mpga",    "audio/mpeg"},
            {".msg",    "application/vnd.ms-outlook"},
            {".ogg",    "audio/ogg"},
            {".pdf",    "application/pdf"},
            {".png",    "image/png"},
            {".pps",    "application/vnd.ms-powerpoint"},
            {".ppt",    "application/vnd.ms-powerpoint"},
            {".prop",    "text/plain"},
            {".rar",    "application/x-rar-compressed"},
            {".rc",        "text/plain"},
            {".rmvb",    "audio/x-pn-realaudio"},
            {".rtf",    "application/rtf"},
            {".sh",        "text/plain"},
            {".tar",    "application/x-tar"},
            {".tgz",    "application/x-compressed"},
            {".txt",    "text/plain"},
            {".wav",    "audio/x-wav"},
            {".wma",    "audio/x-ms-wma"},
            {".wmv",    "audio/x-ms-wmv"},
            {".wps",    "application/vnd.ms-works"},  
            //{".xml",    "text/xml"},  
            {".xml",    "text/plain"},
            {".z",        "application/x-compress"},
            {".zip",    "application/zip"},
            {"",        "*/*"}

    };

Note:

If you want your app to run on >7.0, you need use FileProvider.

Robbit
  • 4,300
  • 1
  • 13
  • 29
  • thank for this answer, i was wrong! If you have installed more than 1 app, that is able to open for example .docx, than you will be asked, which app you want to use – Aiko West Apr 18 '18 at 11:43