从URL图像下载到SD卡 [英] Download Images From URL to SD Card

查看:168
本文介绍了从URL图像下载到SD卡的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个非常简单的图片下载应用程序。其中我想从这个网址的所有图像下载到SD卡: https://www.dropbox.com/sh/5be3kgehyg8uzh2/AAA-jYcy_21nLBwnZQ3TBFAea

这code工作负载形象ImageView的:

 包com.example.imagedownloadsample;

进口android.os.Bundle;
进口android.support.v7.app.ActionBarActivity;
进口android.widget.ImageView;

进口com.squareup.picasso.Picasso;

公共类MainActivity扩展ActionBarActivity {

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.image_download);

        最后ImageView的IMG =(ImageView的)(findViewById(R.id.imageView1));

        //档案文件=新的文件(Environment.getExternalStorageDirectory()
        //的Andr​​oid /数据/ com.usd.pop);

        Picasso.with(getApplicationContext())
                .load(http://8020.photos.jpgmag.com/3456318_294166_528c960558_m.jpg)
                。走进(IMG);

    }

}
 

但是当我试图这样来下载图片到SD卡我最终与可惜的是应用程序停止错误:

 包com.example.imagedownloadsample;

进口的java.io.File;

进口android.os.Bundle;
进口android.os.Environment;
进口android.support.v7.app.ActionBarActivity;

进口com.squareup.picasso.Picasso;
进口com.squareup.picasso.Target;

公共类MainActivity扩展ActionBarActivity {

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.image_download);

        //最后ImageView的IMG =(ImageView的)(findViewById(R.id.imageView1));

         档案文件=新的文件(Environment.getExternalStorageDirectory()
         安卓/数据/ com.usd.pop);

        Picasso.with(getApplicationContext())
                .load(http://8020.photos.jpgmag.com/3456318_294166_528c960558_m.jpg)
                。走进((目标)文件);

    }

}
 

解决方案

您可以使用此的AsyncTask ,这样你就不会得到 OnMainThread 例外。

 类DownloadFile扩展的AsyncTask<字符串,整数,龙> {
    ProgressDialog mProgressDialog =新ProgressDialog(MainActivity.this); //改变Mainactivity.this您的活动名称。
    字符串strFolderName;
    @覆盖
    在preExecute保护无效(){
        super.on preExecute();
        mProgressDialog.setMessage(下载);
        mProgressDialog.setIndeterminate(假);
        mProgressDialog.setMax(100);
        mProgressDialog.setCancelable(真正的);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.show();
    }
    @覆盖
    保护龙doInBackground(字符串... aurl){
        诠释计数;
        尝试 {
            网址URL =新的URL((字符串)aurl [0]);
            URLConnection的体conexion = url.openConnection();
            conexion.connect();
            字符串targetFileName =姓名+RAR。; //更改名称和子名称
            INT lenghtOfFile = conexion.getContentLength();
            字符串PATH = Environment.getExternalStorageDirectory()+/+ downloadFolder +/;
            文件夹=新的文件(路径);
            如果(!folder.exists()){
                folder.mkdir(); //如果没有将被创建的文件夹。
            }
            的InputStream输入=新的BufferedInputStream(url.openStream());
            的OutputStream输出=新的FileOutputStream(PATH + targetFileName);
            字节的数据[] =新的字节[1024];
            总长= 0;
            而((计数= input.read(数据))!=  -  1){
                共有+ =计数;
                       publishProgress((int)的(总* 100 / lenghtOfFile));
                output.write(数据,0,计数);
            }
            output.flush();
            output.close();
            input.close();
        }赶上(例外五){}
        返回null;
    }
    保护无效onProgressUpdate(整数...进度){
         mProgressDialog.setProgress(进展[0]);
         如果(mProgressDialog.getProgress()== mProgressDialog.getMax()){
            mProgressDialog.dismiss();
            Toast.makeText(FA,文件下载,Toast.LENGTH_SHORT).show();
         }
    }
    保护无效onPostExecute(字符串结果){
    }
}
 

复制这个类到你的活动。它不能是在另一种方法。

和您可以调用这个像 新DownloadFile()执行(yoururl);

此外,将这些权限添加到您的清单。

 <使用-权限的Andr​​oid:名称=android.permission.INTERNET对> < /使用-许可>
  <使用-权限的Andr​​oid:名称=android.permission.WRITE_EXTERNAL_STORAG​​E>< /使用-许可>
 <使用-权限的Andr​​oid:名称=android.permission.READ_PHONE_STATE>< /使用-许可>
 

I am trying to create a very simple Image Downloading app. in which i want to download all images from this url to sd card: https://www.dropbox.com/sh/5be3kgehyg8uzh2/AAA-jYcy_21nLBwnZQ3TBFAea

this code works to load image in imageview:

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

    }

}

but when i tried like this to download image to sd card i end-up with unfortunatelly app stopped error:

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

    }

}

解决方案

You can use this AsyncTask, so that you don't get OnMainThread exception.

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

Copy this class into your activity. It mustn't be in another method.

And you can call this like new DownloadFile().execute("yoururl");

Also, add these permissions to your manifest.

  <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>

这篇关于从URL图像下载到SD卡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