访问存储在SD卡中的文件

使用 Environment.getExternalStorageState(); 判断是否存在内存卡

使用 Environment.getExternalStorageDirectory() 来获取内存卡的根目录路径

内存卡写入:

MainActivity.java

package cn.lixyz.iotest.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import cn.lixyz.iotest.R;
import cn.lixyz.iotest.util.IOFile; public class MainActivity extends Activity implements OnClickListener { private Button bt_sdcard_exist, bt_sdcard_write;
private EditText et_sdcard_input; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); findView();
bt_sdcard_exist.setOnClickListener(this);
bt_sdcard_write.setOnClickListener(this);
} public void findView() {
bt_sdcard_exist = (Button) findViewById(R.id.bt_sdcard_exist);
bt_sdcard_write = (Button) findViewById(R.id.bt_sdcard_write);
et_sdcard_input = (EditText) findViewById(R.id.et_sdcard_input);
} @Override
public void onClick(View v) {
IOFile ioFile;
switch (v.getId()) {
case R.id.bt_sdcard_exist:
ioFile = new IOFile(this);
ioFile.sdCardExist();
break;
case R.id.bt_sdcard_write:
String inputString = et_sdcard_input.getText().toString();
ioFile = new IOFile(this);
ioFile.writeToSDCard(inputString);
break; default:
break;
}
} }

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="cn.lixyz.iotest.activity.MainActivity" > <Button
android:id="@+id/bt_sdcard_exist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="判断手机是否安装内存卡" /> <EditText
android:id="@+id/et_sdcard_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入您要写入的内容" /> <Button
android:id="@+id/bt_sdcard_write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SDCard写入" /> </LinearLayout>

IOFile.java

package cn.lixyz.iotest.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException; import android.content.Context;
import android.os.Environment;
import android.widget.Toast; public class IOFile { Context mContext; // 在构造函数中创建一个Context参数,用于在非Activity处弹出Toast
public IOFile(Context context) {
mContext = context;
} public void sdCardExist() {
// 判断手机收安装内存卡,如果没有安装,则弹出提示
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(mContext, "您没有安装SD卡", Toast.LENGTH_SHORT).show();
}
} public void writeToSDCard(String str) { try {
// 获取内存卡跟路径
String sdCardDir = Environment.getExternalStorageDirectory().toString();
File fileName = new File(sdCardDir + "/" + "fileForSDCard.txt");
if (!fileName.exists()) {
fileName.createNewFile();
} //写入文件
FileWriter fileWriter = new FileWriter(fileName);
fileWriter.write(str);
       fileWriter.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

这样运行,会提示权限错误:

需要给工程添加权限:

    <!-- 在内存卡中创建文件和删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 向内存卡写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

运行结果:

内存卡读取:

MainActivity.java

package cn.lixyz.iotest.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import cn.lixyz.iotest.R;
import cn.lixyz.iotest.util.IOFile; public class MainActivity extends Activity implements OnClickListener { private Button bt_sdcard_exist, bt_sdcard_write, bt_sdcard_read;
private EditText et_sdcard_input; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); findView();
bt_sdcard_exist.setOnClickListener(this);
bt_sdcard_write.setOnClickListener(this);
bt_sdcard_read.setOnClickListener(this);
} public void findView() {
bt_sdcard_exist = (Button) findViewById(R.id.bt_sdcard_exist);
bt_sdcard_write = (Button) findViewById(R.id.bt_sdcard_write);
et_sdcard_input = (EditText) findViewById(R.id.et_sdcard_input);
bt_sdcard_read = (Button) findViewById(R.id.bt_sdcard_read);
} @Override
public void onClick(View v) {
IOFile ioFile;
switch (v.getId()) {
case R.id.bt_sdcard_exist:
ioFile = new IOFile(this);
ioFile.sdCardExist();
break;
case R.id.bt_sdcard_write:
ioFile = new IOFile(this);
String inputString = et_sdcard_input.getText().toString();
ioFile.writeToSDCard(inputString);
break;
case R.id.bt_sdcard_read:
ioFile = new IOFile(this);
ioFile.readFromSDCard();
break;
}
} }

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="cn.lixyz.iotest.activity.MainActivity" > <Button
android:id="@+id/bt_sdcard_exist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="判断手机是否安装内存卡" /> <EditText
android:id="@+id/et_sdcard_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入您要写入的内容" /> <Button
android:id="@+id/bt_sdcard_write"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SDCard写入" /> <Button
android:id="@+id/bt_sdcard_read"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SDCard读取" /> </LinearLayout>

IOFile.java

