Устройство Samsung возвращает неверный путь к файлу изображения

Я использую следующие фрагменты кода для сохранения изображения, снятого пользователем на устройстве:

private void createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    image.mkdirs();

    // Save a file: path for use with ACTION_VIEW intents
    cameraFilePath = "file://" + image.getAbsolutePath();
}

private void saveImageToGallery(Context context) {

    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    mediaScanIntent.setData(Uri.parse(cameraFilePath));
    context.sendBroadcast(mediaScanIntent);

}

Это нормально работает для большинства устройств, хотя некоторые Samsung (Galaxy S5, S3) ведут себя странно; мой метод createImageFile создает следующий путь:

 file:///storage/emulated/0/Pictures/JPEG_20150701_131442_-1853613631.jpg

но изображение сохраняется на устройстве по следующим путям:

/storage/emulated/legacy/Pictures/JPEG_20150701_131442_-1853613631.jpg

и

/storage/sdcard0/Pictures/JPEG_20150701_114009_-1853613631.jpg

Я делаю что-то принципиально неправильное здесь? Или это просто Samsung не следует стандарту?


person fweigl    schedule 01.07.2015    source источник
comment
вы тестировали на эмуляторе?   -  person Haresh Chhelana    schedule 01.07.2015
comment
Работает на эмуляторе так же как и на всех устройствах кроме самсунга.   -  person fweigl    schedule 01.07.2015
comment
Путь хранения будет изменен в зависимости от внутренней или внешней памяти на различных устройствах.   -  person Haresh Chhelana    schedule 01.07.2015
comment
но изображение сохраняется на устройстве по следующим путям - как вы это определяете? Используете ли вы какой-либо файловый менеджер на устройстве или какой-то инструмент, внешний по отношению к устройству?   -  person CommonsWare    schedule 01.07.2015
comment
@CommonsWare Я только что осмотрелся с оболочкой adb.   -  person fweigl    schedule 01.07.2015


Ответы (1)


Пути, возвращаемые вашему процессу с помощью таких методов, как getExternalStoragePublicDirectory(), не обязательно должны совпадать с тем, что вы видите из мест за пределами вашего собственного приложения. Планшеты Android 4.2+ и телефоны Android 5.0+ поддерживают несколько пользователей. Каждый пользователь получает свой собственный набор каталогов, представляющих внутреннее и внешнее хранилище. Таким образом, ваш процесс получает пути, которые будут сопоставлены с «настоящими» путями файловой системы для любого пользователя, использующего ваше приложение. Детали этого процесса сопоставления зависят от производителя и устройства.

IOW, не беспокойтесь о несоответствии. Если ваше приложение нормально читает и пишет, и вы можете найти файлы, которые вы читаете и пишете, из внешних инструментов для целей отладки, все в порядке.

person CommonsWare    schedule 01.07.2015
comment
Спасибо за Ваш ответ. Дело в том, что мне нужно использовать этот путь к файлу для отображения сохраненного изображения с Пикассо, и Пикассо не найдет/не отобразит изображение для этого пути к файлу. - person fweigl; 01.07.2015
comment
@Ascorbin: Пикассо прекрасно находит файлы в getExternalStoragePublicDirectory(). Если у вас возникли проблемы с этим, задайте отдельный вопрос Stack Overflow, в котором объясните, как вы помещаете изображения в getExternalStoragePublicDirectory(), как вы пытаетесь прочитать эти изображения из getExternalStoragePublicDirectory() с помощью Picasso и с какими конкретными проблемами вы сталкиваетесь. - person CommonsWare; 01.07.2015
comment
Хорошо, спасибо. Возможно, вы можете взглянуть на новый вопрос? stackoverflow.com/questions/31242161/ - person fweigl; 06.07.2015