1

I'm new to android I want to download images from web to my emulator I have seen This, my problem is also as it is. but I have done this :

public class MainActivity extends Activity {

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

    new MyAsnyc().execute();
}   

public class MyAsnyc extends AsyncTask<Void, Void,Void>{
    public  File file ;
    InputStream is;
    protected void inBackground() throws IOException{

        File path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        file = new File(path, "DemoPicture.jpg");
        try{
            // Make sure the Pictures directory exists.
            path.mkdirs();

            URL url = new      URL(BASE_URL);
            /* Open a connection to that URL. */
            URLConnection ucon = url.openConnection();

            /*
             * Define InputStreams to read from the URLConnection.
             */
            is = ucon.getInputStream();

            OutputStream os = new FileOutputStream(file);
            byte[] data = new byte[is.available()];
            is.read(data);
            Log.d("MY_TAG>>>", "Picture is Readable...");
            os.write(data);
            Log.d("MY_TAG>>>", "Picture is Saved...");
            is.close();
            os.close();

        }
        catch (IOException e) {
            Log.d("ImageManager", "Error: " + e);
        }
    }
    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        try {
            inBackground();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }
    protected void onPostExecute()
    {

        try
        {
            // Tell the media scanner about the new file so that it is
            // immediately available to the user.

            MediaScannerConnection.scanFile(null,
                    new String[] { file.toString() }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

}

but my AsyncTask is never called please any one help me how to solve this and how to download image from web.

Community
  • 1
  • 1
  • Why do you have 2 `doInBackground()` methods? `protected void doInBackground() throws IOException{` and `protected Void doInBackground(Void... params) {` – Siddharth Lele Mar 09 '13 at 07:54
  • I have seen that from [link](http://stackoverflow.com/questions/9762057/how-to-download-file-image-from-url-to-your-android-app); –  Mar 09 '13 at 08:01
  • Ok! Do you only want to download Images from web? `Yes` Or `No`? if `Yes` There is an alternate method in my eyes! reply – Arshad Ali Mar 09 '13 at 18:39
  • @ArshadAliArshay `yes` I only want to download `image` from web this is not necessary to use `AsyncTask` this will be your grace to tell that alternate plz! –  Mar 09 '13 at 18:41

3 Answers3

2

You're calling doInBackground(Void... params) recursively instead of calling doInBackground(). Rename the latter to something else and calling that from doInBackground(Void... params).

Aert
  • 1,989
  • 2
  • 15
  • 17
  • I have changed the name of `doInBackground()` to `inBackground()` but still not getting results –  Mar 09 '13 at 08:23
  • Sorry to hear, but it's good practice to not do that either way! Does your logcat show any errors from your `Log` call or the `printStackTrace`? – Aert Mar 09 '13 at 08:45
  • No dear there is not any messages in `logcat` –  Mar 09 '13 at 09:33
  • or please tell me other way to download image from web to my emulator, if any –  Mar 09 '13 at 09:34
  • There are many ways to do it, and the code you posted should do the trick. When you say 'asynctask is never called', that would imply that your activity is never called as the asynctask is started from its `onCreate()`. Is the activity in your manifest.xml? – Aert Mar 09 '13 at 12:53
  • Yes this is my `MainActivity.java` –  Mar 09 '13 at 18:27
0

Execute all in doInBackground like this:

  public class MyAsnyc extends AsyncTask<Void, Void,Void>{
    public  File file ;
    InputStream is;

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

      try{
      File path = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
       file = new File(path, "DemoPicture.jpg");

              // Make sure the Pictures directory exists.
              path.mkdirs();

              URL url = new      URL(BASE_URL);
              /* Open a connection to that URL. */
              URLConnection ucon = url.openConnection();

              /*
               * Define InputStreams to read from the URLConnection.
               */
              is = ucon.getInputStream();

              OutputStream os = new FileOutputStream(file);
              byte[] data = new byte[is.available()];
              is.read(data);
              Log.d("MY_TAG>>>", "Picture is Readable...");
              os.write(data);
              Log.d("MY_TAG>>>", "Picture is Saved...");
              is.close();
              os.close();

          }
          catch (IOException e) {
              Log.d("ImageManager", "Error: " + e);
          }

        return null;
    }

  protected void onPostExecute()
   {

    try
    {
        // Tell the media scanner about the new file so that it is
        // immediately available to the user.

        MediaScannerConnection.scanFile(null,
                new String[] { file.toString() }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Log.i("ExternalStorage", "Scanned " + path + ":");
                Log.i("ExternalStorage", "-> uri=" + uri);
            }
        });
    }
    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

  }

 }
Gyonder
  • 3,674
  • 7
  • 32
  • 49
0

Ok! For download image to your Device/Emulator you should try this!!

First Create a Class as :

public class DownloadImage {    

public static File getImage(String imageUrl, String fileName){
    File file = null;
    try {
        //set the download URL, a url that points to a file on the internet
        //this is the file to be downloaded         
        URL url = new URL(imageUrl);
        Log.d("INFORMATION..", "FILE FOUNDED....");
        //create the new connection
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        //set up some things on the connection
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);

        //and connect!
        urlConnection.connect();
        Log.d("INFORMATION..", "FILE CONECTED....");
        //set the path where we want to save the file
        //in this case, going to save it on the root directory of the
        //sd card.
        File SDCardRoot = Environment.getExternalStorageDirectory();
        //create a new file, specifying the path, and the filename
        //which we want to save the file as.
        file = new File(SDCardRoot, fileName);

        //this will be used to write the downloaded data into the file we created
        FileOutputStream fileOutput = new FileOutputStream(file);
        Log.d("INFORMATION..", "WRINTING TO FILE DOWNLOADED...." + file);
        //this will be used in reading the data from the internet
        InputStream inputStream = urlConnection.getInputStream();

        //this is the total size of the file
        int totalSize = urlConnection.getContentLength();
        //variable to store total downloaded bytes
        int downloadedSize = 0;

        //create a buffer...
        byte[] buffer = new byte[1024];
        int bufferLength = 0; //used to store a temporary size of the buffer

        //now, read through the input buffer and write the contents to the file
        while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
            //add the data in the buffer to the file in the file output stream (the file on the sd card
            fileOutput.write(buffer, 0, bufferLength);
            //add up the size so we know how much is downloaded
            downloadedSize += bufferLength;
            Log.d("INFORMATION..", "FILE DOWNLOADED....");
            //this is where you would do something to report the prgress, like this maybe
            //updateProgress(downloadedSize, totalSize);

        }
        //close the output stream when done
        fileOutput.close();
        Log.d("INFORMATION..", "FILE DOWNLOADING COMPLETED....");
        //catch some possible errors...
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return file;
}
)

Call this DownloadImage.getImage(String imageUrl, String fileName) in MainActivity.java like this :

public class MainActivity extends Activity {

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

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

    String url = "http://4.bp.blogspot.com/-8v_k_fOcfP8/UQIL4ufghBI/AAAAAAAAEDo/9ffRRTM9AnA/s1600/android-robog-alone.png"; 

    String file = DownloadImage.getImage(url, "My Image.jpg").toString();

    // Get file path on device and set it to imageView
    Bitmap bitmap = BitmapFactory.decodeFile(file);
    imageView.setImageBitmap(bitmap);
}
}

I hope This will work according to your need!

Arshad Ali
  • 3,082
  • 12
  • 56
  • 99