Android 外部儲存空間可用於寫入和保存數據、讀取配置文件等。本文是 Android 內部儲存 教程系列的延續部分,探討 Android 中結構化數據儲存的相關教程。
Android 外部儲存
像 SD 卡之類的外部儲存空間也可以存儲應用程序數據,對於保存到外部儲存的文件,通常不強制實施安全性。一般來說,有兩種類型的外部儲存:
- 主要外部儲存:內建的共享儲存空間,可通過使用 USB 纜線連接並將其掛載為主機計算機上的驅動器而由用戶訪問。例如:當我們說 Nexus 5 32 GB 時。
- 次要外部儲存:可移動儲存。例如:SD 卡
所有應用程序都可以讀取和寫入放置在外部儲存上的文件,用戶可以將它們移除。我們需要檢查 SD 卡是否可用並且是否可以對其進行寫入。只有在檢查到外部儲存可用後,我們才能進行寫入,否則保存按鈕將被禁用。
Android 外部存儲示例項目結構
首先,我們需要確保應用程序有權限讀寫用戶 SD 卡的數據,因此讓我們打開
AndroidManifest.xml
並添加以下權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
此外,外部存儲可能被用戶掛載為 USB 存儲設備。因此,我們需要檢查外部存儲是否可用並且不是只讀的。
if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
saveButton.setEnabled(false);
}
private static boolean isExternalStorageReadOnly() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
return true;
}
return false;
}
private static boolean isExternalStorageAvailable() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
return true;
}
return false;
}
getExternalStorageState()
是 Environment
的靜態方法,用於確定外部存儲當前是否可用。如您所見,如果條件為 false,我們已禁用保存按鈕。
Android 外部存儲示例代碼
activity_main.xml 佈局定義如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Reading and Writing to External Storage"
android:textSize="24sp"/>
<EditText android:id="@+id/myInputText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" android:lines="5"
android:minLines="3" android:gravity="top|left"
android:inputType="textMultiLine">
<requestFocus />
</EditText>
<LinearLayout
android:layout_width="match_parent" android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1.0"
android:layout_marginTop="20dp">
<Button android:id="@+id/saveExternalStorage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SAVE"
android:layout_weight="0.5"/>
<Button android:id="@+id/getExternalStorage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:text="READ" />
</LinearLayout>
<TextView android:id="@+id/response"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:padding="5dp"
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
除了保存和從外部存儲讀取的按鈕之外,我們在文本視圖中顯示了保存/讀取到/從外部存儲的響應,不像之前的教程中顯示的是 Android 提示。MainActivity.java 類如下所示:
package com.journaldev.externalstorage;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import android.os.Bundle;
import android.app.Activity;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
EditText inputText;
TextView response;
Button saveButton,readButton;
private String filename = "SampleFile.txt";
private String filepath = "MyFileStorage";
File myExternalFile;
String myData = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inputText = (EditText) findViewById(R.id.myInputText);
response = (TextView) findViewById(R.id.response);
saveButton =
(Button) findViewById(R.id.saveExternalStorage);
saveButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
FileOutputStream fos = new FileOutputStream(myExternalFile);
fos.write(inputText.getText().toString().getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
inputText.setText("");
response.setText("SampleFile.txt saved to External Storage...");
}
});
readButton = (Button) findViewById(R.id.getExternalStorage);
readButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
FileInputStream fis = new FileInputStream(myExternalFile);
DataInputStream in = new DataInputStream(fis);
BufferedReader br =
new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
myData = myData + strLine;
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
inputText.setText(myData);
response.setText("SampleFile.txt data retrieved from Internal Storage...");
}
});
if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
saveButton.setEnabled(false);
}
else {
myExternalFile = new File(getExternalFilesDir(filepath), filename);
}
}
private static boolean isExternalStorageReadOnly() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
return true;
}
return false;
}
private static boolean isExternalStorageAvailable() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
return true;
}
return false;
}
}
- Environment.getExternalStorageState():返回內部 SD 掛載點的路徑,如“/mnt/sdcard”
- getExternalFilesDir():它返回 SD 卡上 Android/data/data/application_package/ 內部的文件夾的路徑。用於存儲應用程序所需的任何文件(例如從 Web 下載的圖像或緩存文件)。一旦應用被卸載,存儲在此文件夾中的任何數據也會消失。
另外,如果外部存儲不可用,我們將使用之前在本教程中討論過的 if 條件來禁用保存按鈕。下面是我們在 Android 模擬器中運行的應用程序,在這裡我們正在將數據寫入文件,然後讀取它。 注意: 確保您的 Android 模擬器配置為具有 SD 卡,如下圖所示的 AVD 對話框。轉到工具->Android->Android 虛擬設備,編輯配置->顯示高級設置。
這就結束了本教程。我們將在下一個教程中討論使用共享首選項進行存儲。您可以從下面的鏈接下載最終的 Android 外部存儲項目。
Source:
https://www.digitalocean.com/community/tutorials/android-external-storage-read-write-save-file