0

J'essaie de télécharger l'image d'Internet et de la stocker localement dans un dossier caché où les images ne sont pas visibles à l'utilisateur dans sa galerie.Télécharger l'image et l'affichage du dossier caché local dans Android

Voici mon code pour le faire. L'image ne s'affiche que lorsque l'appareil est connecté à Internet. En d'autres termes, l'image n'est pas enregistrée dans l'appareil et elle émet une exception.

Voici ma classe ImageStorage:

package com.example.adhish.downloadretriveimage; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Environment; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 

/** 
* Created by appy-20 on 6/1/17. 
*/ 

public class ImageStorage { 


    public static String saveToSdCard(Bitmap bitmap, String filename) { 

     String stored = null; 

     File sdcard = Environment.getExternalStorageDirectory() ; 

     File folder = new File(sdcard.getAbsoluteFile(), ".test_directory");//the dot makes this directory hidden to the user 
     folder.mkdir(); 
     File file = new File(folder.getAbsoluteFile(), filename + ".jpg") ; 
     if (file.exists()) 
      return stored ; 

     try { 
      FileOutputStream out = new FileOutputStream(file); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      out.flush(); 
      out.close(); 
      stored = "success"; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return stored; 
    } 

    public static File getImage(String imagename) { 

     File mediaImage = null; 
     try { 
      String root = Environment.getExternalStorageDirectory().toString(); 
      File myDir = new File(root); 
      if (!myDir.exists()) 
       return null; 

      mediaImage = new File(myDir.getPath() + "/.test_directory/"+imagename); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return mediaImage; 
    } 
    public static boolean checkifImageExists(String imagename) 
    { 
     Bitmap b = null ; 
     File file = ImageStorage.getImage("/"+imagename+".jpg"); 
     String path = file.getAbsolutePath(); 

     if (path != null) 
      b = BitmapFactory.decodeFile(path); 

     if(b == null || b.equals("")) 
     { 
      return false ; 
     } 
     return true ; 
    } 
} 

et voici mon MainActivity.java:

package com.example.adhish.downloadretriveimage; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ImageView; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.net.URL; 
import java.net.URLConnection; 

public class MainActivity extends AppCompatActivity { 


    ImageView imageView; 
    Bitmap b; 
    String imagename; 
    String imgurl; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     imageView=(ImageView)findViewById(R.id.imageView); 

     imagename="394968_538b_7"; 
     imgurl="https://udemy-images.udemy.com/course/750x422/394968_538b_7.jpg"; 

     if(ImageStorage.checkifImageExists(imagename)) 
     { 
      File file = ImageStorage.getImage("/"+imagename+".jpg"); 

//   File file = ImageStorage.getImage("https://udemy-images.udemy.com/course/750x422/394968_538b_7.jpg"); 

      String path = file.getAbsolutePath(); 
      if (path != null){ 
       b = BitmapFactory.decodeFile(path); 
       imageView.setImageBitmap(b); 
      } 
     } else { 
      new GetImages(imgurl, imageView, imagename).execute() ; 
     } 
    } 

    private class GetImages extends AsyncTask<Object, Object, Object> { 
     private String requestUrl, imagename_; 
     private ImageView view; 
     private Bitmap bitmap; 
     private FileOutputStream fos; 

     private GetImages(String requestUrl, ImageView view, String _imagename_) { 
      this.requestUrl = requestUrl; 
      this.view = view; 
      this.imagename_ = _imagename_; 
     } 

     @Override 
     protected Object doInBackground(Object... objects) { 
      try { 
       URL url = new URL(requestUrl); 
       URLConnection conn = url.openConnection(); 
       bitmap = BitmapFactory.decodeStream(conn.getInputStream()); 
      } catch (Exception ex) { 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Object o) { 
      if (!ImageStorage.checkifImageExists(imagename_)) { 
       view.setImageBitmap(bitmap); 
       ImageStorage.saveToSdCard(bitmap, imagename_); 
      } 
     } 
    } 
} 

J'ai déjà donné le stockage externe autorisation de lecture d'écriture dans mon Manifest.

+0

Afficher la sortie logcat. –

+0

@KNeerajLal 01-07 12: 19: 06.535 26907-26907/com.example.adhish.downloadretriveimage W/System.err: java.io.FileNotFoundException: 394968_538b_7: Échec de l'ouverture: EROFS (système de fichiers en lecture seule) – Adhish

+0

demander des autorisations en cours d'exécution pour Android 6? pourriez-vous ajouter des journaux et vérifier le chemin d'accès au fichier? J'ai remarqué eхtra "/" dans le chemin. – user5599807

Répondre