package cn.lixyz.iotest.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.Flushable;
import java.io.IOException;
import java.io.UnsupportedEncodingException; import android.content.Context;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast; public class IOFile { Context mContext; // 在构造函数中创建一个Context参数,用于在非Activity处弹出Toast
public IOFile(Context context) {
mContext = context;
} // 判断手机是否安装内存卡
public void sdCardExist() {
// 判断手机收安装内存卡,如果没有安装,则弹出提示
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(mContext, "您没有安装SD卡", Toast.LENGTH_SHORT).show();
}
} // 往内存卡中写入内容
public void writeToSDCard(String str) {
try {
// 获取内存卡跟路径
String sdCardDir = Environment.getExternalStorageDirectory().toString();
File fileName = new File(sdCardDir + "/" + "fileForSDCard.txt");
if (!fileName.exists()) {
fileName.createNewFile();
}
// 写入文件
FileWriter fileWriter = new FileWriter(fileName);
fileWriter.write(str);
fileWriter.flush(); } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // 从内存卡中读取内容
public void readFromSDCard() {
try {
File file = new File(Environment.getExternalStorageDirectory() + "/" + "fileForSDCard.txt");
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[fileInputStream.available()];
fileInputStream.read(bytes);
fileInputStream.close(); String str = new String(bytes);
Log.d("TTT", "文件内容是:" + str); } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.iotest"
android:versionCode="1"
android:versionName="1.0" > <!-- 在内存卡中创建文件和删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 向内存卡写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="cn.lixyz.iotest.activity.MainActivity"
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> </manifest>

运行结果:

  

Android笔记(四十八) Android中的资源访问——SDCard的更多相关文章

  1. Android笔记(六十五) android中的动画——属性动画(propertyanimation)

    补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...

  2. Android笔记(七十五) Android中的图片压缩

    这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...

  3. Android笔记(六十八) Fragment总结

    Fragment的产生: 为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期.可以接收并处理用户的各种事件,还可以动态的增删 ...

  4. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  5. Android笔记(十八) 下拉列表(Spinner)

    App中常用的控件——下拉列表(Spinner),提供特定选择供用户选择 Spinner每次只能选择一个部件,它的选项来自于与之相关联的适配器(apater)中. MainActivity.java ...

  6. Android笔记(十) Android中的布局——表格布局

    TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...

  7. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  8. 论文阅读笔记四十八:Bounding Box Regression with Uncertainty for Accurate Object Detection(CVPR2019)

    论文原址:https://arxiv.org/pdf/1809.08545.pdf github:https://github.com/yihui-he/KL-Loss 摘要 大规模的目标检测数据集在 ...

  9. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

随机推荐

  1. git - 3.分支

    分支介绍 每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线, 在Git里,这个分支叫主分支,即master分支. HEAD严格来说不是指向提交,而是指向mas ...

  2. Python3基础 yield StopIteration.value获取函数的返回值

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  3. Qt编写气体安全管理系统28-模拟工具

    一.前言 模拟工具在一些涉及到硬件通信的程序中特别有用,也特别需要,回顾这十年来做过的项目,95%的项目都是软硬件交互的,貌似软硬件结合的项目更有生命力一些,纯软件的或者纯硬件的,并没有那么好控制,如 ...

  4. 【翻译】Flink Table Api & SQL — 自定义 Source & Sink

    本文翻译自官网: User-defined Sources & Sinks  https://ci.apache.org/projects/flink/flink-docs-release-1 ...

  5. [LeetCode] 685. Redundant Connection II 冗余的连接之 II

    In this problem, a rooted tree is a directed graph such that, there is exactly one node (the root) f ...

  6. Kubernetes 配置管理 ConfigMap(十二)

    目录 一.背景 二.创建 ConfigMap 2.1.通过 --from-literal 2.2.通过 --from-file 2.3.通过--from-env-file 2.4.YAML 配置文件 ...

  7. 【神经网络与深度学习】Win10+VS2015 caffe环境搭建(极其详细)

    caffe是好用,可是配置其环境实在是太痛苦了,依赖的库很多不说,在VS上编译还各种报错,你能想象那种被一百多个红色提示所笼罩的恐惧.  且网上很多教程是VS2013环境下编译的,问人很多也说让我把1 ...

  8. 阿里云移动推送 安卓项目添加SDK步骤

    Gradle的Emas服务插件会加载您下载的 aliyun-emas-services.json 文件.请修改工程的build.gradle使用该插件.配置步骤如下: 1. 修改项目级目录下build ...

  9. Linq查询连接guid与varchar字段

    使用场景 在数据库设计中进场会出现一些通用表,如通用附件表,一般都是通过ForeignTable(关联的表名)和ForeignKey(关联表的主键)与其他表关联.这样的表在数据库中没有外键关系,而且一 ...

  10. JAVA windows环境配置,jdk的安装配置

    一.需要的文件与下载1.jdk:jdk下载:二.安装与配置1.jdk安装与路径选择 双击安装,然后一直下一步,直至完成. 这是个人的自定义的安装目录路径(安装路径可在安装的时候自行选择,) 2.jdk ...