[英]Open downloaded file using intent
I make a retrofit call to my own API that provides me a list of files with the following content: 我对我自己的API进行了改装调用,它为我提供了一个包含以下内容的文件列表:
[
{
"name": "Example_file.jpg",
"ext": "jpg",
"b64": "data in base 64 format"
}
]
I show this list of files using a recycler view. 我使用Recycler视图显示这个文件列表。 When I click on one element from recycler view, I decode the base64 content and generate a file like the following: 当我从回收站视图中单击一个元素时,我解码base64内容并生成如下文件:
val content = Base64.getDecoder().decode(file.getB64()!!.toByteArray())
val os = FileOutputStream(getExternalStorageDirectory().path + file.getName(), true)
os.write(content)
os.flush()
os.close()
After this is complete, I would like to open this file using the Android file manager. 完成后,我想使用Android文件管理器打开此文件。
How can I force to open that stored file? 如何强制打开存储的文件?
If you meant opening by the default file opener for that file type you can use the method below. 如果您打算通过该文件类型的默认文件打开器打开,则可以使用以下方法。
[I found this solution on this site a long ago, I don't have the original link to that answer] [我很久以前在这个网站上找到了这个解决方案,我没有这个答案的原始链接]
public void openFile(File file, Context context) {
Uri url = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (url.toString().contains(".doc") || url.toString().contains(".docx")) {
// Word document
intent.setDataAndType(url, "application/msword");
} else if (url.toString().contains(".pdf")) {
// PDF file
intent.setDataAndType(url, "application/pdf");
} else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) {
// Powerpoint file
intent.setDataAndType(url, "application/vnd.ms-powerpoint");
} else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) {
// Excel file
intent.setDataAndType(url, "application/vnd.ms-excel");
} else if (url.toString().contains(".zip") || url.toString().contains(".rar")) {
// WAV audio file
intent.setDataAndType(url, "application/x-wav");
} else if (url.toString().contains(".rtf")) {
// RTF file
intent.setDataAndType(url, "application/rtf");
} else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) {
// WAV audio file
intent.setDataAndType(url, "audio/x-wav");
} else if (url.toString().contains(".gif")) {
// GIF file
intent.setDataAndType(url, "image/gif");
} else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) {
// JPG file
intent.setDataAndType(url, "image/jpeg");
} else if (url.toString().contains(".txt")) {
// Text file
intent.setDataAndType(url, "text/plain");
} else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") || url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) {
// Video files
intent.setDataAndType(url, "video/*");
} else {
//if you want you can also define the intent type for any other file
//additionally use else clause below, to manage other unknown extensions
//in this case, Android will show all applications installed on the device
//so you can choose which application to use
intent.setDataAndType(url, "*/*");
}
try {
if (file.exists())
context.startActivity(Intent.createChooser(intent, "Open"));
else
Toast.makeText(context, "File is corrupted", Toast.LENGTH_LONG).show();
} catch (Exception ex) {
Toast.makeText(context, "No Application is found to open this file.\nThe File is saved at" + Constant.DIRECTORY, Toast.LENGTH_LONG).show();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.