Длина файла равна 0 при воссоздании файла из URI или исходного пути к файлу [getExternalFilesDir (тип String) против getFilesDir ()]
Сначала немного истории: это приложение делает снимок и загружает его в хранилище BLOB-объектов Azure.
Картинка хранится в файле (внутреннее хранилище) с помощьюgetApplicationContext().getFilesDir();
Для загрузки мне нужно вызвать функцию uploadFromFile (..) следующим образом:CloudBlockBlob.uploadFromFile(String path);
Функция uploadFromFile в Azure SDK выглядит следующим образом:
public void uploadFromFile(final String path) throws StorageException, IOException {
uploadFromFile(path, null /* accessCondition */, null /* options */, null /* opContext */);
}
public void uploadFromFile(final String path, final AccessCondition accessCondition, BlobRequestOptions options,
OperationContext opContext) throws StorageException, IOException {
File file = new File(path);
long fileLength = file.length();
InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
this.upload(inputStream, fileLength, accessCondition, options, opContext);
inputStream.close();
}
Вопрос на линииlong fileLength = file.length();
где fileLength равно 0.
Я проверил это против использованияEnvironment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
для каталога хранения. Это работает.
Мне нужно использовать внутреннее хранилище против внешнего хранилища, так как это специально требуется для этого проекта.
РЕДАКТИРОВАТЬ: Androidфайл в документации ничего не говорится об этом поведении. Я предполагаю, что это может быть связано с использованием внутреннего хранилища приложения.
РЕДАКТИРОВАТЬ: Добавление некоторого кода
Я отправляюфайл mPhotoFile для моей камеры намерения. Это будет содержать фотографию. mPhotoFileUri содержит URI для этого файла. Ниже приведен код для использования пути из файла.
File file = new File(mPhotoFile.getPath()); // value -> /data/user/0/com.example.devpactapp/files/JPEG_20160209_234929_1936823724.jpg
boolean fileExists = file.exists(); // true
long fileLength = file.length(); // length 0
Ниже приведен код для получения файла из URI.
File file = new File(mPhotoFileUri.getPath()); // value -> /data/user/0/com.example.devpactapp/files/JPEG_20160209_235534_-1059496729.jpg
boolean fileExists = file.exists(); // true
long fileLength = file.length(); // length 0
Я должен передать путь этого файлаuploadFromFile функция.
Обходной путь упомянут в моем «ответе».