Javascript Android应用程序查看文档文件(';.docx';,';.pdf';…)

Javascript Android应用程序查看文档文件(';.docx';,';.pdf';…),javascript,android,react-native,Javascript,Android,React Native,我有一个为用户检索文件的应用程序,它进行api调用,然后返回指向该文件的链接。我的问题是,应用程序是否应该显示应用程序内部的文件,或者使用手机中的任何其他应用程序查看文件。如果应用程序显示文件,那么我应该使用什么?打开webview并使用google文档不是一个选项,因为它非常慢。另外,我使用的是react native,因此如果已经存在任何组件,那就太好了,否则我编写桥接器没有问题。您应该使用选项2。不要试着自己做每件事。询问系统是否存在可以打开文件的应用程序,如果不存在此类应用程序,则通知用

我有一个为用户检索文件的应用程序,它进行api调用,然后返回指向该文件的链接。我的问题是,应用程序是否应该显示应用程序内部的文件,或者使用手机中的任何其他应用程序查看文件。如果应用程序显示文件,那么我应该使用什么?打开webview并使用google文档不是一个选项,因为它非常慢。另外,我使用的是react native,因此如果已经存在任何组件,那就太好了,否则我编写桥接器没有问题。

您应该使用选项2。不要试着自己做每件事。询问系统是否存在可以打开文件的应用程序,如果不存在此类应用程序,则通知用户没有可打开文件的应用程序。你还可以提供一个链接,指向一个可能打开相关文件的应用程序

使用这种方法的重要部分是,您需要文件的mime类型,因为系统根据提供的类型进行决策。此外,您可能需要一个内容提供商,以便其他应用程序可以从您的沙箱中实际打开文件。幸运的是,该框架确实为这种情况提供了合适的解决方案。如果不将文件存储在应用程序目录中,则不需要提供程序

代码可能是这样的

File yourFile; //expecting the file to exist
String extension; //expecting the file extension (pdf, doc, ...) to exist
String mimetype; //may be null. You may obtain the mimetype from the server request in the http Content-Type header.
if (mimetype == null || mimetype.trim().isEmpty()) {
   //mimetype does no exist, try to guess mimetype from the extension
   mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
}
if (mimetype == null || mimetype.trim.isEmpty()) {
  //don't know what the mime type is. All we know is that it is a file we want to open.
  mimetype = "file/*";
}

Intent openFileIntent = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(yourFile)), mimetype);

if (openFileIntent.resolveActivity(getPackageManager()) != null) {
  this.startActivity(openFileIntent);
} else {
  Toast.makeText(this, R.string.no_application_can_open_file, Toast.LENGTH_SHORT).show();
}

但是,我的应用程序都是关于文件的,如果用户必须转到另一个应用程序来查看我为其提供链接的文件,那么它不会违背目的吗?不是真的。您仍在获取并显示指向用户的链接。这就是应用程序的工作,它应该做得很好。对于这样的用例,推荐的方法是授权其他应用程序显示链接的内容。看看其他应用程序,如文件管理器。您很少会发现一个实现可以自己完成所有事情。