web-dev-qa-db-fra.com

Oreo DocumentsContract.getDocumentId (uri) renvoie le chemin au lieu de Long

J'essaie d'obtenir le vrai chemin d'un fichier stocké dans le Android (je teste sur un émulateur avec Android 8.1)

voici mon code:

final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);

Pour les versions antérieures de Android 8.0, La variable id contient une valeur long afin que la ligne suivante fonctionne comme prévu.

Sur Android 8 La variable id contient un chemin comme celui-ci raw:/storage/emulated/0/Download/my_file.pdf, Donc le casting Long.valueOf(id)) lance un 'Java.lang.NumberFormatException' Exception.

Des idées? Merci.

17
Ale

Si le même problème l'avait résolu en procédant comme suit.

final String id = DocumentsContract.getDocumentId(uri);
if (!TextUtils.isEmpty(id)) {
            if (id.startsWith("raw:")) {
                return id.replaceFirst("raw:", "");
            }
            try {
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            } catch (NumberFormatException e) {
                 return null;
            }
      }

La solution a été trouvée dans un commentaire https://github.com/Yalantis/uCrop/issues/318

18
Tirth Shah