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(); } }); }
SD卡读写操作详细说明
51单片机实现对SD卡的读写SD卡SPI模式下与单片机的连接图:22.23.//获得16位的回应24. Read_Byte_SD(); //read the first byte,ignore it.25.do26. { //读取后8位27. tmp = Read_Byte_SD();28. retry++;29. }30.while((tmp==0xff)&&(retry<100));31.return(tmp);32.}2)初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。
在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。
在初始化成功后,应尽量提高SPI的速率。
在刚开始要先发送至少74个时钟信号,这是必须的。
在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。
随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式初始化时序图:初始化例程:1.//--------------------------------------------------------------------------2.初始化SD卡到SPI模式3.//--------------------------------------------------------------------------4.unsigned char SD_Init()5.{6.unsigned char retry,temp;7.unsigned char i;8.unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};9. SD_Port_Init(); //初始化驱动端口10.11. Init_Flag=1; //将初始化标志置112.13.for (i=0;i<0x0f;i++)14. {15. Write_Byte_SD(0xff); //发送至少74个时钟信号16. }17.18.//向SD卡发送CMD019. retry=0;20.do21. { //为了能够成功写入CMD0,在这里写200次22. temp=Write_Command_SD(CMD);23. retry++;24.if(retry==200)25. { //超过200次26.return(INIT_CMD0_ERROR);//CMD0 Error!27. }28. }29.while(temp!=1); //回应01h,停止写入30.31.//发送CMD1到SD卡32. CMD[0] = 0x41; //CMD133. CMD[5] = 0xFF;34. retry=0;35.do36. { //为了能成功写入CMD1,写100次37. temp=Write_Command_SD(CMD);38. retry++;39.if(retry==100)40. { //超过100次41.return(INIT_CMD1_ERROR);//CMD1 Error!4.unsigned char Read_CSD_SD(unsigned char *Buffer)5.{6.//读取CSD寄存器的命令7.unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};8.unsigned char temp;9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes10.return(temp);11.}4)读取SD卡信息综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。
android手机SD卡读写操作(以txt文本为例)实现步骤
android⼿机SD卡读写操作(以txt⽂本为例)实现步骤要说明⼀下,我这⾥没有⽤MainActivity.class作为软件⼊⼝复制代码代码如下:AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.tes.textsd"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="16" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.tes.textsd.FileOperateActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity></application></manifest>复制代码代码如下:FileHelper.java/*** @Title: FileHelper.java* @Package com.tes.textsd* @Description: TODO(⽤⼀句话描述该⽂件做什么)* @author Alex.Z* @date 2013-2-26 下午5:45:40* @version V1.0*/package com.tes.textsd;import java.io.DataOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import android.content.Context;import android.os.Environment;public class FileHelper {private Context context;/** SD卡是否存在**/private boolean hasSD = false;/** SD卡的路径**/private String SDPATH;/** 当前程序包的路径**/private String FILESPATH;public FileHelper(Context context) {this.context = context;hasSD = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED);SDPATH = Environment.getExternalStorageDirectory().getPath(); FILESPATH = this.context.getFilesDir().getPath();}/*** 在SD卡上创建⽂件** @throws IOException*/public File createSDFile(String fileName) throws IOException { File file = new File(SDPATH + "//" + fileName);if (!file.exists()) {file.createNewFile();}return file;}/*** 删除SD卡上的⽂件** @param fileName*/public boolean deleteSDFile(String fileName) {File file = new File(SDPATH + "//" + fileName);if (file == null || !file.exists() || file.isDirectory())return false;return file.delete();}/*** 写⼊内容到SD卡中的txt⽂本中* str为内容*/public void writeSDFile(String str,String fileName){try {FileWriter fw = new FileWriter(SDPATH + "//" + fileName);File f = new File(SDPATH + "//" + fileName);fw.write(str);FileOutputStream os = new FileOutputStream(f); DataOutputStream out = new DataOutputStream(os);out.writeShort(2);out.writeUTF("");System.out.println(out);fw.flush();fw.close();System.out.println(fw);} catch (Exception e) {}}/*** 读取SD卡中⽂本⽂件** @param fileName* @return*/public String readSDFile(String fileName) {StringBuffer sb = new StringBuffer();File file = new File(SDPATH + "//" + fileName);try {FileInputStream fis = new FileInputStream(file);int c;while ((c = fis.read()) != -1) {sb.append((char) c);}fis.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return sb.toString();}public String getFILESPATH() {return FILESPATH;}public String getSDPATH() {return SDPATH;}public boolean hasSD() {return hasSD;}}复制代码代码如下:main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><TextViewandroid:id="@+id/hasSDTextView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="hello" /><TextViewandroid:id="@+id/SDPathTextView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="hello" /><TextViewandroid:id="@+id/FILESpathTextView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="hello" /><TextViewandroid:id="@+id/createFileTextView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="false" /><TextViewandroid:id="@+id/readFileTextView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="false" /><TextViewandroid:id="@+id/deleteFileTextView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="false" /></LinearLayout>复制代码代码如下:FileOperateActivity.class/*** @Title: FileOperateActivity.java* @Package com.tes.textsd* @Description: TODO(⽤⼀句话描述该⽂件做什么)* @author Alex.Z* @date 2013-2-26 下午5:47:28* @version V1.0*/package com.tes.textsd;import java.io.IOException;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class FileOperateActivity extends Activity {private TextView hasSDTextView;private TextView SDPathTextView;private TextView FILESpathTextView;private TextView createFileTextView;private TextView readFileTextView;private TextView deleteFileTextView;private FileHelper helper;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);hasSDTextView = (TextView) findViewById(R.id.hasSDTextView); SDPathTextView = (TextView) findViewById(R.id.SDPathTextView); FILESpathTextView = (TextView) findViewById(R.id.FILESpathTextView); createFileTextView = (TextView) findViewById(R.id.createFileTextView); readFileTextView = (TextView) findViewById(R.id.readFileTextView); deleteFileTextView = (TextView) findViewById(R.id.deleteFileTextView); helper = new FileHelper(getApplicationContext()); hasSDTextView.setText("SD卡是否存在:" + helper.hasSD()); SDPathTextView.setText("SD卡路径:" + helper.getSDPATH()); FILESpathTextView.setText("包路径:" + helper.getFILESPATH());try {createFileTextView.setText("创建⽂件:"+ helper.createSDFile("test.txt").getAbsolutePath());} catch (IOException e) {e.printStackTrace();}deleteFileTextView.setText("删除⽂件是否成功:"+ helper.deleteSDFile("xx.txt"));helper.writeSDFile("1213212", "test.txt");readFileTextView.setText("读取⽂件:" + helper.readSDFile("test.txt"));}}看看运⾏的效果:。
sd卡数据读写流程
sd卡数据读写流程SD卡是一种常见的存储媒介,它具有轻便、易携带、容量大、存储速度快等优势。
SD卡数据读写流程是指将数据从SD卡中读取出来或将数据写入SD卡中的整个过程。
一、SD卡的物理结构SD卡主要由控制器、记忆芯片和接口组成。
控制器负责管理SD卡的读写操作;记忆芯片是存储数据的核心部件,它采用闪存技术,可存储数据并保持数据不易丢失;接口是SD卡与主控制器进行通信的桥梁,一般采用SPI(串行外设接口)或SDIO(SD输入输出)接口。
二、SD卡读写流程1.初始化SD卡当主控制器接通SD卡电源时,首先要进行初始化操作。
初始化操作主要包括向SD卡发送复位命令、读取SD卡的OCR(操作条件寄存器)以及设置SPI或SDIO接口的工作参数等操作。
2.读取SD卡信息在SD卡初始化成功后,主控制器通过SPI或SDIO接口向SD 卡发送命令,读取SD卡ID信息、SD卡容量、SD卡速度等重要参数。
这些信息将在数据读写时起到重要作用。
3.读取文件SD卡上的文件存储在文件系统中,主控制器需要先读取文件系统,找到要读取的文件所在的位置。
一般情况下,文件系统采用FAT32格式,主控制器需要读取文件系统启动区扇区信息,从而找到文件所在扇区及其起始地址。
4.读取数据在找到文件所在位置后,主控制器就可以根据文件系统的信息,向SD卡发送读操作指令,读取文件数据。
读取数据时,主控制器需要根据SD卡的速度、数据传输模式等参数设置接口波特率、时序等参数。
5.写入数据SD卡写数据流程与读数据基本相同,只是主控制器需要向SD卡发送写操作指令,将数据写入SD卡中。
写入数据时,主控制器需要根据SD卡的容量、速度等参数设置写入数据的起始位置、写入数据的长度、写入数据的校验和等参数。
6.关闭SD卡当读写操作完成后,主控制器需要向SD卡发送停止指令,将SD卡彻底关闭。
关闭SD卡可以避免SD卡数据丢失、损坏等问题。
三、SD卡的数据保护SD卡存储的数据非常重要,因此在SD卡的读写过程中,需要采取一定的措施保护数据。
安卓手机SD卡各文件夹说明
安卓手机SD卡各文件夹说明安卓手机SD卡各文件夹说明1、.android_secure 是官方app2sd的产物,删了之后装到sd卡中的软件就无法使用了。
2、.Bluetooth 顾名思义,用蓝牙之后就会有这个。
3、.mobo 顾名思义,Moboplayer的缓存文件。
4、.QQ 顾名思义,QQ的缓存文件。
5、.quickoffice 顾名思义,quickoffice的缓存文件。
6、.switchpro 顾名思义,switchprowidget(多键开关)的缓存文件。
7、.ucdlres 顾名思义,UC迅雷的缓存文件。
8、albumart 音乐专辑封面的缓存文件夹。
9、albums 相册缩略图的缓存文件夹。
10、Android 比较重要的文件夹,里面是一些程序数据,比如google map的地图缓存。
11、backups 一些备份文件,比如联系人导出到SD卡时会导入到此文件夹。
12、baidu 顾名思义,掌上百度、百度输入法之类程序的缓存文件夹。
13、bugtogo 系统出现问题的时候会形成一些报告文件,存放于此文件夹。
14、cmp 个人初步判断是音乐的缓存文件夹。
15、data 同样是缓存数据的文件夹,与Android性质类似。
16、DCIM 相机的缓存文件夹。
17、documents Documents To Go 的相关文件夹。
18、etouch 易行的缓存文件夹。
19、extracted androzip等解压缩软件默认的解压目录。
20、gameloft 顾名思义,gameloft游戏数据包存放的文件夹。
21、handcent 顾名思义handcent(超级短信)数据文件夹。
22、handyCurrency 货币汇率相关的文件夹,装了handycalc (科学计算器)之后才会有。
23、ireader 顾名思义,ireader的缓存文件夹。
24、KingReader 顾名思义,开卷有益的缓存文件夹。
android4.0中关于内外置sd卡的获取及读写权限问题
1. 在android4.0源码出来以后,关于sd卡问题似乎没有解决好,起码上层api中没有体现到位。
其实在framework层中有相应的类去获得内外置sd卡信息,是否可读写的权限。
在2.x的版本中,在manifest中配置的权限android.permission.WRITE_EXTERNAL_STORAGE确实是用来使得sd卡获得写的权限。
而在4.0开发的源码当中,由于有了内外置sd卡的区分,android.permission.WRITE_EXTERNAL_STORAGE的权限用来设置了内置sd卡的写权限,如果在manifest中只是配置了这个权限,那个应用只能在内置sd卡中进行写操作,还是无法在外置sd卡中进行写操作。
需要写外置sd 卡的话,需要配置另一个权限android.permission.WRITE_MEDIA_STORAGE,这样就可以在外置sd卡中进行写入操作了。
这两个权限都被定义在 android源码目录\frameworks\base\data\etc\platform.xml中:[html]view plaincopyprint?1. <permission name="android.permission.WRITE_EXTERNAL_STORAGE">2. <group gid="sdcard_rw"/>3. </permission>4.5. <permission name="android.permission.WRITE_MEDIA_STORAGE">6. <group gid="media_rw"/>7. </permission>使用到的类主要是framework/base/core/java/android/os/storage/StorageVolume.java及相同目录下的StorageManager.java文件。
sdcard读写(An-Beer 工作室)
2010-11-03 13:55 by stulife, 149 visits, 网摘, 收藏, 编辑在AndroidManifest.xml中加入:1.<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">2.</uses-permission>其次:确保SD卡的镜像文件不是Read-Only属性的,不能写入内容写入SD卡:1.File f = new File(android.os.Environment.getExternalStorageDirectory()+"/aaa.txt");2.String str="this is a test about Write SD card file";3.方法A:4.FileOutputStream fileOS=new FileOutputStream(f);5.fileOS.write(str.getBytes());6.fileOS.close();7.BufferedWriter buf = new BufferedWriter (new OutputStreamWriter(fileOS));8.buf.write(str,0,str.length());9.buf.flush();10.buf.close();方法B:1.// FileWriter fw = new FileWriter("/sdcard/cc.txt");2.// fw.write(str);3.// fw.close();读SD卡1.File file[] = android.os.Environment.getExternalStorageDirectory().listFiles();2. //这里我们只是取得列表中的第二个文件的绝对路径3. String path=file[1].getAbsolutePath();4.try{5.6. FileInputStream fileIS = new FileInputStream(path);7. BufferedReader buf = new BufferedReader(new InputStreamReader(fileIS));8. String readString = new String();9. //just reading each line and pass it on the debugger10. while((readString = buf.readLine())!= null){11.Log.d("line: ", readString);12.}13. fileIS.close();14.} catch (FileNotFoundException e) {15. e.printStackTrace();16. } catch (IOException e){17. e.printStackTrace();18.}删除SD卡中的文件1.File file1= new File(path);2.boolean isdelte=file1.delete();。
androidSDCard文件操作类FileHelper(超完整)-电脑资料
androidSDCard文件操作类FileHelper(超完整)-电脑资料FileHelper.java类package com.east.framework.file;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import android.content.Context;import android.os.Environment;import android.os.StatFs;publicclass FileHelper {private Contextcontext;private StringSDPATH;//SD卡路径private StringFILESPATH;//文件路径public FileHelper(Context context) {this.context= context;SDPATH=Environment.getExternalStorageDirectory().getPath() +"//";FILESPATH=this.context.getFilesDir().getPath() +"//";}/**判断SDCard是否存在?是否可以进行读写*/publicboolean SDCardState(){if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//表示SDCard存在并且可以读写returntrue;}else{returnfalse;}}/**获取SDCard文件路径*/public String SDCardPath(){if(SDCardState()){//如果SDCard存在并且可以读写SDPATH=Environment.getExternalStorageDirectory().getPath();return SDPATH;}else{returnnull;}}/**获取SDCard总容量大小(MB)*/publiclong SDCardTotal(){if(null!= SDCardPath()&&SDCardPath().equals("")){ StatFs statfs =new StatFs(SDCardPath());//获取SDCard的Block总数long totalBlocks = statfs.getBlockCount();//获取每个block的大小long blockSize = statfs.getBlockSize();//计算SDCard总容量大小MBlong SDtotalSize = totalBlocks*blockSize/1024/1024;return SDtotalSize;}else{return0;}}/***在SD卡上创建目录**@param dirName*要创建的目录名*@return创建得到的目录*/public File createSDDir(String dirName) {File dir =new File(SDPATH+ dirName);dir.mkdir();return dir;}/***删除SD卡上的目录**@param dirName*/publicboolean delSDDir(String dirName) {File dir =new File(SDPATH+ dirName);return delDir(dir);}/***在SD卡上创建文件**@throws IOException*/public File createSDFile(String fileName)throws IOException { File file =new File(SDPATH+ fileName);file.createNewFile();return file;}/***判断文件是否已经存在**@param fileName*要检查的文件名*@return boolean, true表示存在,false表示不存在*/publicboolean isFileExist(String fileName) {File file =new File(SDPATH+ fileName);return file.exists();}/***删除SD卡上的文件**@param fileName*/publicboolean delSDFile(String fileName) {File file =new File(SDPATH+ fileName);if(file ==null|| !file.exists() || file.isDirectory())returnfalse;file.delete();returntrue;}/***修改SD卡上的文件或目录名**@param fileName*/publicboolean renameSDFile(String oldfileName, String newFileName) {File leFile =new File(SDPATH+ oldfileName);File newFile =new File(SDPATH+ newFileName);return oleFile.renameTo(newFile);}/***拷贝SD卡上的单个文件**@param path*@throws IOException*/publicboolean copySDFileT o(String srcFileName, String destFileName)throws IOException {File srcFile =new File(SDPATH+ srcFileName);File destFile =new File(SDPATH+ destFileName);return copyFileT o(srcFile, destFile);}/***拷贝SD卡上指定目录的所有文件**@param srcDirName*@param destDirName*@return*@throws IOException*/publicboolean copySDFilesT o(String srcDirName, String destDirName)throws IOException {File srcDir =new File(SDPATH+ srcDirName);File destDir =new File(SDPATH+ destDirName);}/***移动SD卡上的单个文件**@param srcFileName*@param destFileName*@return*@throws IOException*/publicboolean moveSDFileTo(String srcFileName, String destFileName)throws IOException {File srcFile =new File(SDPATH+ srcFileName);File destFile =new File(SDPATH+ destFileName);return moveFileT o(srcFile, destFile);}/***移动SD卡上的指定目录的所有文件**@param srcDirName*@param destDirName*@return*@throws IOException*/publicboolean moveSDFilesTo(String srcDirName, String destDirName)throws IOException {File srcDir =new File(SDPATH+ srcDirName);File destDir =new File(SDPATH+ destDirName);}/***将文件写入sd卡,。
AndroidSD卡上文件操作及记录日志操作具体方法
Android SD卡上文件操作及记录日志操作具体方法本文实例讲述了Android SD卡上文件操作及记录日志操作的方法。
分享给大家供大家参考,具体如下:SD卡是否存在private boolean checkSDCardStatus() { boolean SDCardStatus = false; String sDStateString = android.os.Environment.getExternalStorageState(); if (sDStateString.equals(android.os.Environment.MEDIA_MOUNTE D)) { SDCardStatus = true; } elseSD卡不可用return SDCardStatusSD卡上是否有APK文件private boolean checkFileExist(String iFilePath) { boolean fileExist = false; if (checkSDCardStatus()) { File myFile = new File(iFilePath); if (myFile.exists()) { fileExist = true; } } return fileExist;}删除文件private void Apk(String iFilePath) { if (checkSDCardStatus()) { File myFile = new File(iFilePath); if (myFile.exists()) { myFile.(); } }} 在SD 卡上用txt记录public static void logOnFile(String format, Object... args){ String logstr = String.format(format, args); SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = sDateFormat.format(new java.util.Date()); logstr = "/r/n-------------------------/r/n" + date + "/r/n" + logstr; FileOutputStream fout; DataOutputStream dataout; try { fout = new FileOutputStream("//sdcard//log.txt",true); dataout = new DataOutputStream(fout); dataout.writeUTF(logstr);dataout.flush(); dataout.close(); fout.flush(); fout.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}希望本文所述对大家Android程序设计有所帮助。
android系统sdcard代码介绍讲解
使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。
对于像视频这样的大文件,我们可以把它存放在SDCard。
SDCard是干什么的?你可以把它看作是移动硬盘或U盘。
在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。
创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img:mksdcard 2048M D:\AndroidTool\sdcard.img注意:在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:<!-- 在SDCard中创建与删除文件权限--><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ){File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard 目录File sa veFile = new File(sdCardDir, “ljq.txt”);FileOutputStream outStream = new FileOutputStream(saveFile);outStream.write("abc".getBytes());outStream.close();}Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。
andoird文件读写总结
Android - 文件读写操作总结标签:androidstringbufferexceptionbytefile2012-03-05 20:22 98690人阅读评论(33) 收藏举报分类:Android(96)版权声明:本文为博主原创文章,未经博主允许不得转载。
在android中的文件放在不同位置,它们的读取方式也有一些不同。
本文对android中对资源文件的读取、数据区文件的读取、SD卡文件的读取及RandomAccessFile的方式和方法进行了整理。
供参考。
一、资源文件的读取:1) 从resource的raw中读取文件数据:[java]view plaincopy1.String res = "";2.try{3.4.//得到资源中的Raw数据流5. InputStream in = getResources().openRawResource(R.raw.test);6.7.//得到数据的大小8.int length = in.available();9.10.byte [] buffer = new byte[length];11.12.//读取数据13. in.read(buffer);14.15.//依test.txt的编码类型选择合适的编码,如果不调整会乱码16. res = EncodingUtils.getString(buffer, "BIG5");17.18.//关闭19. in.close();20.21. }catch(Exception e){22. e.printStackTrace();23. }2) 从resource的asset中读取文件数据[java]view plaincopy1.String fileName = "test.txt"; //文件名字2.String res="";3.try{4.5.//得到资源中的asset数据流6. InputStream in = getResources().getAssets().open(fileName);7.8.int length = in.available();9.byte [] buffer = new byte[length];10.11. in.read(buffer);12. in.close();13. res = EncodingUtils.getString(buffer, "UTF-8");14.15. }catch(Exception e){16.17. e.printStackTrace();18.19. }二、读写/data/data/<应用程序名>目录上的文件:[java]view plaincopy1.//写数据2.public void writeFile(String fileName,String writestr) throws IOException{3.try{4.5. FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);6.7.byte [] bytes = writestr.getBytes();8.9. fout.write(bytes);10.11. fout.close();12. }13.14.catch(Exception e){15. e.printStackTrace();16. }17.}18.19.//读数据20.public String readFile(String fileName) throws IOException{21. String res="";22.try{23. FileInputStream fin = openFileInput(fileName);24.int length = fin.available();25.byte [] buffer = new byte[length];26. fin.read(buffer);27. res = EncodingUtils.getString(buffer, "UTF-8");28. fin.close();29. }30.catch(Exception e){31. e.printStackTrace();32. }33.return res;34.35.}三、读写SD卡中的文件。
- 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。