outofmemory - Android: decodeFile siempre devuelve nulo para el archivo en el almacenamiento interno
clase bitmap android (6)
¿Podrías probar fileList ()? Eso
devuelve una matriz de cadenas que nombran los archivos privados asociados con el paquete de aplicaciones de este contexto.
Tengo un archivo guardado localmente en el almacenamiento privado de la aplicación. He verificado que existe, sin embargo, siempre que llamo a BitmapFactory.decodeFile, siempre devuelve un valor nulo.
Si guardo el archivo como un recurso y uso ImageView setImageResource, siempre aparece bien.
¿Cuál es el problema?
Aquí está el fragmento:
filename = "test.png";
if (doesFileExist(filename))
Bitmap bMap = BitmapFactory.decodeFile(filename);
También he intentado:
Bitmap bMap = BitmapFactory.decodeFile(getFilesDir().getPath()
+ filename);
En lugar de usar BitmapFactory.decodeFile, intente usar InputStream:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.getData();
InputStream imageStream = getContentResolver().openInputStream(selectedImage);
Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
Esta pregunta se ha respondido antes, como aquí: BitmapFactory.decodeFile devuelve nulo incluso existe una imagen
Esto era exactamente lo que necesitaba:
String fname=new File(getFilesDir(), "test.png").getAbsolutePath();
Gente, los archivos almacenados en el recurso de la aplicación deben ser referenciados de una manera especial. Por ejemplo, si el archivo se encuentra en activos y se denomina "myfile.png", se debe hacer referencia a él como:
String uriString="file:///android_asset/myfile.png";
Uri uri=Uri.parse(uriString);
Para mí estaba obteniendo una imagen de la URL localmente guardada, algo así como "file: /// storage / emulated / 0 / ...." (He usado el complemento Phonegap para capturar la imagen. El complemento me estaba dando la ruta de la imagen, que necesito uso en código nativo)
Aquí está el fragmento de código que funcionó para mí.
String captured_image_info = "file:///storage/emulated/0/Android/data/com.testapp/cache/1493809796526.jpg"
Uri uri=Uri.parse(captured_image_info);
largeLog("uri", "" + uri);
InputStream imageStream = getContentResolver().openInputStream(uri);
Bitmap bm = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] decodedBytes = baos.toByteArray();
Bitmap img_captured_image = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
BitmapFactory.decodeFile
espera una ruta de archivo sin el esquema. Es decir, sin el file://
al principio.
Si está manejando un Uri, no solo .toString()
, sino que llame a .getPath()
en él, y páselo al método.