2011-05-18 9 views
16

Tengo un archivo de video en la carpeta sin procesar en mis recursos. Quiero encontrar el tamaño del archivo. tengo este pedazo de código:Obtener el tamaño de un recurso de archivo de Android?

Uri filePath = Uri.parse("android.resource://com.android.FileTransfer/" + R.raw.video); 
       File videoFile = new File(filePath.getPath()); 
       Log.v("LOG", "FILE SIZE "+videoFile.length()); 

Pero siempre me da que el tamaño es 0. ¿Qué estoy haciendo mal?

Respuesta

9

No puede usar File para recursos. Use Resources o AssetManager para obtener un InputStream en el recurso, luego llame al método available().

De esta manera:

InputStream is = context.getResources().openRawResource(R.raw.nameOfFile); 
int sizeOfInputStram = is.available(); // Get the size of the stream 
+0

Muchas gracias Ebo .. que me salvó la vida !! – Jana

+9

¿Nunca ha tenido un problema con este? Se supone que este método devuelve 'una cantidad estimada de bytes que se pueden leer', no necesariamente el tamaño real del archivo, y la documentación claramente desalienta su uso ... http://developer.android.com/reference/java/ io/InputStream.html # disponible() – psycho

+4

Bueno, la documentación se refiere a las transmisiones genéricas que pueden tardar un tiempo en recuperar datos, como las transmisiones de red. En un recurso, el tamaño exacto siempre se conoce y está disponible. – EboMike

20

probar este líneas:

InputStream ins = context.getResources().openRawResource (R.raw.video) 
int videoSize = ins.available(); 
+1

¡¡TE QUIERO !!! Estas 2 líneas de código resolvieron un problema de 7 días !!! ¡Gracias! ; D – Matteo

+0

La misma pregunta/comentario que acabo de publicar bajo la respuesta de @ EboMike. Nunca he tenido ningún problema de esta manera? – psycho

+2

Lo que 'openRawResource()' devuelve no es un 'InputStream' normal sino' AssetInputStream'. Esta subclase anula 'available()' y _is_ able para proporcionar información confiable. – caw

19

Prueba esto:

AssetFileDescriptor sampleFD = getResources().openRawResourceFd(R.raw.video); 
long size = sampleFD.getLength() 
+3

Eso parece mucho más seguro que otras respuestas. – Snicolas

+3

+1 Pero no funcionará de forma predeterminada en muchos tipos de archivos porque 'aapt' los comprime, para una solución, vea aquí: http://stackoverflow.com/questions/19743169/how-can-i -use-openrawresourcesfd/19743170 – delicateLatticeworkFever

Cuestiones relacionadas