使用外部Android应用程序安全地打开文件,而无需将文件复制到外部存储器

使用外部Android应用程序安全地打开文件,而无需将文件复制到外部存储器,android,security,file-io,android-sdcard,Android,Security,File Io,Android Sdcard,我正在做一个安全的应用程序,用户可以在手机上浏览一些文件并打开它们。所以现在,我的应用程序非常安全,文件加密良好,但我有一个重大突破。事实上,我正在使用我的应用程序打开不同类型(pdf、doc、txt、jpg等)的用户安全文件,因此我正在使用用户手机上的外部应用程序打开它们。但我的问题在这里,因为要让另一个应用程序打开这些文件,我需要为我想要使用的应用程序提供一个Android存储位置 下面是我现在正在使用的代码: Intent intent = new Intent(); intent.set

我正在做一个安全的应用程序,用户可以在手机上浏览一些文件并打开它们。所以现在,我的应用程序非常安全,文件加密良好,但我有一个重大突破。事实上,我正在使用我的应用程序打开不同类型(pdf、doc、txt、jpg等)的用户安全文件,因此我正在使用用户手机上的外部应用程序打开它们。但我的问题在这里,因为要让另一个应用程序打开这些文件,我需要为我想要使用的应用程序提供一个Android存储位置

下面是我现在正在使用的代码:

Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
File fileToOpen = new File(activity.getExternalCacheDir().getAbsolutePath() + 
    "/" + fileName);

MimeTypeMap mime = MimeTypeMap.getSingleton();
String extension = fileToOpen.getName().substring(
        fileToOpen.getName().lastIndexOf(".") + 1);
String type = mime.getMimeTypeFromExtension(extension);
intent.setAction(Intent.ACTION_VIEW);

intent.setDataAndType(Uri.fromFile(fileToOpen), type);

Manager.getActivity().startActivityForResult(intent,
        ExplorerActivity.FILE_CLOSED_SUCCESSFULLY);
因此,正如您在我的代码中所看到的,我需要将真实文件存储到缓存目录中以打开它,因此如果小偷有权访问用户电话,它可以将真实文件打开到该目录中,这样我的应用程序就不再安全了。 当然,我会在用户关闭并加密后立即删除这个普通文件,但删除并不意味着该文件会从手机上完全删除。在删除之前,我用一些空字节重写,但这还不足以安全地删除这个文件

所以现在,我想从你们那里得到的是一个实现我想要做的事情的想法:打开一个文件而不将其存储到Android硬盘中

以下是我得到的一些线索:

  • 用我自己的应用程序打开文件(但实现起来很困难,因为文件类型太多了,我真的不喜欢开发已经存在的东西)
  • 找到一种在不将文件存储在我的应用程序外部的情况下打开该文件的解决方案(我的意思是直接使用该文件的字节数组打开该文件)
  • 将文件存储到手机RAM中(我不知道是否可能)

因此,这是一份非详尽的清单,任何其他建议都将不胜感激。如果你能为我提出的解决方案提供任何帮助,请不要犹豫。请毫不犹豫地告诉我我的想法是否完全不可能或错误。

您是否尝试过自己的
contentProvider
,它覆盖了
openFile
,因此您可以打开应用程序专用的文件,然后返回其他应用程序可以访问的
filedescriptor
,谢谢您的回答,我将立即检查此线索,并将结果告知您。我对您提出的解决方案有一个问题。如果我很了解contentProvider的概念,您需要创建一个共享数据库,我将在其中放置敏感文件。但是这个数据库是安全的吗?我的意思是,小偷有没有办法通过读取手机硬盘从数据库中检索数据?你不需要数据库。对于您的contentprovider,不要实现更新、查询、删除方法,只需实现文件打开方法即可。所以,就像传递文件uri一样,传递自己的ContentProviderURI。所以它和你的文件一样安全。但是你永远无法保证根电话的安全性虽然可以实现
openFile()
而不需要文件系统中的实际文件,但我还没有找到这样做的例子。Nandeesh ok谢谢@commonware ok,但是你认为我可以用另一种方式来做我想做的事情吗?如果没有,我将尝试成为第一个在文件系统中没有文件的情况下实现openFile()方法。