Android ApiDemos示例解析(50):Content->Resources->External Storage

應用程序也可以使用外部存儲空間,比如SD卡來存取資源。本例介紹瞭如何使用外部存儲空間來創建,刪除文件。

本例使用SD卡的三個位置來創建文件,兩個是應用程序私有的,隨著應用程序的刪除被刪除,另外一個是共用的SD卡上Picuture目錄。兩個私有目錄說是私有,但由於是在SD卡,別的應用程序也是可以訪問的,隻是它創建的目錄名和應用程序相關,一般來說可以保證目錄名的唯一性。

 

類Environment 可以用來查詢一些環境變量,比如是否含有外部存儲器(SD卡),外部存儲器的目錄名等。下面代碼取得外部存儲器上Picture目錄名:

[java] 
//createExternalStoragePublicPicture  
File path = Environment.getExternalStoragePublicDirectory( 
 Environment.DIRECTORY_PICTURES); 
File file = new File(path, "DemoPicture.jpg"); 
//createExternalStoragePublicPicture
File path = Environment.getExternalStoragePublicDirectory(
 Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");
而Context類的getExternalFilesDir 可以取得應用程序在外部存儲器的私有目錄,getExternalFilesDir可以帶參數,也可以使用Null。

[java] 
//createExternalStoragePrivatePicture  
File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
File file = new File(path, "DemoPicture.jpg"); 
  
 … 
//createExternalStoragePrivateFile  
File file = new File(getExternalFilesDir(null), "DemoFile.jpg"); 
//createExternalStoragePrivatePicture
File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");
 
 …
//createExternalStoragePrivateFile
File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
三種方法創建的對應著SD卡的位置如下圖所示:


此外本例還同時說明瞭一種自定義View以及動態在ViewGroup在添加View的方法,本例使用的兩個Layout資源:

R.layout.external_storage為整體佈局,根View為一Id為R.id.layout 的LinearLayout。

R.layout.external_storage_item 為一自定義控件,有多個View組成:

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”match_parent” android:layout_height=”wrap_content”>
<TextView android:id=”@+id/label” style=”?android:attr/textAppearanceMediumInverse”
android:layout_width=”match_parent” android:layout_height=”wrap_content”
android:layout_weight=”0″
android:padding=”4dip”
android:singleLine=”true”
android:color=”?android:attr/textColorPrimaryInverse”
android:background=”#888″ />
< TextView android:id=”@+id/path” style=”?android:attr/textAppearanceSmall”
android:layout_width=”match_parent” android:layout_height=”wrap_content”
android:layout_weight=”0″
android:padding=”4dip”
android:singleLine=”true” />
<LinearLayout
android:orientation=”horizontal”
android:layout_width=”match_parent” android:layout_height=”wrap_content”>
<View
android:layout_width=”0dip”
android:layout_height=”0dip”
android:layout_weight=”1″ />
< Button android:id=”@+id/create”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_weight=”1″
android:text=”@string/create” />
<View
android:layout_width=”0dip”
android:layout_height=”0dip”
android:layout_weight=”1″ />
< Button android:id=”@+id/delete”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_weight=”1″
android:text=”@string/delete” />
<View
android:layout_width=”0dip”
android:layout_height=”0dip”
android:layout_weight=”1″ />
< /LinearLayout>
< /LinearLayout>

上面三個粗體定義的無ID的View為兩個按鈕Create, Delete之間的占位符。

 

方法createStorageControls 使用R.layout.external_storage_item 為模板重新定義文本框顯示以及Create,Delete的回調函數。

然後動態將三個自定義組件添加到Layout中,這就構成瞭最後的UI。

[java] 
mLayout.addView(mExternalStoragePublicPicture.mRoot); 
mLayout.addView(mExternalStoragePrivatePicture.mRoot); 
mLayout.addView(mExternalStoragePrivateFile.mRoot); 
mLayout.addView(mExternalStoragePublicPicture.mRoot);
mLayout.addView(mExternalStoragePrivatePicture.mRoot);
mLayout.addView(mExternalStoragePrivateFile.mRoot);

 作者:mapdigit
 

 

 

發佈留言