android 存儲網絡數據到Sdcard

android 使用HTTP下載網絡圖片並保存到Sdcard卡

本文實現了兩個功能:
1、從網絡下載圖片。
2、將圖片保存到Sdcard卡。

文件目錄:
這裏寫圖片描述
效果圖:
這裏寫圖片描述

先創建兩個類,分別實現兩個功能。

HTTP類,從網絡下載圖片:

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class HTTP {
    /**
     * 從path下載數據並且返回
     * @param path
     * @return
     */
    public static byte[] httpData(String path){
        //獲取HttpClient類
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(path);
        byte[] data = null;
        try {
            HttpResponse response = client.execute(get);
            //是否連接成功
            if(response.getStatusLine().getStatusCode() == 200){
                data = EntityUtils.toByteArray(response.getEntity());
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return data;
    }
}

Save類,保存數據到Sdcard卡:
該類實現了從程序存儲數據到SD卡,以及從SD卡讀取數據到程序。
Log.i(“Save”, “—>>” + file);//輸出文件保存目錄,可以在File Explorer 中對應目錄查找文件是否保存成功。

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import android.os.Environment;
import android.util.Log;

public class Save {
    /**
     * 存取數據到內存卡
     * 
     * @param fileName
     * @param data
     * @return
     */
    public static boolean saveFileToSdcard(String fileName, byte[] data) {
        boolean flag = false;
        //保存數據到Sdcard步湊:
        //1、獲取Sdcard卡的目錄
        File file = Environment.getExternalStorageDirectory();
        FileOutputStream outputStream = null;
        Log.i("Save", "--saveFileToSdcard->>");
        //2、判斷Sdcard的狀態是否爲掛載
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            Log.i("Save", "--if->>");
            try {
        //3、使用Sdcard目錄和需要保存文件的文件名實例化一個File對象,使用該對象創建一個文件輸出流
                outputStream = new FileOutputStream(new File(file, fileName));
        //4.將需要保存的數據寫入輸出流
                outputStream.write(data, 0, data.length);
                flag = true;
                Log.i("Save", "--->>" + file);//輸出文件保存目錄
        //5.關閉流
                outputStream.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.i("Save", "--catch->>");
            }
        }
        return flag;
    }

    /**
     * 從sdcard讀取指定文件
     * 
     * @param fileName
     * @return
     */
    public static byte[] readFileToSdcard(String fileName) {
        byte[] data = new byte[1024];
        int len = 0;
//讀取數據和寫數據步湊類似
        File root = Environment.getExternalStorageDirectory();
        FileInputStream fileInputStream = null;
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            try {
                fileInputStream = new FileInputStream(new File(root, fileName));
                while ((len = fileInputStream.read(data)) != -1) {
                    arrayOutputStream.write(data, 0, len);
                }
                fileInputStream.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return arrayOutputStream.toByteArray();

    }
}

MainActivity類文件:

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

import com.example.class_storage_sdcard1.HTTP.HTTP;
import com.example.class_storage_sdcard1.SAVE.Save;

public class MainActivity extends Activity {
    private final String PATH = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png";//下載圖片的地址
    private ProgressDialog dialog;
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dialog = new ProgressDialog(this);//建立一個進度條對話框
        dialog.setTitle("提示!");
        dialog.setMessage("正在下載圖片並保存到本地……");
        dialog.setCancelable(false);
        imageView = (ImageView)findViewById(R.id.imageView1);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
        //按鍵觸發下載
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new MyTast().execute(PATH);//使用下載地址創建一個線程
            }
        });
    }
//自定義一個線程,在線程中完成下載操作
    class MyTast extends AsyncTask<String, Void, byte[]> {
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            dialog.show();//彈出對話框
        }

        @Override
        protected byte[] doInBackground(String... params) {
            // TODO Auto-generated method stub

            return HTTP.httpData(params[0]);//調用HTTP工具類下載數據並且返回
        }

        @Override
        protected void onPostExecute(byte[] result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Save.saveFileToSdcard("logo.png", result);//將數據保存到Sdcard
            Bitmap bm = BitmapFactory.decodeByteArray(Save.readFileToSdcard("logo.png"), 0, result.length);
            //使用位圖工廠將創建位圖
            //從Sdcard讀取圖片數據,並且加載到ImagerView
            imageView.setImageBitmap(bm);
            dialog.dismiss();
        }
    }
}

XML佈局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" 
    android:background="#cccccc">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="38dp"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="92dp"
        android:text="下載" />

</RelativeLayout>

還有非常重要的兩點:

1、要操作Sdcard,要清單文件中需要加載權限。
2、連接網絡需要在清單文件中加載權限。

清單文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.class_storage_sdcard1"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="18" />
    <!-- 網絡權限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 外部存儲器 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.class_storage_sdcard1.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

http://blog.csdn.net/q296264785/article/details/53155739

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章