2011-02-02 59 views
11

Tôi muốn lưu hình ảnh từ URL vào thẻ SD (để sử dụng sau này) và sau đó tải hình ảnh đó từ thẻ SD để sử dụng nó làm lớp phủ có thể vẽ được cho bản đồ của Google.Android - Lưu hình ảnh từ URL vào thẻ SD

Đây là tiết kiệm phần của hàm:

//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; 

Hình ảnh được lưu vào thẻ sd succuessfully nhưng không thành công khi nhận được đến dòng createFromPath(). Tôi không hiểu lý do tại sao nó sẽ tiết kiệm ok đến đích đó nhưng không được tải từ đó ....

+0

Và bạn nhận được lỗi nào? – Cristian

+0

Bạn đã thử tải một hình ảnh hiện có bằng cách sử dụng createFromPath? – Ankit

+0

Đó là trong một tuyên bố try-catch, thiết lập nó để null nếu nó không thành công. Tôi chưa thử nghiệm một hình ảnh khác. Tôi đang sử dụng Trình mô phỏng – Jamie

Trả lời

1

Tôi tin rằng nó không thành công vì bạn đang viết phiên bản bitmap nén vào luồng đầu ra, nên tải với BitmapFactory.decodeStream(). Có một số quick look tại tài liệu về điều này.

Nếu bạn cần số Drawable (decodeStream() trả về số Bitmap), chỉ cần gọi Drawable d = new BitmapDrawable(bitmap).

+1

Tôi đã giải mã bằng cách sử dụng 'decodeStream' - làm thế nào để bây giờ tôi chuyển sang Drawable? – Jamie

+1

Chỉ cần gọi 'Drawable d = new BitmapDrawable (bitmap) ', trong đó' bitmap' là kết quả của việc gọi 'decodeStream()'. Tôi đã cập nhật câu trả lời của mình ở trên với thông tin này. – goncalossilva

5

Hãy thử mã này để lưu Hình ảnh từ URL vào 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(); 
} 

Nếu bạn muốn tạo một thư mục phụ về việc sử dụng thẻ SD:

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

Để tạo một thư mục phụ "/ sdcard/Wallpaper /".

Hy vọng nó sẽ giúp bạn.

Tận hưởng. :)

1

Hãy thử code..It này hoạt động tốt

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; 
     } 

và lưu vào thư mục bitmap

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(); 

và đừng quên để thêm phép biểu hiện

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

Hãy thử code.It này hoạt động ...

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

Dude! mã này thực sự hoạt động! Cảm ơn rất nhiều vì đoạn mã này –

+9

Tôi không hiểu tại sao bạn làm điều này: if (file.createNewFile()) { file.createNewFile(); } –

+0

làm việc tốt .. –

20

DownloadManager làm tất cả những cho bạn.

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

Tôi cũng gặp phải sự cố tương tự và đã giải quyết vấn đề này với vấn đề này. Hãy thử điều này

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(); 
        } 
       }   
     } 

Tuyên bố hoạt động mạng của bạn trong AsyncTask vì nó sẽ tải nó dưới dạng tác vụ nền. Không tải hoạt động mạng trên luồng chính. Sau đó một trong hai nút bấm hoặc theo quan điểm cuộc gọi nội dung lớp này như

new ImageDownloadAndSave().execute(""); 

Và đừng quên thêm quyền nework như:

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

Hy vọng điều này có thể giúp một người nào đó :-)

1

Hãy thử cách này ... Một cách dễ dàng để thực hiện công việc.

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) { 
          } 
         } 
       ); 
Các vấn đề liên quan