2011-02-02 3 views
11

Voglio salvare un'immagine da un URL alla scheda SD (per uso futuro) e quindi caricare quell'immagine dalla scheda SD per utilizzarla come sovrapposizione disegnabile per le mappe di Google.Android: salva l'immagine dall'URL sulla scheda SD

Qui è la sezione salvataggio della funzione:

//SAVE TO FILE 

String filepath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
String extraPath = "/Map-"+RowNumber+"-"+ColNumber+".png"; 
filepath += extraPath; 

FileOutputStream fos = null; 
fos = new FileOutputStream(filepath); 

bmImg.compress(CompressFormat.PNG, 75, fos); 

//LOAD IMAGE FROM FILE 
Drawable d = Drawable.createFromPath(filepath); 
return d; 

L'immagine viene salvata sulla scheda SD succuessfully ma non riesce quando ottiene alla linea createFromPath(). Non capisco perché salverebbe la destinazione ma non la caricherò ...

+0

E quale errore si ottiene? – Cristian

+0

Hai provato a caricare un'immagine esistente utilizzando createFromPath? – Ankit

+0

È in un'istruzione try-catch, impostandolo su null se fallisce. Non ho provato un'altra immagine. Sto usando l'emulatore – Jamie

risposta

1

Credo che non funzioni perché stai scrivendo una versione compressa della bitmap sul flusso di output, che dovrebbe essere caricato con BitmapFactory.decodeStream(). Avere uno quick look alla documentazione su questo.

Se è necessario un Drawable (decodeStream() restituisce un Bitmap), chiamare semplicemente Drawable d = new BitmapDrawable(bitmap).

+1

Ho decodificato usando 'decodeStream' - come faccio a trasformarlo in un Drawable? – Jamie

+1

Basta chiamare 'Drawable d = new BitmapDrawable (bitmap)', dove 'bitmap' è il risultato della chiamata' decodeStream() '. Ho aggiornato la mia risposta sopra con queste informazioni. – goncalossilva

5

Provare questo codice per salvare l'immagine dall'URL alla SDCard.

URL url = new URL ("file://some/path/anImage.png"); 
InputStream input = url.openStream(); 
try {  
    File storagePath = Environment.getExternalStorageDirectory(); 
    OutputStream output = new FileOutputStream (storagePath, "myImage.png");  
    try {   
     byte[] buffer = new byte[aReasonableSize];   
     int bytesRead = 0;   
     while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) { 
       output.write(buffer, 0, bytesRead);   
     }  
    } 
    finally {   
     output.close();  
    } 
} 

finally {  
    input.close(); 
} 

Se si desidera creare una sottodirectory sull'uso scheda SD:

File storagePath = new File(Environment.getExternalStorageDirectory(),"Wallpaper"); 
storagePath.mkdirs(); 

Per creare una directory del sub "/ sdcard/Carta da parati /".

Spero che ti possa aiutare.

Divertiti. :)

1

Prova questo code..It funziona bene

public static Bitmap loadImageFromUrl(String url) { 
      URL m; 
      InputStream i = null; 
      BufferedInputStream bis = null; 
      ByteArrayOutputStream out =null; 
      try { 
       m = new URL(url); 
       i = (InputStream) m.getContent(); 
       bis = new BufferedInputStream(i,1024 * 8); 
       out = new ByteArrayOutputStream(); 
       int len=0; 
       byte[] buffer = new byte[1024]; 
       while((len = bis.read(buffer)) != -1){ 
        out.write(buffer, 0, len); 
       } 
       out.close(); 
       bis.close(); 
      } catch (MalformedURLException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      byte[] data = out.toByteArray(); 
      Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
      //Drawable d = Drawable.createFromStream(i, "src"); 
      return bitmap; 
     } 

e salvare la bitmap nella directory

ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
_bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 

//you can create a new file name "test.jpg" in sdcard folder. 
File f = new File(Environment.getExternalStorageDirectory() 
         + File.separator + "test.jpg") 
f.createNewFile(); 
//write the bytes in file 
FileOutputStream fo = new FileOutputStream(f); 
fo.write(bytes.toByteArray()); 

// remember close de FileOutput 
fo.close(); 

e non dimenticate di aggiungere il permesso di manifestare

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
28

Prova questo code.It funziona ...

try 
{ 
    URL url = new URL("Enter the URL to be downloaded"); 
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    urlConnection.setRequestMethod("GET"); 
    urlConnection.setDoOutput(true);     
    urlConnection.connect();     
    File SDCardRoot = Environment.getExternalStorageDirectory().getAbsoluteFile(); 
    String filename="downloadedFile.png"; 
    Log.i("Local filename:",""+filename); 
    File file = new File(SDCardRoot,filename); 
    if(file.createNewFile()) 
    { 
    file.createNewFile(); 
    }     
    FileOutputStream fileOutput = new FileOutputStream(file); 
    InputStream inputStream = urlConnection.getInputStream(); 
    int totalSize = urlConnection.getContentLength(); 
    int downloadedSize = 0; 
    byte[] buffer = new byte[1024]; 
    int bufferLength = 0; 
    while ((bufferLength = inputStream.read(buffer)) > 0) 
    {     
    fileOutput.write(buffer, 0, bufferLength);     
    downloadedSize += bufferLength;     
    Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ; 
    }    
    fileOutput.close(); 
    if(downloadedSize==totalSize) filepath=file.getPath();  
} 
catch (MalformedURLException e) 
{ 
    e.printStackTrace(); 
} 
catch (IOException e) 
{ 
    filepath=null; 
    e.printStackTrace(); 
} 
Log.i("filepath:"," "+filepath) ; 
return filepath; 
+0

Amico! Questo codice funziona davvero! Grazie mille per questo frammento –

+9

Non capisco perché lo fai: if (file.createNewFile()) { file.createNewFile(); } –

+0

funziona bene .. –

20

DownloadManager fa tutto questi per voi.

public void downloadFile(String uRl) { 
    File direct = new File(Environment.getExternalStorageDirectory() 
      + "/AnhsirkDasarp"); 

    if (!direct.exists()) { 
     direct.mkdirs(); 
    } 

    DownloadManager mgr = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE); 

    Uri downloadUri = Uri.parse(uRl); 
    DownloadManager.Request request = new DownloadManager.Request(
      downloadUri); 

    request.setAllowedNetworkTypes(
      DownloadManager.Request.NETWORK_WIFI 
        | DownloadManager.Request.NETWORK_MOBILE) 
      .setAllowedOverRoaming(false).setTitle("Demo") 
      .setDescription("Something useful. No, really.") 
      .setDestinationInExternalPublicDir("/AnhsirkDasarpFiles", "fileName.jpg"); 

    mgr.enqueue(request); 

} 
3

