La longitud del archivo es 0 cuando se recrea el archivo desde URI o la ruta de archivo original [getExternalFilesDir (tipo de cadena) vs getFilesDir ()]
Primero un poco de historia: esta aplicación toma una foto y la carga en un almacenamiento de blobs de Azure.
La imagen se almacena en un archivo (almacenamiento interno) usandogetApplicationContext().getFilesDir();
Para cargar, necesito llamar a la función uploadFromFile (..) así:CloudBlockBlob.uploadFromFile(String path);
La función uploadFromFile del SDK de Azure tiene este aspecto:
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();
}
El problema está en juego.long fileLength = file.length();
donde fileLength es 0.
He probado esto contra el usoEnvironment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
para el directorio de almacenamiento. Esto funciona.
Necesito usar el almacenamiento interno frente al almacenamiento externo, ya que eso se requiere específicamente para este proyecto.
EDITAR: El AndroidExpediente La documentación no menciona nada sobre este comportamiento. Supongo que esto podría tener algo que ver con el uso del almacenamiento interno de la aplicación.
EDITAR: Agregar un código
Estoy enviando unExpediente mPhotoFile a la intención de mi cámara. Esto contendrá la foto. mPhotoFileUri contiene el URI para este archivo. A continuación se muestra el código para usar la ruta del archivo.
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
El siguiente es el código para obtener el archivo del 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
Tengo que pasar la ruta de este archivo a lauploadFromFile función.
Solución mencionada en mi 'respuesta'.