Android SDCard操作(文件读写,容量计算)(An-Beer 工作室)
android读写文件权限流程

Android读写文件权限流程概述在A nd ro id开发中,应用程序需要获取特定的权限以便能够读取和写入设备上的文件。
本文将介绍An dr oi d中读写文件权限的流程,帮助开发者了解如何正确处理文件访问权限相关的问题。
为什么需要文件权限A n dr oi d系统为了保护用户的隐私和数据安全,对应用程序的文件访问进行了限制。
如果应用程序想要读取或写入设备上的文件,必须首先获取相应的权限。
否则,在没有权限的情况下进行文件操作将会引发安全异常。
文件读取权限步骤1:在A n d r o i dM a n i f e s t.x m l中声明权限要读取设备上的文件,首先需要在应用的清单文件(A nd ro id Ma ni fe st.xm l)中声明文件读取权限。
可以使用以下代码将读取权限添加到清单文件中:<u se s-p e rm is si on an dr oid:na me="an dr oi d.p e rm is si on.R EA D_E X TE RN AL_ S T OR AG E"/>这个权限允许应用程序读取外部存储(如S D卡)上的文件。
步骤2:检查权限在代码中进行文件读取操作前,需要先检查应用是否已经获得了文件读取权限。
可以使用以下代码来检查权限:i f(C on te xt Co mp at.c he ck Se lf Pe rm iss i on(c on te xt,M ani f es t.p e r mi ss io n.RE AD_EX T ER NA L_ST OR AG E)!=Pa ck ag eM an ag er.P ER MI SS I O N_G RA NT ED){//没有读取权限,请求权限}e ls e{//已经有读取权限,进行文件读取操作}步骤3:请求权限如果在步骤2中检查到没有读取权限,应该向用户请求获取该权限。
Android8.0读取内部和外部存储以及外置SDcard的方法

Android8.0读取内部和外部存储以及外置SDcard的⽅法最近碰到询问我这个读取SDcard的问题,很久没有看这部分了,所以⼤致看了⼀下,顺便记录⼀下。
在Android 8.0上做了测试。
⼀般的Android App能读取的存储空间主要有三种:app⾃⼰的私有⽬录,也就是/data/data/《app ⽬录》。
读写这个⽬录不需要单独的权限。
每个app只能读写⾃⼰的⽬录,⽽不能读写其他app的⽬录。
Android通过Seandroid对权限进⾏了管理。
/sdcard。
这个其实是Android⼿机的internal storage。
也就是⼀般你买⼿机的时候,说⼿机是64GB的存储空间,就是说的这个地⽅。
这个地⽅的读写需要申请权限。
READ_EXTERNAL_STORAGE 是读, WRITE_EXTERNAL_STORAGE 是写,有写的权限就⾃动有读的权限。
这个权限是正对整个/sdcard,不区分⼦⽬录,也就是说⼀旦你申请权限你可以对整个/sdcard上的所有⽂件和⽬录有操作权限。
这个权限的管理会显⽰再settings⾥相应的app permission⾥。
外置sdcard这个对应的是你放⼊⼿机sdcard插槽的microSD卡。
有时候也叫removable storage。
Android⾥⽆法通过申请权限来获取读写的权利。
这⼀点和上⾯说的2不同。
因此,如果需要获取写权限,需要⽤户指定特定的⽬录单独授权。
这⾥举个简单的例⼦。
如果外置sdcard的路径是/mnt/extsdcard,然后上⾯有两个⽬录a和b,那么你可以让⽤户授权你写/mnt/extsdcard/a, 但是你还需要让⽤户再单独授权你写/mnt/extsdcard/b,也就是要授权两次。
具体的实现⽅法,就不多说了, google再github上给了个,其中的wiki页⾯有⽐较详细的描述。
特别要说明的是,由于这个没有对应的android permission,所以如果你得到授权以后,对应的⽬录路径不会显⽰再settings 中的app permission。
Android开发——使用Gallery实现“多级联动”(An-Beer工作室)

Android开发——使用Gallery实现“多级联动”2010-08-07 09:14 by HalZhang, 578 visits, 网摘, 收藏, 编辑本文将讲解利用两个Gallery实现类似多级联动的功能。
先看图:,一个Gallery是歌曲专辑图片,另一个Gallery是专辑的歌曲。
滑动专辑Gallery,下面的歌曲也会随之发生变动。
一、布局。
主要的布局是有两个相对布局+两个Gallery组成的:1:<?xml version="1.0"encoding="utf-8"?>2:<RelativeLayout xmlns:android="/apk/res/android"3:android:layout_width="fill_parent"4:android:layout_height="fill_parent">5:<!-- 专辑 -->6:<Gallery android:id="@+id/gallery"7:android:layout_width="fill_parent"8:android:layout_height="wrap_content"9:android:layout_alignParentTop="true"10:android:gravity="center_horizontal"11:android:spacing="16dp"12:android:unselectedAlpha="0.5"/>13:<!-- 歌曲 -->14:<Gallery android:id="@+id/gallery2"15:android:background="#FFF"16:android:layout_width="fill_parent"17:android:layout_height="30dp"18:android:layout_below="@id/gallery"19:android:layout_alignParentLeft="true"20:android:gravity="center_vertical"21:android:spacing="16dp"22:android:unselectedAlpha="0.5"/>23:</RelativeLayout>二、Gallery的适配器在android中适配器很好的实现了MVC思想,它很好的为某些组件提供了数据和view的实现。
Android SDCard操作(文件读写,容量计算)

Android SDCard操作(文件读写,容量计算)android.os.Environment提供访问环境变量ng.Objectandroid.os.EnvironmentEnvironment 静态方法:方法: getDataDirectory ()返回: File解释: 返回Data的目录方法: getDownloadCacheDirectory ()返回: File解释: 返回下载缓冲区目录方法: getExternalStorageDirectory ()返回: File解释: 返回扩展存储区目录(SDCard)方法: getExternalStoragePublicDirectory (String type)返回: File解释: 返回一个高端的公用的外部存储器目录来摆放某些类型的文件(来自网上)方法: getRootDirectory ()返回: File解释: 返回Android的根目录方法: getExternalStorageState ()返回: String解释: 返回外部存储设备的当前状态getExternalStorageState () 返回的状态String类型常量:常量: MEDIA_BAD_REMOVAL值 : "bad_removal"解释: 在没有正确卸载SDCard之前移除了常量:MEDIA_CHECKING值 : "checking"解释: 正在磁盘检查常量: MEDIA_MOUNTED值 : "mounted"解释: 已经挂载并且拥有可读可写权限常量: MEDIA_MOUNTED_READ_ONLY值 : "mounted_ro"解释: 已经挂载,但只拥有可读权限常量:MEDIA_NOFS值 : "nofs"解释: 对象空白,或者文件系统不支持常量: MEDIA_REMOVED值 : "removed"解释: 已经移除扩展设备常量: MEDIA_SHARED值 : "shared"解释: 如果SDCard未挂载,并通过USB大容量存储共享常量: MEDIA_UNMOUNTABLE值 : "unmountable"解释: 不可以挂载任何扩展设备常量: MEDIA_UNMOUNTED值 : "unmounted"解释: 已经卸载使用时只需先判断SDCard当前的状态然后取得SdCard的目录即可(见源代码)1//SDcard 操作2public void SDCardTest() {3// 获取扩展SD卡设备状态4 String sDStateString = android.os.Environment.g etExternalStorageState();56// 拥有可读可写权限7if (sDStateString.equals(android.os.Environment. MEDIA_MOUNTED)) {89try {1011// 获取扩展存储设备的文件目录12 File SDFile = android.os.Environment13 .getExternalStorageDirectory();1415// 打开文件16 File myFile = new File(SDFile.getAbsoluteP ath()17 + File.separator + "MyFile.txt");1819// 判断是否存在,不存在则创建20if (!myFile.exists()) {21 myFile.createNewFile();22 }2324// 写数据25 String szOutText = "Hello, World!";26 FileOutputStream outputStream = new FileOu tputStream(myFile);27 outputStream.write(szOutText.getBytes());28 outputStream.close();2930 } catch (Exception e) {31// TODO: handle exception32 }// end of try3334 }// end of if(MEDIA_MOUNTED)35 // 拥有只读权限36else if (sDStateString37 .endsWith(android.os.Environment.MEDIA_MO UNTED_READ_ONLY)) {3839// 获取扩展存储设备的文件目录40 File SDFile = android.os.Environment.getExter nalStorageDirectory();4142// 创建一个文件43 File myFile = new File(SDFile.getAbsolutePath () + File.separator44 + "MyFile.txt");4546// 判断文件是否存在47if (myFile.exists()) {48try {4950// 读数据51 FileInputStream inputStream = new File InputStream(myFile);52byte[] buffer = new byte[1024];53 inputStream.read(buffer);54 inputStream.close();5556 } catch (Exception e) {57// TODO: handle exception58 }// end of try59 }// end of if(myFile)60 }// end of if(MEDIA_MOUNTED_READ_ONLY)61 }// end of func计算SDCard的容量大小android.os.StatFs一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况ng.Objectandroid.os.StatFs构造方法:StatFs (String path)公用方法:方法: getAvailableBlocks ()返回: int解释:返回文件系统上剩下的可供程序使用的块方法: getBlockCount ()返回: int解释: 返回文件系统上总共的块方法: getBlockSize ()返回: int解释: 返回文件系统一个块的大小单位byte方法: getFreeBlocks ()返回: int解释: 返回文件系统上剩余的所有块包括预留的一般程序无法访问的方法: restat (String path)返回: void解释: 执行一个由该对象所引用的文件系统雷斯塔特.(Google翻译)想计算SDCard大小和使用情况时, 只需要得到SD卡总共拥有的Block数或是剩余没用的Bl ock数,再乘以每个Block的大小就是相应的容量大小了单位byte.(见代码)1public void SDCardSizeTest() {23// 取得SDCard当前的状态4 String sDcString = android.os.Environment.getExt ernalStorageState();56if (sDcString.equals(android.os.Environment.MEDI A_MOUNTED)) {78// 取得sdcard文件路径9 File pathFile = android.os.Environment10 .getExternalStorageDirectory();1112 android.os.StatFs statfs = new android.os.Sta tFs(pathFile.getPath());1314// 获取SDCard上BLOCK总数15long nTotalBlocks = statfs.getBlockCount(); 1617// 获取SDCard上每个block的SIZE18long nBlocSize = statfs.getBlockSize();1920// 获取可供程序使用的Block的数量21long nAvailaBlock = statfs.getAvailableBlocks ();2223// 获取剩下的所有Block的数量(包括预留的一般程序无法使用的块)24long nFreeBlock = statfs.getFreeBlocks();2526// 计算SDCard 总容量大小MB27long nSDTotalSize = nTotalBlocks * nBlocSize / 1024 / 1024;2829// 计算 SDCard 剩余大小MB30long nSDFreeSize = nAvailaBlock * nBlocSize / 1024 / 1024;31 }// end of if32 }// end of func文件夹创建问题//mkdir() 如果你想在已经存在的文件夹(D盘下的yyy文件夹)下建立新的文件夹(2010-02-28文件夹),就可以用此方法。
黑马程序员安卓教程:Android外部存储空间的读与写

Android外部存储空间的写与读大多Android设备都配有SD卡,我们称之为外部存储空间。
那么如何对SD卡进行读写呢?下面我们讲述SD卡读与写的操作。
1.SD卡的写操作假设我们在用户登录时将用户输入的用户名和密码都保存在SD卡中,那么如何向SD卡设备中写入数据呢?参考Android下数据的保存和读取所涉及的登录项目新建一个登录项目(命名为:用户登录保存数据SD卡),当点击登录按钮时将用户名和密码保存到SD卡这一外部存储空间中而不再是保存到内部存储空间,具体代码块如例1-1所示:例1-1保存数据业务方法文件,将数据写入该文件中。
在主Activity中调用此方法,如例1-2所示:例1-2方法调用}运行程序,如图1-1所示:图1-1所示从上图1-1可知数据保存失败,查看日志信息如图1-2所示:图1-2所示在清单文件中添加相关权限,如图1-3所示:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>图1-3所示再次运行程序,提示保存用户名密码成功,此时从DDMS中的文件浏览视图中可以浏览到该文件如图1-4所示:图1-4所示导出文件,如图1-5所示:图1-5所示2.SD卡读操作完成了SD卡写的操作,我们现在要读取写入SD卡中的数据并将该数据部署到相应的控件上,具体方法如例1-3所示:例1-3数据读取方法/*** 读取用户名和密码** @return 用户名密码的map集合 null获取数据失败.*/public static Map<String, String> readUserInfo() {try {File file = new File(Environment.getExternalStorageDirectory(),"info.dat");//获取文件的输入流FileInputStream fis = new FileInputStream(file);BufferedReader br = new BufferedReader(new InputStreamReader(fis));浏览保存在SD卡中的数据保存在SD卡中的数据String line = br.readLine();//分别分割出用户名和密码String username = line.split("##")[0];String password = line.split("##")[1];Map<String, String> map = new HashMap<String, String>();map.put("username", username);map.put("password", password);return map;} catch (Exception e) {e.printStackTrace();return null;}}上图方法的设计思路是:读取文件的存储路径并获取该文件的输入流,在程序中将读取的数据流转换成字符串并显示在相应的控件上。
Android---浮动搜索框(SearchManager)(An-Beer工作室)

浮动搜索框的使用其实并不难,而是在于它的配置非常之繁琐,对于它的使用主要是方便开发者对于程序中有搜索业务时,更好的设计UISearchM anager具体使用步骤如下:(1)配置s earc h bar的相关信息,新建一个位于res/xml下的一个s earchable.xml的配置文件,如默认值、是否有搜索建议或者语音搜索。
代码<searchable xmlns:android=/apk/ res/android<!-- label为搜索框上方的文本,hint搜索框里面的提示文本,显示label -->android:label="@string/search_label"android:hint="@string/search_hint"android:searchMode="showSearchLabelAsBadge"<!-- 语音搜索配置 -->android:voiceSearchMode="showVoiceSearchButton|launchR ecognizer"android:voiceLanguageModel="free_form"android:voicePromptText="@string/search_invoke"<!-- 配置搜索建议,配置错误将不会显示,这里的searchSuggestAut hority的值必须是继承自SearchRecentSuggestionsProvider的完整路径名-->android:searchSuggestAuthority="com.android.cbin.Sea rchSuggestionSampleProvider"android:searchSuggestSelection=" ? "/>(2) manifest.xml配置,搜索结果处理的Ac tivity将出现两种情况,一种是从其他Ac tivity中的s earc h bar打开一个A ctivtiy 专门处理搜索结果,第二种是就在当前Ac tivity就是处理结果的Ac tivity,先介绍第一种配置:代码<activity android:name="SearchResultActivity"><intent-filter><action android:name="android.intent.action.SEA RCH"></action></intent-filter><!-- 指定上面的searchable.xml文件 --><meta-data android:resource="@xml/searchable"android:name="android.app.searchable"></me ta-data></activity><!-- 为了使每一个Activity都能使用search bar,一定要将这个标签放到启动Activity中,里面的value指定的是前面的搜索结果Activity--><meta-data android:name="android.app.default_searchable" android:value=".SearchResultActivity" />(3)搜索建议在manifest.xml中相关的配置<!--之前searchable.xml中有一个searchSuggestAuthority的值其实和这里的authorities指向的都是name中所关联的SearchSuggestionSamplePr ovider,他是一个SearchRecentSuggestionsProvider的子类--><provider android:name="SearchSuggestionSampleProvider"android:authorities="com.android.cbin.SearchSuggestionS ampleProvider"></provider>上面authorities指向的都是name中所关联的Searc hSuggestionSampleP rovider,他是一个SearchRecentSuggestionsProvider的子类代码public class SearchSuggestionSampleProvider extendsSearchRecentSuggestionsProvider {final static String AUTHORITY="com.android.cbin.Search SuggestionSampleProvider";final static int MODE=DATABASE_MODE_QUERIES;public SearchSuggestionSampleProvider(){super();setupSuggestions(AUTHORITY, MODE);}}(4)为了能够使用s earc h bar 我们必须重写Ac tivity的onSearc hRequested的方法,在界面上启动一个s earch bar但是这个动作不会自动触发,必须通过一个按钮或者菜单的点击事件触发;代码@Overridepublic boolean onSearchRequested(){String text=etdata.getText().toString();Bundle bundle=new Bundle();bundle.putString("data", text);//打开浮动搜索框(第一个参数默认添加到搜索框的值)//bundle为传递的数据startSearch("mm", false, bundle, false);//这个地方一定要返回真如果只是super.onSearchRequested 方法不但//onSearchRequested(搜索框默认值)无法添加到搜索框中,bu ndle也无法传递出去return true;}(5)接收query和bundle、保存query值(即搜索建议的列表值)代码public void doSearchQuery(){final Intent intent = getIntent();//获得搜索框里值String query=intent.getStringExtra(SearchManager.QU ERY);tvquery.setText(query);//保存搜索记录SearchRecentSuggestions suggestions=new SearchRecentSuggestions(this,SearchSuggestionSampleProvider.AUTHORITY, Se archSuggestionSampleProvider.MODE);suggestions.saveRecentQuery(query, null);if(Intent.ACTION_SEARCH.equals(intent.getAction())) {//获取传递的数据Bundle bundled=intent.getBundleExtra(SearchMana ger.APP_DATA);if(bundled!=null){String ttdata=bundled.getString("data");tvdata.setText(ttdata);}else{tvdata.setText("no data");}}}之前说到了处理结果的Ac tivity将可能出现的两种情况的两种,现在就处理第二种状况,就是假如invoke search bar的Activity同时也是处理搜索结果的Ac tivity,如果按照之前的方式处理则会出现一种情况,搜索一次就实例化一次Ac tivity,当按返回键的时候会发现老是同一个A ctivity,其实为了使它只有一个实例化对象,只需简单的配置和代码就能实现第一:在处理搜索结果Ac tivity的manif es t.xml中添加android:launc hMode="s ingleTop"属性第二:重写Ac tivity的onN ew I ntent(I ntent intent)代码@Overridepublic void onNewIntent(Intent intent){super.onNewIntent(intent);//获得搜索框里值String query=intent.getStringExtra(SearchManager.QU ERY);tvquery.setText(query);//保存搜索记录SearchRecentSuggestions suggestions=new SearchRecen tSuggestions(this,SearchSuggestionSampleProvider.AUTHORITY, Se archSuggestionSampleProvider.MODE);suggestions.saveRecentQuery(query, null);if(Intent.ACTION_SEARCH.equals(intent.getAction())) {//获取传递的数据Bundle bundled=intent.getBundleExtra(SearchMana ger.APP_DATA);if(bundled!=null){String ttdata=bundled.getString("data");tvdata.setText(ttdata);}else{tvdata.setText("no data");}}}相关知识:上面讲到了将最近的搜索值添加到搜索建议中,但却没有提到如果清理搜索建议中的值,与保存相似,Searc hRecentSugg es tion对象提供了一个c learHis tory()方法代码private void clearSearchHistory() {SearchRecentSuggestions suggestions = new SearchRec entSuggestions(this,SearchSuggestionSampleProvider.AUTHORITY, Se archSuggestionSampleProvider.MODE);suggestions.clearHistory();}忘了上效果图:oye。
Android模拟器中创建和使用SDCard

1.创建一个SD卡镜像文件打开cmd,进入Android SDK安装路径下的tools目录下,输入如下命令:mksdcard 1024M sdcard.img该命令会在当前目录下生成一个sdcard.img文件,该文件是Android模拟器的SD卡镜像文件。
1024M表示SD卡有1024M大小,即1G容量。
目前Android支持8M~128G的SD卡。
2.运行带有SD卡的模拟器创建了SD卡镜像文件,只是创建了一个文件,还不能在模拟器中直接使用,要在模拟器加载该SD卡,方法有下面:(1)在cmd中启动带有sdcard的模拟器进入Android SDK安装路径下的tools目录中,运行下面命令:emulator -avd name_avd -sdcard sdcard.img其中,name_avd是已有的模拟器的名字,sdcard.img是第一步创建的SD卡镜像文件。
(2)在eclipse中,新建模拟器的时候,指定SD卡镜像文件的路径,并且加入对SD卡的支持选项打开eclipse,进入:window->android SDK and AVD manager如下图:在创建的时候,在SD card那一栏,选择file,并将其设置为sdcard镜像文件的路径。
点击hardware一栏中的new,选择SD Card surport。
点击创建AVD,OK。
(3)(我没有做过实验)在Eclipse中,在Run->Run Configurations...菜单里德Target标签中,输入启动参数,如下图:3.向该SD卡中上传文件也有两种途径:(1)在cmd中,进入Android SDK的安装路径下的tools目录中,运行命令:adb push E:\test.3gp sdcard/test.3gp其中,E:\test.3gp 是本地要上传的文件,sdcard/test.3gp 为上传到SD卡中的路径。
Android SDCard

方法:getDataDirectory() 解释:返回 File ,获取 Android 数据目录。 方法:getDownloadCacheDirectory() 解释:返回 File ,获取 Android 下载/缓存内容目录。
方法:getExternalStorageDirectory() 解释:返回 File ,获取外部存储目录即 SDCard 方法:getExternalStoragePublicDirectory(String type) 解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件 方法:getExternalStorageState() 解释:返回 File ,获取外部存储设备的当前状态 方法:getRootDirectory() 解释:返回 File ,获取 Android 的根目录 2、讲述 StatFs 类 StatFs 一个模拟 linux 的 df 命令的一个类,获得 SD 卡和手机内存的使用情况 StatFs 常用方法:
void findView(){ viewHolder.myButton=(Button)findViewById(R.id.Button01); viewHolder.myBar=(ProgressBar)findViewById(R.id.myProgressBar); viewHolder.myTextView=(TextView)findViewById(R.id.myTextView); }
import android.widget.TextView; import android.widget.Toast; public class getStorageActivity extends Activity { private Button myButton; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.main); findView(); viewHolder.myButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub getSize(); } }); }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android SDCard操作(文件读写,容量计算)android.os.Environment提供访问环境变量ng.Objectandroid.os.EnvironmentEnvironment 静态方法:方法: getDataDirectory ()返回: File解释: 返回Data的目录方法: getDownloadCacheDirectory ()返回: File解释: 返回下载缓冲区目录方法: getExternalStorageDirectory ()返回: File解释: 返回扩展存储区目录(SDCard)方法: getExternalStoragePublicDirectory (String type)返回: File解释: 返回一个高端的公用的外部存储器目录来摆放某些类型的文件(来自网上)方法: getRootDirectory ()返回: File解释: 返回Android的根目录方法: getExternalStorageState ()返回: String解释: 返回外部存储设备的当前状态getExternalStorageState () 返回的状态String类型常量:常量: MEDIA_BAD_REMOVAL值 : "bad_removal"解释: 在没有正确卸载SDCard之前移除了常量:MEDIA_CHECKING值 : "checking"解释: 正在磁盘检查常量: MEDIA_MOUNTED值 : "mounted"解释: 已经挂载并且拥有可读可写权限常量: MEDIA_MOUNTED_READ_ONLY值 : "mounted_ro"解释: 已经挂载,但只拥有可读权限常量:MEDIA_NOFS值 : "nofs"解释: 对象空白,或者文件系统不支持常量: MEDIA_REMOVED值 : "removed"解释: 已经移除扩展设备常量: MEDIA_SHARED值 : "shared"解释: 如果SDCard未挂载,并通过USB大容量存储共享常量: MEDIA_UNMOUNTABLE值 : "unmountable"解释: 不可以挂载任何扩展设备常量: MEDIA_UNMOUNTED值 : "unmounted"解释: 已经卸载使用时只需先判断SDCard当前的状态然后取得SdCard的目录即可(见源代码)1//SDcard 操作2public void SDCardTest() {3// 获取扩展SD卡设备状态4 String sDStateString = android.os.Environment.g etExternalStorageState();56// 拥有可读可写权限7if (sDStateString.equals(android.os.Environment. MEDIA_MOUNTED)) {89try {1011// 获取扩展存储设备的文件目录12 File SDFile = android.os.Environment13 .getExternalStorageDirectory();1415// 打开文件16 File myFile = new File(SDFile.getAbsoluteP ath()17 + File.separator + "MyFile.txt");1819// 判断是否存在,不存在则创建20if (!myFile.exists()) {21 myFile.createNewFile();22 }2324// 写数据25 String szOutText = "Hello, World!";26 FileOutputStream outputStream = new FileOu tputStream(myFile);27 outputStream.write(szOutText.getBytes());28 outputStream.close();2930 } catch (Exception e) {31// TODO: handle exception32 }// end of try3334 }// end of if(MEDIA_MOUNTED)35 // 拥有只读权限36else if (sDStateString37 .endsWith(android.os.Environment.MEDIA_MO UNTED_READ_ONLY)) {3839// 获取扩展存储设备的文件目录40 File SDFile = android.os.Environment.getExter nalStorageDirectory();4142// 创建一个文件43 File myFile = new File(SDFile.getAbsolutePath () + File.separator44 + "MyFile.txt");4546// 判断文件是否存在47if (myFile.exists()) {48try {4950// 读数据51 FileInputStream inputStream = new File InputStream(myFile);52byte[] buffer = new byte[1024];53 inputStream.read(buffer);54 inputStream.close();5556 } catch (Exception e) {57// TODO: handle exception58 }// end of try59 }// end of if(myFile)60 }// end of if(MEDIA_MOUNTED_READ_ONLY)61 }// end of func计算SDCard的容量大小android.os.StatFs一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况ng.Objectandroid.os.StatFs构造方法:StatFs (String path)公用方法:方法: getAvailableBlocks ()返回: int解释:返回文件系统上剩下的可供程序使用的块方法: getBlockCount ()返回: int解释: 返回文件系统上总共的块方法: getBlockSize ()返回: int解释: 返回文件系统一个块的大小单位byte方法: getFreeBlocks ()返回: int解释: 返回文件系统上剩余的所有块包括预留的一般程序无法访问的方法: restat (String path)返回: void解释: 执行一个由该对象所引用的文件系统雷斯塔特.(Google翻译)想计算SDCard大小和使用情况时, 只需要得到SD卡总共拥有的Block数或是剩余没用的Bl ock数,再乘以每个Block的大小就是相应的容量大小了单位byte.(见代码)1public void SDCardSizeTest() {23// 取得SDCard当前的状态4 String sDcString = android.os.Environment.getExt ernalStorageState();56if (sDcString.equals(android.os.Environment.MEDI A_MOUNTED)) {78// 取得sdcard文件路径9 File pathFile = android.os.Environment10 .getExternalStorageDirectory();1112 android.os.StatFs statfs = new android.os.Sta tFs(pathFile.getPath());1314// 获取SDCard上BLOCK总数15long nTotalBlocks = statfs.getBlockCount(); 1617// 获取SDCard上每个block的SIZE18long nBlocSize = statfs.getBlockSize();1920// 获取可供程序使用的Block的数量21long nAvailaBlock = statfs.getAvailableBlocks ();2223// 获取剩下的所有Block的数量(包括预留的一般程序无法使用的块)24long nFreeBlock = statfs.getFreeBlocks();2526// 计算SDCard 总容量大小MB27long nSDTotalSize = nTotalBlocks * nBlocSize / 1024 / 1024;2829// 计算 SDCard 剩余大小MB30long nSDFreeSize = nAvailaBlock * nBlocSize / 1024 / 1024;31 }// end of if32 }// end of func。