2012-01-19 13 views
9

Escribí satisfactoriamente una aplicación, based on this blog post, pero más simple, que transmite una imagen a través de HTTP, utilizando una solicitud POST.Android: obteniendo el tamaño de archivo de la imagen antes de compartirla (Intent.ACTION_SEND)

Lo que no puedo entender (después de buscar en la web y rastrear dentro de los documentos SDK de Android) es, ¿cómo obtengo el tamaño de la imagen antes de compartirla?

Sólo hay una posibilidad de abrir un flujo de entrada que veo en el exampkle y en cualquier otro lugar:

ContentResolver cr = getContentResolver(); 
InputStream is = cr.openInputStream(uri); 

El ejemplo de blog dada utiliza getBytesFromFile(is), por lo que se podría obtener el tamaño allí, pero esto es no una solución. Algunas imágenes son enormes, mientras que las aplicaciones de Android tienen un espacio limitado. Quiero que mi aplicación funcione para todos los tamaños imaginables de imágenes (no es un problema cuando se comparte a través de Wifi).

Por lo tanto, la única opción para mí es "reenviar" la secuencia de entrada a alguna secuencia de salida HTTP, lo que hago y funciona. Pero este enfoque no me da el tamaño de la imagen antes de enviarlo.

Respuesta

0

Simplemente solicite al InputStream el número de bytes disponibles para obtener el tamaño del archivo.

ContentResolver cr = getContentResolver(); 
InputStream is = cr.openInputStream(uri); 
int size = is.available(); 

Esto funcionó bastante confiable una vez. No sé si eso sigue siendo cierto, ya que no se garantiza que el resultado represente todos los bytes del archivo.

+0

Gracias, lo intentaré. –

+3

De acuerdo con http://developer.android.com/reference/java/io/InputStream.html: '" Devuelve una cantidad estimada de bytes que se pueden leer u omitir: sin bloquear para obtener más información. " Para que lo más probable es que no obtenga el tamaño del archivo. – mbonnin

+0

Lo sé ... pero al momento de escribir durante mis pruebas siempre fue del tamaño del archivo. – flob

14

También puede comprobar de esta manera:

Uri fileUri = resultData.getData(); 
Cursor cursor = getActivity().getContentResolver().query(fileUri, 
    null, null, null, null); 
cursor.moveToFirst(); 
long size = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE)); 
cursor.close(); 

Fuente: https://developer.android.com/training/secure-file-sharing/retrieve-info.html

+0

He usado este método y el problema es que el tamaño del archivo para usar este código podría estar equivocado – adi9090

+0

oh, de verdad, me interesa saber cuándo sucederá esto si puedes proporcionar más detalles. – wrapperapps

+1

Esto es lo que he encontrado al intentar resolver este problema: https://code.google.com/p/android/issues/detail?id=68672 Esto me ha sucedido en una sola imagen en Nexus 4 con Android 5.1 .1 y lo han solucionado usando ParcelFileDescriptor. – adi9090

1
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == Activity.RESULT_OK) { 

     if (requestCode == 9991) { 

      if (data == null) { 
       //no data present 
       return; 
      } 


      ContentResolver cr = getContentResolver(); 
      InputStream is = null; 

      File file = new File(fileUri.getPath()); 


      try { 
       is = cr.openInputStream(fileUri); 
       cr.getType(fileUri); 
       int size = is.available(); 
       Log.d(TAG, "Size 151: " + getFileSize(size)); 

      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

}

Así es como me fijo mi problema similar a este, esto va a funcionar para la API de Android debajo de KITKAT.

private static final DecimalFormat format = new DecimalFormat("#.##"); 
private static final long MiB = 1024 * 1024; 
private static final long KiB = 1024; 

public String getFileSize(long file) { 


    final double length = Double.parseDouble(String.valueOf(file)); 

    if (length > MiB) { 
     return format.format(length/MiB) + " MiB"; 
    } 
    if (length > KiB) { 
     return format.format(length/KiB) + " KiB"; 
    } 
    return format.format(length) + " B"; 
} 
Cuestiones relacionadas