Загрузка изображений с URL на SD-карту

Я пытаюсь создать очень простое приложение для загрузки изображений. В котором я хочу загрузить все изображения с этого URL-адреса на SD-карту: https://www.dropbox.com/sh/5be3kgehyg8uzh2/AAA-jYcy_21nLBwnZQ3TBFAea

Этот код работает для загрузки изображения в режиме просмотра изображений:

 package com.example.imagedownloadsample; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.widget.ImageView; import com.squareup.picasso.Picasso; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image_download); final ImageView img = (ImageView) (findViewById(R.id.imageView1)); // File file = new File(Environment.getExternalStorageDirectory(), // "Android/data/com.usd.pop"); Picasso.with(getApplicationContext()) .load("http://8020.photos.jpgmag.com/3456318_294166_528c960558_m.jpg") .into(img); } } 

Но когда я пробовал как это скачать изображение на SD-карту, я в конечном итоге с неудачным приложением остановил ошибку:

 package com.example.imagedownloadsample; import java.io.File; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.ActionBarActivity; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image_download); //final ImageView img = (ImageView) (findViewById(R.id.imageView1)); File file = new File(Environment.getExternalStorageDirectory(), "Android/data/com.usd.pop"); Picasso.with(getApplicationContext()) .load("http://8020.photos.jpgmag.com/3456318_294166_528c960558_m.jpg") .into((Target) file); } } 

Используйте Picasso и загрузите в цель

Я согласен с ответом Ичиго Куросаки выше. Вот подробный пример того, как вы можете использовать Picasso и Picasso Target.

Как вы называете код Пикассо

 Picasso.with(ImageDetailActivity.this).load( galleryObjects.get(mViewPager.getCurrentItem()).fullImagePath).into(target); 

Пример Пикассо

 private Target target = new Target() { @Override public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { new Thread(new Runnable() { @Override public void run() { File file = new File( Environment.getExternalStorageDirectory().getPath() + "/saved.jpg"); try { file.createNewFile(); FileOutputStream ostream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG,100,ostream); ostream.close(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } @Override public void onBitmapFailed(Drawable errorDrawable) {} @Override public void onPrepareLoad(Drawable placeHolderDrawable) {} }; 

Вы можете использовать эту AsyncTask , так что вы не получите исключение OnMainThread .

  class DownloadFile extends AsyncTask<String,Integer,Long> { ProgressDialog mProgressDialog = new ProgressDialog(MainActivity.this);// Change Mainactivity.this with your activity name. String strFolderName; @Override protected void onPreExecute() { super.onPreExecute(); mProgressDialog.setMessage("Downloading"); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setCancelable(true); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.show(); } @Override protected Long doInBackground(String... aurl) { int count; try { URL url = new URL((String) aurl[0]); URLConnection conexion = url.openConnection(); conexion.connect(); String targetFileName="Name"+".rar";//Change name and subname int lenghtOfFile = conexion.getContentLength(); String PATH = Environment.getExternalStorageDirectory()+ "/"+downloadFolder+"/"; File folder = new File(PATH); if(!folder.exists()){ folder.mkdir();//If there is no folder it will be created. } InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream(PATH+targetFileName); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; publishProgress ((int)(total*100/lenghtOfFile)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) {} return null; } protected void onProgressUpdate(Integer... progress) { mProgressDialog.setProgress(progress[0]); if(mProgressDialog.getProgress()==mProgressDialog.getMax()){ mProgressDialog.dismiss(); Toast.makeText(fa, "File Downloaded", Toast.LENGTH_SHORT).show(); } } protected void onPostExecute(String result) { } } 

Скопируйте этот класс в свою деятельность. Это не должно быть другим способом.

И вы можете назвать это как new DownloadFile().execute(“yoururl”);

Кроме того, добавьте эти разрешения в манифест.

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

Проверьте эти ссылки

Зачем использовать библиотеку Android Picasso для загрузки изображений?

http://www.opensourcealternative.org/tutorials/android-tutorials/android-picasso-save-image-tutorial/

http://www.101apps.co.za/articles/gridview-tutorial-using-the-picasso-library.html

http://www.youtube.com/watch?v=tRTFwzUH_ek

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

Используя Picasso, ваш код будет иметь только 1 строку

 Picasso.with(context).load("your URL").into(your_imageView); 

Для хранения на внешней SD-карте

Android-файл для сохранения на внешнем хранилище

Запись файла на внешнем накопителе в Android

http://www.javatpoint.com/android-external-storage-example

Используя picasso для сохранения изображений на SD-карте, вы можете сделать что-то вроде следующего

 private Target mTarget = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // Perform simple file operation to store this bitmap to your sd card } @Override public void onBitmapFailed(Drawable errorDrawable) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } } ... Picasso.with(this).load("url").into(mTarget); 

Здесь «Target» – это класс, предоставляемый picasso, и он имеет очень простой способ понять …
Надеюсь, это удовлетворит ваши потребности

Aquery – это самый быстрый и простой способ загрузки изображения с url на SDCard.

 try { String url=" "; \\Paste the Url. aq.id(R.id.img).progress(R.id.progress).image(Url, true, true, 0, 0, new BitmapAjaxCallback() { @Override public void callback(String url, ImageView iv,Bitmap bm, AjaxStatus status) { iv.setImageBitmap(bm); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] b = baos.toByteArray(); String EnString = Base64.encodeToString(b,Base64.DEFAULT); File SDCardRoot = Environment.getExternalStorageDirectory().getAbsoluteFile(); File dir = new File(SDCardRoot.getAbsolutePath()+ "/Aquery" + "/Image"); //Download the Image In Sdcard dir.mkdirs(); try { if (!SDCardRoot.equals("")) { String filename = "img"+ new Date().getTime() + ".png"; File file = new File(dir, filename); if (file.createNewFile()) { file.createNewFile(); } if (EnString != null) { FileOutputStream fos = new FileOutputStream(file); byte[] decodedString = android.util.Base64.decode(EnString, android.util.Base64.DEFAULT); fos.write(decodedString); fos.flush(); fos.close(); } } } } catch (Exception e) { } }); } catch (Exception e) { } 

Для получения дополнительной информации нажмите здесь http://androiddhina.blogspot.in/2015/03/androiddownload-image-using-aquery.html