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.
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"},
{"", "*/*"}
};
If you want your app to run on >7.0, you need use FileProvider.