从一个内容提供商的URI意图?

我有一些要求保护一些敏感数据。 数据从URL下载为PDF,并使用以下代码保存为应用程序专用文件:

public File downloadPDF(final Context fileContext, Uri reportUri, final String fileName) { try { HttpGet get = new HttpGet(reportUri.toString()); File file = httpClient.execute(get, new ResponseHandler<File>() { @Override public File handleResponse(HttpResponse response) throws ClientProtocolException, IOException { if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { response.getEntity().writeTo(fileContext.openFileOutput(fileName, Context.MODE_WORLD_READABLE)); return fileContext.getFileStreamPath(fileName); } return null; } }); return file; } catch (IOException e) { Log.e(TAG, "Unable to download report.", e); } return null; } 

现在,我想要做的是将其改为使用Context.MODE_PRIVATE并创build一个ContentProvider,以便我的应用程序可以完全控制将此文件共享到PDF阅读器(如Adobe Reader)。 这可能吗? 我目前使用如下代码将报告URI传递给当前configuration的PDF阅读器。

  // Fire up a PDF viewer intent for the URL. Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(uri, "application/pdf"); startActivity(intent); 

通过一个ContentProvidertypes的URI会一样吗? 内容:// package / fileidtypes的URI? 明天我会试一试,看是否可以,但是如果有人知道只允许file:// URI的话,那将是非常有用的。


UPDATE

我能够满意地解决我的问题,通过重写以下方法来实现ContentProvider子类:

 @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { // The filename is the path in the URI without the initial slash. String fileName = uri.getPath().substring(1); File file = getContext().getFileStreamPath(fileName); return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); } 

然后,当我将观看意图点燃时,它被重写成如下所示:

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.withAppendedPath(Uri.parse("content://providername/"),filePath); intent.setData(uri); startActivity(intent); 

在我的情况下,我使用Adobe Reader,正确地实现从content://加载content:// URI。

Solutions Collecting From Web of "从一个内容提供商的URI意图?"

通过一个ContentProvidertypes的URI会一样吗? 内容:// package / fileidtypes的URI?

这应该。 你需要让你的ContentProvidergetType()返回application/pdf 。 而且,有些PDF阅读器可能无法处理content:// Uri值。

你可以做的是使ContentProvider ,然后使用PackageManager来看看是否有什么能理解你的ACTION_VIEW Intentcontent:// Uri 。 如果有什么反应,你就设置好了。 如果没有,您可以退回到使文件是世界可读的,并使用您当前的实施。 或者,因为将文件更改为世界可读可能会很痛苦,您可以尽早运行testing(例如,当您的应用程序启动时),并使用您的ContentProvider支持的一些废料Uri ,以便您知道在执行此操作时应采用哪条path您的下载。

没有内容提供者不保护文件

实际上,一个应用程序可能会对来自内容提供者的文件做的第一件事是在其caching目录中创build一个临时副本。 我想你应该重新审视这个。