关于Android读取SD卡存储的动态申请

介绍

这篇文章主要关于我学习SD卡的动态获取权限时的一些问题。

Android的目录结构

参考自解析Android内部存储、外部存储的区别
图:目录结构
以我的手机为例,可以看到:
手机目录
与adb shell的ls命令相结合:
shell ls命令
可见,一般的手机用户(即非程序员用户)在手机的文件管理所能看到、操纵的文件都是手机的/storage/emulated/0目录下文件。

数据的主要存储方式

疯狂Android讲义–第四版中,主要提到的几种存储方式中:

  • 使用数据文件夹。即内存储
    • 使用SharedPreferences与Editor
      数据总保持在/data/data/< package name>/shared_prefs中
    • 使用openFileOutput和openFileInput
      数据总保持在/data/data/< package name>/files中
  • 读取SD卡上文件
    数据总保存在/storage/emulated/0目录下。
  • SQLite数据库
    嗯,存储的位置大概是比较随意。
    而这篇文章主要是关于SD卡的

疑惑

在学习教科书时,我发现课本的8.2.2节中,用Genymotion模拟器(google nexus 5,API 23)可以基本还原实验效果,但用我本人的真机(红米k30)以及Android Studio(Pixel_XL_API_30)自带的就不行了。
同时每次访问SD卡,都要来个:
在这里插入图片描述
你说这谁顶得住啊?
我搜了一下,说什么Android 6.0+需要动态申请。尤其是我发现,平时的文件也是放在所谓的SD卡目录下的,为什么其他应用就不用说什么动态申请?

原来的代码:MainActivity.java

package com.example.android.filetest;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

/**
 * Description:<br>
 * 网站: <a href="http://www.crazyit.org">疯狂Java联盟</a><br>
 * Copyright (C), 2001-2020, Yeeku.H.Lee<br>
 * This program is protected by copyright laws.<br>
 * Program Name:<br>
 * Date:<br>
 *
 * @author Yeeku.H.Lee kongyeeku@163.com<br>
 * @version 1.0
 */
public class MainActivity extends Activity {
   
    private static final String FILE_NAME = "/crazy.bin";
    private EditText edit1;
    private TextView edit2;
    File f1;
    File f2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取两个按钮
        Button read = findViewById(R.id.read);
        Button write = findViewById(R.id.write);
        // 获取两个文本框
        edit1 = findViewById(R.id.edit1);
        edit2 = findViewById(R.id.edit2);
        // 为write按钮绑定事件监听器
        write.setOnClickListener(view 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值