Tengo algunos requisitos para proteger algunos datos confidenciales. Los datos se descargan en formato PDF desde una URL y se guarda como un archivo privado de aplicaciones usando el siguiente código:¿VER INTENTO desde un URI del proveedor de contenido?
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;
}
Ahora, lo que me gustaría hacer es cambiar esto usando Context.MODE_PRIVATE y crear un ContentProvider para que mi aplicación tenga control total sobre el uso compartido de este archivo en un lector de PDF como Adobe Reader. es posible? Actualmente uso un código como el siguiente para pasar el URI del informe al lector de PDF configurado actualmente.
// 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);
¿Funcionaría lo mismo a través de un URI de ContentProvider? Un contenido: // paquete/tipo de archivo URI? Voy a probar un pequeño pico mañana para ver si puedo, pero si alguien sabe que solo el archivo: // URI está permitido, sería realmente útil.
ACTUALIZACIÓN
pude resolver mi problema satisfactoriamente mediante la aplicación de una subclase ContentProvider con el siguiente método anulado:
@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);
}
Entonces, cuando me llamas más allá de la intención de ver, se reescribe algo como lo siguiente:
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);
Y en mi caso, uso Adobe Reader, que implementa correctamente la carga desde content://
URI.
Muchas gracias. Tengo la intención de pasar la mañana trabajando en una prueba de concepto para ver si los archivos PDF 'content: // 'son aceptados por los lectores de PDF que uso habitualmente. Yo tampoco sabía sobre este uso del 'PackageManager', así que tendré una lectura al respecto. – Thorinside
Sí, parece que eso es lo que está sucediendo.Eché un vistazo a la 'fuente' de Adobe Reader para ver si usará un Resolver contenido en el caso de un 'VIEW content: // Intent' y parece que realmente lo hará. Estoy tratando de descubrir ahora por qué mi ContentProvider no está siendo devuelto. – Thorinside
Bien, acabo de descubrir que tengo que anular el método openFile en mi instancia de ContentProvider para interceptar la solicitud de Adobe Reader para el flujo de entrada. Estoy animado – Thorinside