У меня есть некоторые требования для защиты некоторых конфиденциальных данных. Данные загружаются в формате PDF из URL-адреса и сохранен как частный файл приложения с использованием следующего кода:
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 и создать ContentProvider, чтобы мое приложение полностью контролировало совместное использование этот файл в программу для чтения PDF, например Adobe Reader. Возможно ли это? В настоящее время я использую следующий код для передачи URI отчета в настроенную программу чтения 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);
Будет ли то же самое работать с URI типа ContentProvider? URI типа content: // package / fileid? Завтра я попробую сделать небольшой всплеск, чтобы посмотреть, смогу ли я, но если кто-нибудь знает, что разрешены только URI file: //, это было бы действительно полезно.
ОБНОВЛЕНИЕ
Я смог удовлетворительно решить свою проблему путем реализации подкласса 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: //
URI.