web-dev-qa-db-fra.com

Android: decodeFile renvoie toujours la valeur null pour le fichier dans la mémoire de stockage interne

J'ai un fichier enregistré localement dans le stockage privé de l'application. J'ai vérifié qu'il existe, mais chaque fois que j'appelle BitmapFactory.decodeFile, il renvoie toujours la valeur null.

Si je sauvegarde le fichier en tant que ressource et que j'utilise ImageView setImageResource, tout se passera bien.

Quel est le problème?

Voici l'extrait de code:

filename = "test.png";

if (doesFileExist(filename))
    Bitmap bMap = BitmapFactory.decodeFile(filename);

J'ai aussi essayé:

Bitmap bMap = BitmapFactory.decodeFile(getFilesDir().getPath()
                    + filename);
16
Jahmic

Cette question a déjà reçu une réponse, comme ici: BitmapFactory.decodeFile retourne la valeur null, même si l'image existe

C'était exactement ce dont j'avais besoin:

String fname=new File(getFilesDir(), "test.png").getAbsolutePath();
30
Jahmic

Les gens, les fichiers stockés dans une ressource d'application doivent être référencés de manière spéciale. Par exemple. si le fichier se trouve dans des assets et porte le nom "myfile.png", il doit être référencé ainsi:

String uriString="file:///Android_asset/myfile.png";
Uri uri=Uri.parse(uriString);
3
barmaley

Au lieu d'utiliser BitmapFactory.decodeFile, essayez d'utiliser 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);
2
rharvey

Pourriez-vous essayer fileList ()? Il 

retourne un tableau de chaînes nommant les fichiers privés associés à ce package d'application Context.

0
user609395

BitmapFactory.decodeFile attend un chemin de fichier sans le schéma. C'est à dire. sans le file:// au début.

Si vous manipulez un Uri, ne le faites pas simplement .toString(), mais appelez plutôt .getPath() et transmettez-le à la méthode. 

0
David Refaeli

Pour moi, je recevais une image de l'URL sauvegardée localement, quelque chose comme "fichier: /// stockage/émulé/0/...." (j'ai utilisé le plugin Phonegap pour capturer une image. Le plugin me donnait le chemin de l'image, ce dont j'ai besoin utiliser en code natif)

Voici l'extrait de code qui a fonctionné pour moi.

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);
0
Chirag Purohit