Ho anche affrontato lo stesso problema e risolto il mio con questo. Prova questo

private class ImageDownloadAndSave extends AsyncTask<String, Void, Bitmap> 
     { 
      @Override 
      protected Bitmap doInBackground(String... arg0) 
      {   
       downloadImagesToSdCard("",""); 
       return null; 
      } 

       private void downloadImagesToSdCard(String downloadUrl,String imageName) 
       { 
        try 
        { 
         URL url = new URL(img_URL); 
         /* making a directory in sdcard */ 
         String sdCard=Environment.getExternalStorageDirectory().toString();  
         File myDir = new File(sdCard,"test.jpg"); 

         /* if specified not exist create new */ 
         if(!myDir.exists()) 
         { 
          myDir.mkdir(); 
          Log.v("", "inside mkdir"); 
         } 

         /* checks the file and if it already exist delete */ 
         String fname = imageName; 
         File file = new File (myDir, fname); 
         if (file.exists()) 
          file.delete(); 

          /* Open a connection */ 
         URLConnection ucon = url.openConnection(); 
         InputStream inputStream = null; 
         HttpURLConnection httpConn = (HttpURLConnection)ucon; 
         httpConn.setRequestMethod("GET"); 
         httpConn.connect(); 

          if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) 
          { 
          inputStream = httpConn.getInputStream(); 
          } 

          FileOutputStream fos = new FileOutputStream(file); 
       int totalSize = httpConn.getContentLength(); 
         int downloadedSize = 0; 
         byte[] buffer = new byte[1024]; 
         int bufferLength = 0; 
         while ((bufferLength = inputStream.read(buffer)) >0) 
         {     
          fos.write(buffer, 0, bufferLength);     
          downloadedSize += bufferLength;     
          Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ; 
         } 

          fos.close(); 
          Log.d("test", "Image Saved in sdcard..");      
        } 
        catch(IOException io) 
        {     
         io.printStackTrace(); 
        } 
        catch(Exception e) 
        {      
         e.printStackTrace(); 
        } 
       }   
     } 

Dichiarare le operazioni di rete in AsyncTask in quanto verrà caricato come attività in background. Non caricare le operazioni di rete sul thread principale. Dopo questo sia in tasto click o nel contenuto delle chiamate vista questa classe come

new ImageDownloadAndSave().execute(""); 

E non dimenticate di aggiungere l'autorizzazione nework come:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

Spero che questo possa aiutare qualcuno :-)

1

Prova questo ... Un modo semplice per eseguire l'operazione.

Picasso.with(getActivity()) 
       .load(url) 
       .into(new Target() { 
          @Override 
          public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
           try { 
            String root = Environment.getExternalStorageDirectory().toString(); 
            File myDir = new File(root + "/yourDirectory"); 

            if (!myDir.exists()) { 
             myDir.mkdirs(); 
            } 

            String name = new Date().toString() + ".jpg"; 
            myDir = new File(myDir, name); 
            FileOutputStream out = new FileOutputStream(myDir); 
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 

            out.flush(); 
            out.close(); 
           } catch(Exception e){ 
            // some action 
           } 
          } 

          @Override 
          public void onBitmapFailed(Drawable errorDrawable) { 
          } 

          @Override 
          public void onPrepareLoad(Drawable placeHolderDrawable) { 
          } 
         } 
       );