1

私はAndroidを初めて使用しますimagesWebからエミュレーターにダウンロードしたい 私は見ました これ、私の問題もそのままです。しかし、私はこれをしました:

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

    }
}

}

しかし、AsyncTaskこれを解決する方法とウェブから画像をダウンロードする方法を教えてください。

4

3 に答える 3

2

doInBackground(Void... params)を呼び出すのではなく、再帰的に呼び出していますdoInBackground()。後者の名前を別の名前に変更し、それを から呼び出しdoInBackground(Void... params)ます。

于 2013-03-09T08:02:24.677 に答える
0

Ok!デバイス/エミュレーターにイメージをダウンロードするには、これを試してください!!

最初に as を作成しますClass:

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

DownloadImage.getImage(String imageUrl, String fileName)これを次のMainActivity.javaように呼び出します。

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

これがあなたの必要に応じて機能することを願っています!

于 2013-03-09T18:52:40.227 に答える
0

次のように doInBackground ですべて実行します。

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

  }

 }
于 2013-03-09T09:45:06.310 に答える