標籤:android學習筆記之資料的sdcar android操作sdcard卡
(1)檔案的目錄
(2)各檔案的代碼:
<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" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignRight="@+id/button1" android:layout_marginRight="44dp" android:layout_marginTop="78dp" android:src="@drawable/ic_launcher" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/imageView1" android:layout_marginLeft="96dp" android:layout_marginTop="106dp" android:text="Button" /></RelativeLayout>
FileService.java也就是操作sdcard的工具類:
package com.example.data_storage_sdcard.file;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import android.os.Environment;/** * sdcard的存在於上下文無關 * * @author piaodangdehun * */public class FileService {/* * 存放在sdcard的根目錄 */public boolean saveFileToSdcardRoot(String fileName, byte[] data) {boolean flag = false;/* * 先判斷sdcard的狀態,是否存在 */String state = Environment.getExternalStorageState();FileOutputStream outputStream = null;File rootFile = Environment.getExternalStorageDirectory(); // 獲得sdcard的根路徑/* * 表示sdcard掛載在手機上,並且可以讀寫 */if (state.equals(Environment.MEDIA_MOUNTED)) {File file = new File(rootFile, fileName);try {outputStream = new FileOutputStream(file);try {outputStream.write(data, 0, data.length);flag = true;} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}return flag;}/* * 存放在sdcard下自訂的目錄 */public boolean saveFileToSdcardDir(String fileName, byte[] data) {boolean flag = false;/* * 先判斷sdcard的狀態,是否存在 */String state = Environment.getExternalStorageState();FileOutputStream outputStream = null;File rootFile = Environment.getExternalStorageDirectory(); // 獲得sdcard的根路徑/* * 表示sdcard掛載在手機上,並且可以讀寫 */if (state.equals(Environment.MEDIA_MOUNTED)) {File file = new File(rootFile.getAbsoluteFile() + "/txt");if (!file.exists()) {file.mkdirs();}try {outputStream = new FileOutputStream(new File(file, fileName));try {outputStream.write(data, 0, data.length);flag = true;} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}return flag;}/* * 用於讀取sdcard的資料 */public String readContextFromSdcard(String fileName) {String state = Environment.getExternalStorageState();File rooFile = Environment.getExternalStorageDirectory(); // 獲得sdcard的目錄FileInputStream inputStream = null;// 用於度取資料的流ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 用於存放獨處的資料if (state.equals(Environment.MEDIA_MOUNTED)) {File file = new File(rooFile.getAbsoluteFile() + "/txt/");// 在sdcard目錄下建立一個txt目錄File file2 = new File(file, fileName);int len = 0;byte[] data = new byte[1024];if (file2.exists()) {try {inputStream = new FileInputStream(file2);try {while ((len = inputStream.read(data)) != -1) {outputStream.write(data, 0, data.length);}} catch (IOException e) {e.printStackTrace();}return new String(outputStream.toByteArray());} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}return null;}/** * 對檔案進行分類的儲存到固定的檔案中去 * * @param fileName * @param data */public void saveFileToSdcardBySuff(String fileName, byte[] data) {// File file = Environment.getExternalStoragePublicDirectory("");// 儲存檔案的目錄File file = null;if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {/* * 將不同的檔案放入到不同的類別中 */if (fileName.endsWith(".mp3")) {file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);} else if (fileName.endsWith(".jpg") || fileName.endsWith(".png")|| fileName.endsWith(".gif")) {file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);} else if (fileName.endsWith(".mp4") || fileName.endsWith(".avi")|| fileName.endsWith(".3gp")) {file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);} else {file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);}FileOutputStream outputStream = null;try {outputStream = new FileOutputStream(new File(file, fileName));try {outputStream.write(data, 0, data.length);} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}/* * 刪除一個檔案 */public boolean deleteFileFromSdcard(String folder, String fileName) {boolean flag = false;File file = Environment.getExternalStorageDirectory();if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File exitFile = new File(file.getAbsoluteFile() + "/" + folder);if (exitFile.exists()) {exitFile.delete();}}return flag;}}
HttpUtils.java訪問網路的
package com.example.data_storage_sdcard.http;import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;public class HttpUtils {/* * */public static byte[] getImage(String path) {byte[] data = null;HttpClient httpClient = new DefaultHttpClient();HttpPost httpPost = new HttpPost(path);try {HttpResponse response = httpClient.execute(httpPost);if (response.getStatusLine().getStatusCode() == 200) {data = EntityUtils.toByteArray(response.getEntity());}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {httpClient.getConnectionManager().shutdown();}return data;}}
ImageCache.java將檔案放到cache中的:
package com.example.data_storage_sdcard.img;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import android.os.Environment;public class ImageCache {public static String saveImageCache(String fileName, byte[] data) {File file = Environment.getExternalStorageDirectory(); // 根目錄FileOutputStream outputStream = null;if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {try {outputStream = new FileOutputStream(new File(file, fileName));outputStream.write(data, 0, data.length);return file.getAbsolutePath() + "/" + fileName;} catch (Exception e) {e.printStackTrace();} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}return null;}}
MainActivity.java
package com.example.data_storage_sdcard;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.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import com.example.data_storage_sdcard.http.HttpUtils;import com.example.data_storage_sdcard.img.ImageCache;public class MainActivity extends Activity {private Button button;private ImageView imageView;private ProgressDialog progressDialog;private String imageName;private final String pathString = "http://www.baidu.com/img/bd_logo1.png";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (Button) this.findViewById(R.id.button1);imageView = (ImageView) this.findViewById(R.id.imageView1);progressDialog = new ProgressDialog(this);progressDialog.setTitle("下載提示");progressDialog.setMessage("load...");button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new MyTask().execute(pathString);}});}class MyTask extends AsyncTask<String, Void, byte[]> {@Overrideprotected void onPreExecute() {super.onPreExecute();progressDialog.show();}@Overrideprotected byte[] doInBackground(String... params) {String name = params[0];imageName = name.substring(name.lastIndexOf("/") + 1, name.length());return HttpUtils.getImage(params[0]);}@Overrideprotected void onProgressUpdate(Void... values) {super.onProgressUpdate(values);}@Overrideprotected void onPostExecute(byte[] result) {super.onPostExecute(result);if (result != null) {Bitmap bm = BitmapFactory.decodeByteArray(result, 0,result.length);imageView.setImageBitmap(bm);ImageCache.saveImageCache("", result);} else {imageView.setImageResource(R.drawable.ic_launcher);}progressDialog.dismiss();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
測試類別:
package com.example.data_storage_sdcard;import java.io.FileWriter;import com.example.data_storage_sdcard.file.FileService;import android.nfc.Tag;import android.test.AndroidTestCase;import android.util.Log;public class MyTest extends AndroidTestCase {public void saveFileToSdcardTest() {FileService fileService = new FileService();fileService.saveFileToSdcardRoot("aa.txt","jkhdsfjkhdskjfhdsjf".getBytes());}public void saveFileToSdcardDir() {FileService fileService = new FileService();fileService.saveFileToSdcardRoot("aa.txt","jkhdsfjkhdskjfhdsjf".getBytes());}public void readContextFromSdcardTest() {FileService fileService = new FileService();String msg = fileService.readContextFromSdcard("aa.txt");System.err.println("-->" + msg);}public void saveFileToSdcardBySuffTest() {FileService fileService = new FileService();fileService.saveFileToSdcardBySuff("aa.avi","asdfkajsgdhagsdfhdgsf".getBytes());}public void delFile() {FileService fileService = new FileService();boolean flag = fileService.deleteFileFromSdcard("txt", "aa.txt");}}
需要在請單位按中加入訪問網路的許可權、操作sdcard的許可權、測試的許可權
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.data_storage_sdcard" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.data_storage_sdcard" > </instrumentation> <!-- 添加訪問sdcard的許可權 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 添加訪問網路的許可權 --> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="android.test.runner" /> <activity android:name="com.example.data_storage_sdcard.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> <uses-library> </uses-library> </application></manifest>
Android學習筆記之資料的Sdcard儲存方法及操作sdcard的工具類