es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener la ruta del archivo PDF en Android 11 y 12.

He intentado mucho código para obtener la ruta del PDF en Android 11 o 12, pero solo funciona en dispositivos Android 10 o anteriores.
¿Me puedes ayudar, por favor? A continuación, comparto mi código de líneas.

Llamando al Intent de esta manera

Intent intent = new Intent();
intent.setType("application/pdf");
statusAdapter = "pdf";
pos = position;
intent.setAction(Intent.ACTION_GET_CONTENT);
someActivityResultLauncher.launch(Intent.createChooser(intent, "Seleccionar PDF"));
someActivityResultLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            // No hay códigos de solicitud
            Intent data = result.getData();
            if (data == null) {
                // error
                return;
            }
            try {
                final Uri pdfUri = data.getData();
                File pdfFile = new File(getPath(pdfUri));
                long length = pdfFile.length();
                length = length / 1024;
                Toast.makeText(CreateSubEventActivity.this, "Ruta del archivo: " + pdfFile.getPath() + ", tamaño del archivo: " + length + " KB", Toast.LENGTH_SHORT).show();
                // cargarArchivo(imageFile);
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(CreateSubEventActivity.this, "Algo salió mal", Toast.LENGTH_LONG).show();
            }
        }
    });

Llamando a getPath de esta manera

public String getPath(Uri uri) {
    String[] projection = {MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    if (cursor == null) return null;
    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String s = cursor.getString(columnIndex);
    cursor.close();
    return s;
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el código proporcionado utiliza MediaStore para obtener la ruta de un archivo PDF seleccionado, lo cual no funciona en Android 11 o 12 debido a los cambios de privacidad en estas versiones.

    Una solución para obtener la ruta de un archivo PDF seleccionado en Android 11 o 12 es utilizar ContentResolver y DocumentFile para acceder al archivo utilizando su URI. Aquí tienes un código actualizado para el método getPath:

    public String getPath(Context context, Uri uri) {
        String path = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
            try {
                ContentResolver contentResolver = context.getContentResolver();
                InputStream inputStream = contentResolver.openInputStream(uri);
                if (inputStream != null) {
                    File tempFile = File.createTempFile("sample", ".pdf", context.getExternalCacheDir());
                    FileOutputStream outputStream = new FileOutputStream(tempFile);
                    byte[] buffer = new byte[4 * 1024]; // u otro tamaño de buffer
                    int read;
                    while ((read = inputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, read);
                    }
                    outputStream.flush();
                    path = tempFile.getAbsolutePath();
                    inputStream.close();
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            String[] projection = {MediaStore.Images.Media.DATA};
            Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
            if (cursor != null) {
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                path = cursor.getString(column_index);
                cursor.close();
            }
        }
        return path;
    }
    

    Este código verifica la versión de Android y utiliza el método adecuado para obtener la ruta. En Android 11 o 12, crea un archivo temporal en el directorio de caché de la aplicación y copia el contenido del PDF en él, lo cual permite que la aplicación acceda al archivo. En versiones anteriores, utiliza MediaStore para obtener la ruta del archivo.

    ¡Espero que esto ayude!

Comments are closed.