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();
- Cómo revertir el enum?
- Proguard eliminando anotaciones en la aplicación de Android
- No se puede actualizar un diseño después de agregar una vista (sólo se produce en CustomAdapter)
- LibVlc android no puede cargar libs
- Descubrimiento del servicio de red error de tutorial android: Servicio perdido, el teléfono se desactiva
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".
- Manejo deNewIntent para FLAG_ACTIVITY_NEW_TASK
- Android - Problema con imágenes de carga perezosa en un ListView
- Descargar varios archivos utilizando un servicio en android
- Expresión regular para eliminar todos los caracteres no imprimibles
- Problema de implementación de fragmentos Android
- Programa Hello World para Google Glass - Paso a paso
- ¿Por qué se recomienda llamar a MultiDex.install () en attachBaseContext (Context)?
- #if en java, como en preprocesadores c
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.
- FrameLayout wrap_content en ConstraintLayout
- Creación de Android NDK Toolchain para x86 Android en Windows mediante Cygwin