La longitud del archivo es 0 al recrear el archivo desde URI, o filepath original

Un poco de fondo primero: esta aplicación toma una foto y carga en un almacenamiento de bloques de Azure.

La imagen se almacena en un archivo (almacenamiento interno) utilizando getApplicationContext().getFilesDir();

Para cargar, necesito llamar a la función uploadFromFile (..) de la siguiente manera: 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 la línea long fileLength = file.length(); Donde la longitud del archivo es 0.

He probado esto contra el uso de Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); Para el directorio de almacenamiento. Esto funciona.

Tengo que utilizar el almacenamiento interno vs almacenamiento externo ya que se requiere específicamente para este proyecto.

EDIT: La documentación de Android File no menciona nada sobre este comportamiento. Estoy asumiendo que esto podría ser algo que ver con el uso de la aplicación de almacenamiento interno.

EDIT: Añadir un código

Estoy enviando un Archivo mPhotoFile a mi intención de cámara. Esto contendrá la foto. MPhotoFileUri contiene el URI para este archivo. A continuación se muestra el código para utilizar 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 

A continuación se muestra el código para obtener el archivo de la 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 acceso de este archivo a la función uploadFromFile .

Solución mencionada en mi "respuesta".

A pesar de que no tengo toda la información, voy a hacer la llamada que falta el archivo de la ruta que has dado. El javadoc de length () menciona específicamente este caso devolverá 0.

Así que intenta comprobar existe () antes de hacer nada con el archivo.

Mientras utiliza el almacenamiento interno, la ruta del archivo es diferente. Creo que se almacena en / storage / emulated en los últimos dispositivos. Compruebe la ruta del archivo. Y ver si está creando un archivo con la ruta absoluta.

Encontró una solución. Esta es la función que estaba usando para obtener el archivo que se estaba pasando a la intención de la cámara.

  // Create a File object for storing the photo private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getApplicationContext().getFilesDir(); mPhotoFileExists = true; // check if access to external storage exists // if returned true, return the new file // if returned false, user could have been requested for access // so, need to check if permission is available now // if still not available, return null if(haveWritePermissions()) return File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); return null; } 

He cambiado el storageDir de getApplicationContext().getFilesDir(); A getApplicationContext.getExternalFilesDir(null);

Docs: getExternalFilesDir (tipo de cadena) , getFilesDir ()

Pasé null ya que no quería poner Environment.DIRECTORY_PICTURES , lo que permitiría que el escáner de medios para encontrar el archivo de imagen.

Entiendo que esto, de ninguna manera, es un "arreglo". Todavía está buscando una respuesta en cuanto a por qué getFilesDir () está causando este problema.

EDIT: razón muy apremiante sobre por qué esto no es una buena solución – el almacenamiento externo no siempre está disponible, y no habría ninguna solución en ese caso. Además, cualquier otra aplicación con permiso WRITE_EXTERNAL_STORAGE puede escribir aquí. Por lo tanto, no se aplica ninguna seguridad.

  • ¿Cómo agregar @ símbolo a la cadena en android?
  • Cómo agregar una vista a la parte superior de un diseño lineal en el código?
  • Android - reproducir sonido diferente en cada segundo clic
  • Cómo configurar el color de resaltado para el elemento ListView?
  • Android: cambiar los elementos del menú de opciones mediante programación
  • Android: no se puede instanciar la aplicación
  • No se puede tomar la captura de pantalla en Android L mediante programación
  • Cómo dibujar LibGDX Sprite de Constructor en blanco
  • ¿Cómo puedo detectar un clic en un oyente onTouch?
  • Conversión de HashMap en una matriz
  • Cómo ver un Google Calendar público a través de una aplicación para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.