2010年10月17日星期日

使用getExternalFilesDir()訪問外部存儲上的文件

Android提供了幾個保存持久應用程序數據的方法. 可根據具體需求來選擇解決方案, 如數據是否應用程序私有的或其他應用程序(用戶)可訪問的, 和需要多少空間. 其中一個方法是使用外部存儲(External Storage).

每個 Android兼容的設備支持共享"外部存儲",你可以用它來保存文件. 這可以是一個可移動存儲介質(如SD卡)或內部(不可移動)存儲. 文件保存到外部存儲是全世界可讀的, 當啟用電腦USB存儲傳輸文件時可以修改的.

首先, 調用getExternalStorageState()檢查是否有可用的媒體.

訪問外部存儲上的文件 -

如果使用API Level 8(Android 2.2)或以上, 使用getExternalFilesDir()來打開一個文件, 表示你應該保存文件在該外部存儲目錄. 這個方法接受一個類型參數指定子目錄的類型; 如DIRECTORY_MUSIC和DIRECTORY_RINGTONES(傳遞 null, 以得到應用程序文件的根目錄). 此方法將創建相應的目錄. 通過指定類型的目錄, 確保在Android的媒體掃描器可以適當的分類你的文件(例如, 鈴聲被確定為不鈴聲和音樂). 如果用戶卸載(uninstall)應用程序,這個目錄及其所有內容將被刪除.

如果你使用API Level 7或以下, 使用getExternalStorageDirectory()打開一個文件表示外部存儲的根目錄, 你應該在下面的目錄寫入你的數據:

/Android/data/<package_name>/files/

例子:




main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Very simple code to copy a picture from the application's resource into the external file"
/>
<TextView
android:id="@+id/info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>


AndroidExternalFiles.java

package com.AndroidExternalFiles;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;

public class AndroidExternalFiles extends Activity {

TextView textInfo;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textInfo = (TextView)findViewById(R.id.info);

String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
createExternalStoragePrivateFile();
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
textInfo.setText("The media is Read Only!");
} else {
textInfo.setText("Something Wrong!");
}
}

void createExternalStoragePrivateFile() {
// Create a path where we will place our private file on external
// storage.
File file = new File(getExternalFilesDir(null), "myFile.jpg");

try {
// Very simple code to copy a picture from the application's
// resource into the external file.
InputStream is = getResources().openRawResource(R.drawable.icon);
OutputStream os = new FileOutputStream(file);
byte[] data = new byte[is.available()];
is.read(data);
os.write(data);
is.close();
os.close();
textInfo.setText("File have been wrote.");
} catch (IOException e) {
// Unable to create file, likely because external storage is
// not currently mounted.
textInfo.setText("IOException: " + e.toString());
}
}
}


在AndroidManifest.xml加入"android.permission.WRITE_EXTERNAL_STORAGE"權限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.AndroidExternalFiles"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".AndroidExternalFiles"
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>
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

沒有留言:

發佈留言