Как получить путь к файлу из uri содержимого в android pie

#android #nullpointerexception #path #uri #android-9.0-pie

#Android #исключение nullpointerexception #путь #uri #android-9.0-pie

Вопрос:

Я пытаюсь загрузить изображение с помощью retrofit 2.0. После получения uri в onActivityResult я пытаюсь получить путь из uri, который выдает null. Тот же код отлично работает на устройствах до выпуска lollipop.

 String[] filePathColumn = { MediaStore.Image.Media.DATA };
Cursor cursor = context.getContentResolver().query(inputUri,
                filePathColumn, null, null, null);
if (cursor != null) {
   cursor.moveToFirst();
   int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
   String filePath = cursor.getString(columnIndex);
   cursor.close();
// filePath is always null
   if (filePath != null amp;amp; !filePath.isEmpty()) {
       file = new File(filePath);
   }
}
  

Комментарии:

1. Вы добавили разрешения для манифеста?

2. прочитайте эту статью android.jlelse.eu / …

3. @AntonisRadz Да. Я включил разрешения. Я уже использовал inputstream раньше, и он работал. Для перехода к модернизации я решил использовать этот подход, но он не работает.

4. @Mr.Bunny Я делаю все, что указано в статье. Раньше я использовал входной поток для получения файла. Теперь решил получить его из uri, и для этого использую указанную выше функцию, которая не работает.

Ответ №1:

Вот полностью рабочий код для получения последнего снимка от контент-провайдера, работающего со всеми API:

       public ArrayList<String> getNewPicturesUri(JobParameters parameters) {
    ArrayList<String> newPictures = new ArrayList<>();

    if (parameters.getTriggeredContentAuthorities() != null) {
        if (parameters.getTriggeredContentUris() != null) {
            ArrayList<String> ids = new ArrayList<>();
            for (Uri uri : parameters.getTriggeredContentUris()) {
                List<String> path = uri.getPathSegments();
                if (path != null amp;amp; path.size() ==
                        Media.EXTERNAL_CONTENT_URI.getPathSegments().size()   1) {
                    ids.add(path.get(path.size() - 1));
                }
            }

            if (ids.size() > 0) {
                StringBuilder selection = new StringBuilder();
                for (int i = 0; i < ids.size(); i  ) {
                    if (selection.length() > 0) {
                        selection.append(" OR ");
                    }
                    selection.append(MediaStore.Images.ImageColumns._ID);
                    selection.append("='");
                    selection.append(ids.get(i));
                    selection.append("'");
                }

                Cursor cursor = null;
                try {
                    String[] projection = new String[]{
                            MediaStore.Images.ImageColumns._ID,
                            MediaStore.Images.ImageColumns.DATA};

                    cursor = getContentResolver().query(
                            Media.EXTERNAL_CONTENT_URI,
                            projection, selection.toString(), null, null);

                    if (cursor != null) {
                        while (cursor.moveToNext()) {
                            newPictures.add(cursor.getString(PROJECTION_DATA));
                        }
                    }
                } catch (SecurityException exception) {
                    FirebaseCrash.report(exception);
                } finally {
                    if (cursor != null) {
                        cursor.close();
                    }
                }
            }
        }
    }
    return newPictures;
}
  

Комментарии:

1. Можете ли вы сказать мне, что такое выделение. toSrting() при получении курсора. Передал его как null, снова получил ту же ошибку.

2. Я обновил ответ. Я использую этот метод в службе заданий, чтобы получать уведомления о новых изображениях в телефоне. Надеюсь, это может вам помочь

3. Где я должен использовать inputUri, который я получил после выбора файла с устройства?

4. не могли бы вы, пожалуйста, рассказать всю ситуацию, зачем вам это нужно, и опубликовать больше кода

5. Я нашел проблему. Кажется, что с помощью ContentResolver мы не можем получить путь напрямую. Необходимо скопировать в кэш, а затем сделать это.