为什么我的图像没有从android中的URL下载?

时间:2014-05-28 10:34:54

标签: android

我正在尝试使用URL下载/检索图像并将其保存在sdcard中。我使用了以下代码,但我的图像文件是空白的。任何人都可以告诉我一步一步做什么或我出错的地方。我的代码如下:

  URL url = new URL("http://www.mydomainname.com/task/uploads/test2.png");

  HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();


  urlConnection.setRequestMethod("GET");
  urlConnection.setDoOutput(true); 

  urlConnection.connect();

  File SDCardRoot = Environment.getExternalStorageDirectory();


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

2 个答案:

答案 0 :(得分:2)

请看我的答案,这对我有用..

请在您的清单文件中提及以下权限

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

请参阅此代码

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import com.google.android.gms.internal.dw;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;

public class DownLoadImage extends Activity {
    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.action_main);

    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... arg0) {
             Bitmap bitmap = DownloadImage(
                        "http://www.yourdomainname.com/imgs/arrangemen4.jpg");

             String extr = Environment.getExternalStorageDirectory().toString();
                File mFolder = new File(extr + "/MyApp");

                if (!mFolder.exists()) {
                    mFolder.mkdir();
                }

                String strF = mFolder.getAbsolutePath();
                File mSubFolder = new File(strF + "/MyApp-SubFolder");

                if (!mSubFolder.exists()) {
                    mSubFolder.mkdir();
                }

                String s = "myfile.png";

                File f = new File(mSubFolder.getAbsolutePath(),s);

                String strMyImagePath = f.getAbsolutePath();
                 FileOutputStream fos = null;
                 try {
                     fos = new FileOutputStream(f);
                     bitmap.compress(Bitmap.CompressFormat.PNG,70, fos);

                     fos.flush();
                     fos.close();
                  //   MediaStore.Images.Media.insertImage(getContentResolver(), b, "Screen", "screen");
                 }catch (FileNotFoundException e) {

                     e.printStackTrace();
                 } catch (Exception e) {

                     e.printStackTrace();
                 }
            return null;
        }
        protected void onPostExecute(Void result) {
            Toast.makeText(DownLoadImage.this, "Done", Toast.LENGTH_SHORT).show();
        };
    }.execute();
    }

    private InputStream OpenHttpConnection(String urlString) 
            throws IOException
            {
                InputStream in = null;
                int response = -1;

                URL url = new URL(urlString); 
                URLConnection conn = url.openConnection();

                if (!(conn instanceof HttpURLConnection))                     
                    throw new IOException("Not an HTTP connection");

                try{
                    HttpURLConnection httpConn = (HttpURLConnection) conn;
                    httpConn.setAllowUserInteraction(false);
                    httpConn.setInstanceFollowRedirects(true);
                    httpConn.setRequestMethod("GET");
                    httpConn.connect(); 

                    response = httpConn.getResponseCode();                 
                    if (response == HttpURLConnection.HTTP_OK) {
                        in = httpConn.getInputStream();                                 
                    }                     
                }
                catch (Exception ex)
                {
                    throw new IOException("Error connecting");            
                }
                return in;     
            }
            private Bitmap DownloadImage(String URL)
            {        
                Bitmap bitmap = null;
                InputStream in = null;        
                try {
                    in = OpenHttpConnection(URL);
                    bitmap = BitmapFactory.decodeStream(in);
                    in.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                return bitmap;                
            }
}

谢谢...... :) 如果您有任何问题,请随时问我......

答案 1 :(得分:0)

为什么不为您的目的使用图像加载库。它将在一行编码中从给定的URL加载图像,并管理所有与图像加载相关的任务,如缓存,内存管理,asyn任务等。

例如,只需使用这个令人敬畏的图像加载库:

1)http://square.github.io/picasso/

只需一行代码即可执行所有任务

Picasso.with(context)
    .load(url)
    .placeholder(R.drawable.user_placeholder)
    .error(R.drawable.user_placeholder_error)
    .into(imageView);

您也可以将图像保存到SD卡。