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'.

Respuestas a la pregunta(3)

Su respuesta a la pregunta