版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_29675423/article/details/85705545
上一篇:Android数据存储————文件存储(内部存储):https://blog.csdn.net/sinat_29675423/article/details/85699131
存储特征
将数据存储在app目录下,保存到外部存储设备,比如SD卡中,数据既可以公有,也可以私有,空间相对充足。
存储路径
公有:Environment.getExternalStorageDirectory()
私有:/Android/data/<package_name>/files
注意:外部存储权限
访问外部存储权限,API 23以上的应用程序,需要动态申请 外部存储权限
这里推荐使用动态权限处理框架:Easypermission,官方说明:https://github.com/googlesamples/easypermissions
例子:存储、读取字符串
将输入框中的字符串保存到内部存储路径中,并且读取存储的字符串到文本框中显示。
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<EditText
android:id="@+id/etNote"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"/>
<Button
android:id="@+id/btnSave"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
android:onClick="onClick"/>
<Button
android:id="@+id/btnGet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="读取"
android:onClick="onClick"/>
<TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
权限配置
应用easypermission框架,在app:gradle中添加:
dependencies {
implementation 'pub.devrel:easypermissions:2.0.0'
}
manifest配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="你的包名">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity: 实现存储和读取,外部存储权限处理
public class MainActivity extends AppCompatActivity implements View.OnClickListener,EasyPermissions.PermissionCallbacks {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEtNote = findViewById(R.id.etNote);
mTvNote = findViewById(R.id.tvContent);
btnGet = findViewById(R.id.btnGet);
btnSave = findViewById(R.id.btnSave);
//权限处理
String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE};
if(!EasyPermissions.hasPermissions(this,perms)){
EasyPermissions.requestPermissions(this,"需要外部存储权限",0,perms);
}
}
private EditText mEtNote;
private TextView mTvNote;
private Button btnSave,btnGet;
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnSave:
//保存编辑器里面的字符串到文件中
String content = mEtNote.getText().toString().trim();
Boolean success = saveToExternalFile("hello","mynote.txt", content);
//提示是否保存成功
if (success) {
Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this,"保存失败",Toast.LENGTH_SHORT).show();
}
break;
case R.id.btnGet:
//读取文件内容,显示在文本框中
String res = readFromExternalFile("hello","mynote.txt");
mTvNote.setText(res);
}
}
/**
* 从外部存储设备中读取
* @param dirName 文件夹
* @param filename 文件名
* @return
*/
@Nullable
private String readFromExternalFile(String dirName, String filename) {
//检查外部存储设备
if(!checkExternalState()){
return null;
}
String externalPath = Environment.getExternalStorageDirectory().getAbsolutePath();
//获取文件路径
File dir = new File(externalPath+"/"+dirName+"/");
if (!dir.exists()){
return null;
}
FileInputStream fis = null;
BufferedReader reader = null;
try {
fis = new FileInputStream(new File(dir, filename));
reader = new BufferedReader(new InputStreamReader(fis));
StringBuilder builder = new StringBuilder();
String line;
if((line = reader.readLine())!=null){
builder.append(line);
}
return builder.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fis != null){
fis.close();
}
if(reader != null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 存储到外部
* @param dirName 文件夹
* @param filename 文件名
* @param content
* @return
*/
private boolean saveToExternalFile(String dirName, String filename, String content) {
if (!checkExternalState()) {
return false;
}
//获取外部存储的绝对路径
String externalPath = Environment.getExternalStorageDirectory().getAbsolutePath();
File dir = new File(externalPath +"/"+dirName+"/");
if (!dir.exists()){
//如果路径不存在就创建文件夹
dir.mkdir();
}
if(filename == null || filename.length() == 0 || content == null ||content.length() == 0){
return false;
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(dir, filename));
fos.write(content.getBytes());
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fos != null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
/**
* 检查外部存储设备
* @return
*/
private boolean checkExternalState() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
/**
* 获取到权限
* @param requestCode
* @param perms
*/
@Override
public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
Log.i("Data","request code:"+requestCode);
Toast.makeText(this,"已获取外部存储权限",Toast.LENGTH_SHORT).show();
}
/**
* 权限被拒绝
* @param requestCode
* @param perms
*/
@Override
public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
Toast.makeText(this,"拒绝外部存储权限",Toast.LENGTH_SHORT).show();
}
/**
* 重写onRequestPermissionsResult,用于接受请求结果
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//将请求结果传递EasyPermission库处理
EasyPermissions.onRequestPermissionsResult(requestCode,permissions,grantResults,this);
}
}