将字符串数组中的图像保存到SD卡和手机库

问题描述:

我正在使用字符串数组来保存图像,我从URL中获取图像。我有一个imageview,当它被移动时会改变其中的图像。现在我想下载并保存SD卡上的任何图像,并希望它出现在手机库中的新文件夹中。将字符串数组中的图像保存到SD卡和手机库

我使用下面的代码,但它不工作,它没有显示任何错误。

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(thumb[j]); 
       /* 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(); 
      } 
     } 
    } 

,我通过

new ImageDownloadAndSave().execute(""); 

执行它在我的字符串数组的名称是“大拇指”,这是保持所有的URL。我究竟做错了什么?

+0

您需要将文件添加到'MediaStore'。看看我的答案[这里](http://*.com/a/29947838/4193263)。 – ByteHamster

+0

@ByteHamster应该把它放在一个方法或什么,我应该如何初始化和执行它? –

+0

使用文件管理器(例如“Astro”)时能看到文件吗? – ByteHamster

保存后应将图像添加到图库中,然后对其进行扫描。请查看以下主题:

Image, saved to sdcard, doesn't appear in Android's Gallery app

MediaScannerConnection

文件需要被添加到Android MediaStore。这可以通过使用以下功能轻松完成。

public void scanFile(final File file) { 
    try { 
     new MediaScannerConnectionClient() { 
      private MediaScannerConnection mMs; 

      public void init() { 
       mMs = new MediaScannerConnection(myContext, this); 
       mMs.connect(); 
      } 

      @Override 
      public void onMediaScannerConnected() { 
       mMs.scanFile(file.getAbsolutePath(), null); 
       mMs.disconnect(); 
      } 

      @Override 
      public void onScanCompleted(String path, Uri uri) { 
      } 

     }.init(); 
    } catch(Exception e) { 
     // Device does not support adding files manually. 
     // Sending Broadcast to start MediaScanner (slower than adding manually) 
     try { 
      sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
        Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
     } catch(Exception ee) { 
      // Something went terribly wrong. 
      // Can't add file to MediaStore and can't send Broadcast to start MediaScanner. 
     } 
    } 
} 

你只需要一个行添加到您的代码:

// ..... 

fos.close(); 
Log.d("test", "Image Saved in sdcard.."); 

scanFile(file); // <------------- add this 
+0

嘿,你在吗? –