Android文件目录一次说清

  • 说明
    • 应用访问权限及范围
    • 在app内创建文件演示
    • 在其他app内访问上面的app创建的文件

说明

android 中获取目录的API有两种,一种是通过Environment获取,另一种就是通过Context获取。两者获取到的目录区别还是很大的。
通过Environment API获取的目录,不会包含应用的内部目录,也就是带应用包名的目录。
通过Context API获取的目录,绝对路径都会带有改应用的包名,app访问自己包名下的该类文件,不需要额外申请权限

在Android10及以上设备上,即便申请了存储权限,也会报permission Denied . 在manifest文件中,添加: android:requestLegacyExternalStorage= “true”

应用访问权限及范围

这里可以将文件归纳为三种:App共享文件、App独立文件、App专属文件

在app内创建文件演示

package com.shoneworn.dirmake;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;public class MainActivity extends AppCompatActivity {private TextView tvDir;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvDir = findViewById(R.id.tv_dir);}@RequiresApi(api = Build.VERSION_CODES.M)@Overrideprotected void onResume() {super.onResume();
//        initDir();if (Utils.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) && Utils.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {initDir();return;}requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1000);}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (grantResults == null || grantResults.length == 0) {return;}if (requestCode != 1000) {return;}if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();initDir();return;}}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)private void initDir() {StringBuffer sb = new StringBuffer();File externalStorageDirectory = Environment.getExternalStorageDirectory();sb.append("Environment externalStorageDirectory>>" + externalStorageDirectory.getAbsolutePath() + "\n");Log.e("cxx", "Environment externalStorageDirectory>>" + externalStorageDirectory.getAbsolutePath());makeFile(externalStorageDirectory, "env externalStorageDirectory");File dataDirectory = Environment.getDataDirectory();sb.append("Environment dataDirectory>>" + dataDirectory.getAbsolutePath() + "\n");Log.e("cxx", "Environment dataDirectory>>" + dataDirectory.getAbsolutePath());makeFile(dataDirectory, "env dataDirectory");File downloadCacheDirectory = Environment.getDownloadCacheDirectory();sb.append("Environment downloadCacheDirectory>>" + downloadCacheDirectory.getAbsolutePath() + "\n");Log.e("cxx", "Environment downloadCacheDirectory>>" + downloadCacheDirectory.getAbsolutePath());makeFile(downloadCacheDirectory, "env downloadCacheDirectory");File rootDirectory = Environment.getRootDirectory();sb.append("Environment rootDirectory>>" + rootDirectory.getAbsolutePath() + "\n");Log.e("cxx", "Environment rootDirectory>>" + rootDirectory.getAbsolutePath());makeFile(rootDirectory, "env rootDirectory");File externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);sb.append("Environment externalStoragePublicDirectory>>" + externalStoragePublicDirectory.getAbsolutePath() + "\n");Log.e("cxx", "Environment externalStoragePublicDirectory>>" + externalStoragePublicDirectory.getAbsolutePath());makeFile(externalStoragePublicDirectory, "env externalStoragePublicDirectory");Context context = this;File externalFilesDir = context.getExternalFilesDir(null);sb.append("Context externalFilesDir>>" + externalFilesDir.getAbsolutePath() + "\n");Log.e("cxx", "Context externalFilesDir>>" + externalFilesDir.getAbsolutePath());makeFile(externalFilesDir, "externalFilesDir");File externalCacheDir = context.getExternalCacheDir();sb.append("Context externalCacheDir>>" + externalCacheDir.getAbsolutePath() + "\n");Log.e("cxx", "Context externalCacheDir>>" + externalCacheDir.getAbsolutePath());makeFile(externalCacheDir, "externalCacheDir");File[] externalCacheDirs = context.getExternalCacheDirs();sb.append("Context externalCacheDirs>>");for (File file : externalCacheDirs) {sb.append(file.getAbsolutePath() + "  ");Log.e("cxx", "Context externalCacheDirs>>" + file.getAbsolutePath());}sb.append("\n");File filesDir = context.getFilesDir();sb.append("Context filesDir>>" + filesDir.getAbsolutePath() + "\n");Log.e("cxx", "Context filesDir>>" + filesDir.getAbsolutePath());makeFile(filesDir, "filesDir");File cacheDir = context.getCacheDir();sb.append("Context cacheDir>>" + cacheDir.getAbsolutePath() + "\n");Log.e("cxx", "Context cacheDir>>" + cacheDir.getAbsolutePath());makeFile(cacheDir, "cacheDir");File codeCacheDir = context.getCodeCacheDir();sb.append("Context codeCacheDir>>" + codeCacheDir.getAbsolutePath() + "\n");Log.e("cxx", "Context codeCacheDir>>" + codeCacheDir.getAbsolutePath());makeFile(codeCacheDir, "codeCacheDir");File noBackupFilesDir = context.getNoBackupFilesDir();sb.append("Context noBackupFilesDir>>" + noBackupFilesDir.getAbsolutePath() + "\n");Log.e("cxx", "Context noBackupFilesDir>>" + noBackupFilesDir.getAbsolutePath());makeFile(noBackupFilesDir, "noBackupFilesDir");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {File dataDir = context.getDataDir();sb.append("Context dataDir>>" + dataDir.getAbsolutePath() + "\n");Log.e("cxx", "Context dataDir>>" + dataDir.getAbsolutePath());makeFile(dataDir, "dataDir");}File[] externalMediaDirs = context.getExternalMediaDirs();sb.append("Context externalMediaDirs>>");for (File file : externalMediaDirs) {sb.append(file.getAbsolutePath() + "  ");Log.e("cxx", "Context externalMediaDirs>>" + file.getAbsolutePath());}sb.append("\n");File obbDir = context.getObbDir();sb.append("Context obbDir>>" + obbDir.getAbsolutePath() + "\n");Log.e("cxx", "Context obbDir>>" + obbDir.getAbsolutePath());makeFile(obbDir, "obbDir");String s = sb.toString();tvDir.setText(s);}//向各个目录下写入文件private void makeFile(File dir, String name) {if (dir == null || !dir.exists()) {return;}try {File file = new File(dir, "cxx.txt");if (!file.exists()) {file.createNewFile();}OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file, false), // true to append"UTF-8");out.write(getPackageName() + "  name:" + name + "  dir>>" + dir.getAbsolutePath());out.close();} catch (Exception e) {Log.e("cxx", e.getMessage());}}}

看下输出:

E/cxx: Environment externalStorageDirectory>>/storage/emulated/0
E/cxx: Environment dataDirectory>>/data
E/cxx: Permission denied
E/cxx: Environment downloadCacheDirectory>>/data/cache
E/cxx: Permission denied
E/cxx: Environment rootDirectory>>/system
E/cxx: Read-only file system
E/cxx: Environment externalStoragePublicDirectory>>/storage/emulated/0/DCIM//从这里开始,均由context获取的目录,访问不需要申请应用权限,随app卸载而删除
//系统分区下的app私有目录
E/cxx: Context externalFilesDir>>/storage/emulated/0/Android/data/com.shoneworn.dirmake/files
E/cxx: Context externalCacheDir>>/storage/emulated/0/Android/data/com.shoneworn.dirmake/cache
E/cxx: Context externalCacheDirs>>/storage/emulated/0/Android/data/com.shoneworn.dirmake/cache
E/cxx: Context externalMediaDirs>>/storage/emulated/0/Android/media/com.shoneworn.dirmake
E/cxx: Context obbDir>>/storage/emulated/0/Android/obb/com.shoneworn.dirmake//sdcard下应用独有目录
E/cxx: Context filesDir>>/data/user/0/com.shoneworn.dirmake/files
E/cxx: Context cacheDir>>/data/user/0/com.shoneworn.dirmake/cache
E/cxx: Context codeCacheDir>>/data/user/0/com.shoneworn.dirmake/code_cache
E/cxx: Context noBackupFilesDir>>/data/user/0/com.shoneworn.dirmake/no_backup
E/cxx: Context dataDir>>/data/user/0/com.shoneworn.dirmake

可以看到有两个目录下创建文件被拒了。应用想要向这两个目录下创建文件,需要root权限。

在其他app内访问上面的app创建的文件

package com.shoneworn.readfile;import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.Buffer;public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btn_ext_cache).setOnClickListener(this);findViewById(R.id.btn_ext_file).setOnClickListener(this);findViewById(R.id.btn_file_dir).setOnClickListener(this);}@RequiresApi(api = Build.VERSION_CODES.M)@Overrideprotected void onResume() {super.onResume();if (Utils.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) && Utils.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {return;}requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1000);}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (grantResults == null || grantResults.length == 0) {return;}if (requestCode != 1000) {return;}if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();return;}}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btn_ext_file:readFile("/storage/emulated/0/Android/data/com.shoneworn.dirmake/files");break;case R.id.btn_file_dir:readFile("/data/user/0/com.shoneworn.dirmake/files");break;case R.id.btn_ext_cache:readFile("/storage/emulated/0/Android/data/com.shoneworn.dirmake/cache");break;}}private void readFile(String path) {File file = new File(path + File.separator + "cxx.txt");if (!file.exists()) {Log.e("cxx", "read " + file.getAbsolutePath() + " not exists");return;}try {StringBuilder sb = new StringBuilder();FileInputStream fileInputStream = new FileInputStream(file);byte[] buffer = new byte[1024];int len = fileInputStream.read(buffer);while (len > 0) {sb.append(new String(buffer, 0, len));len = fileInputStream.read(buffer);}fileInputStream.close();String s = sb.toString();Log.e("cxx", path + " content:" + s);} catch (Exception e) {Log.e("cxx", e.getMessage());}}
}

看看日志:

 E/cxx: /storage/emulated/0/Android/data/com.shoneworn.dirmake/files content:com.shoneworn.dirmake  name:externalFilesDir  dir>>/storage/emulated/0/Android/data/com.shoneworn.dirmake/filesE/cxx: read /data/user/0/com.shoneworn.dirmake/files/cxx.txt not existsE/cxx: /storage/emulated/0/Android/data/com.shoneworn.dirmake/cache content:com.shoneworn.dirmake  name:externalCacheDir  dir>>/storage/emulated/0/Android/data/com.shoneworn.dirmake/cache

这里只演示了访问其他应用app独立文件和其他应用app专属文件的情况。
访问其他应用app专属文件时直接文件不存在。

Demo下载地址
https://download.csdn.net/download/shoneworn/14046663

Android文件目录及文件访问权限等详解相关推荐

  1. Android各种访问权限Permission详解

    在Android的设计中,资源的访问或者网络连接,要得到这些服务都需要声明其访问权限,否则将无法正常工作.在Android中这样的权限有很多种,这里将各类访问权限一一罗列出来,供大家使用时参考之用. ...

  2. java 接口访问权限_详解Java之路(五) 访问权限控制

    在Java中,所有事物都具有某种形式的访问权限控制. 访问权限的控制等级从最大到最小依次为:public,protected,包访问权限(无关键词)和private. public,protected ...

  3. windows服务器文件夹权限设置详解,windows服务器如何设置文件夹权限

    windows服务器如何设置文件夹权限 内容精选 换一换 实际业务场景下,您可能会需要将文件临时分享给其他人或者将文件永久共享给其他人.临时分享:通过文件的临时URL直接将其分享给其他用户.文件分享强 ...

  4. linux 进程 setuid,Linux SetUID(SUID)文件特殊权限用法详解

    在讲解<权限位>一节时提到过,其实除了 rwx 权限,还会用到 s 权限,例如: [root@localhost ~]# ls -l /usr/bin/passwd -rwsr-xr-x. ...

  5. linux 添加sbit权限,Linux Stick BIT(SBIT)文件特殊权限用法详解

    Sticky BIT,简称 SBIT 特殊权限,可意为粘着位.粘滞位.防删除位等. SBIT 权限仅对目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或目录,就只有自己和 root ...

  6. Android Studio SD卡访问权限及asserts文件夹下的文件操作

    Android Studio SD卡访问权限 1.在 AndroidManifext.xml 中添加如下代码 <uses-permission android:name="androi ...

  7. android 请求sd卡权限,androidQ sd卡权限使用详解

    默认情况下,如果应用以 Android Q 为目标平台,则在访问外部存储设备中的文件时会进入过滤视图.应用可以使用 Context.getExternalFilesDir() 将专用于自己的文件存储在 ...

  8. android sdcardfs 权限,androidQ sd卡权限使用详解

    默认情况下,如果应用以 Android Q 为目标平台,则在访问外部存储设备中的文件时会进入过滤视图.应用可以使用 Context.getExternalFilesDir() 将专用于自己的文件存储在 ...

  9. Linux 权限管理: 权限的概念、权限管理、文件访问权限的设置、 粘滞位

    Linux下的基本指令 目录: 权限的概念 权限管理 文件访问权限的设置方法 目录的权限 粘滞位 权限的概念 Linux下用户有两种: 超级用户(root).普通用户. 超级用户:具有最高权限,可以在 ...

最新文章

  1. 7_7_2013 E.Function
  2. 记录QT片断1-(痛苦的win32)
  3. 【Android 安全】DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar | enjarify | jd-gui | jadx )
  4. 用反向传导模拟共振并用共振频率作分类
  5. 关于玻璃体捐献的想法
  6. Windows VS c++复制文件到网络共享文件夹的实现
  7. SASS简介及使用方法
  8. 【Linux入门学习之】Linux文件权限与目录配置
  9. MOSS2007-学习笔记-备忘录-单点登录-(1)-我的网站'?
  10. java对话框进度条_java进度条
  11. C语言的printf输出格式
  12. 术语-MOSS-微软协作工具:MOSS(微软协作工具)
  13. BottledWater-PG安装部署
  14. 新概念英语(第一册)复习(原文及全文翻译)——Lesson 111 - Lesson 130
  15. 物联网毕设 -- ESP32-CAN加摄像头传输图像,STM32驱动小车自动避障图像采集并显示到Android端
  16. 5G时代来临,电影行业面临的机遇与挑战
  17. ————博客永久废止————转到http://1su.net/nsB
  18. Eclipse+tomcat开发j2ee经典入门例子
  19. Professional C# 6 and .NET Core 1.0 - Chapter 41 ASP.NET MVC
  20. MySQL 03 高级查询(一)

热门文章

  1. 限免|iOS长截图工具 滚动截屏
  2. 【数据结构】【实验作业05】求两个集合的并集、交集、差集,集合用链表
  3. 记录一次H3C交换机的配置
  4. 两百行代码实现动态圣诞树—你值得拥有
  5. 笔迹鉴定流程,都需要什么,费用多少?
  6. `CSS filter` 有哪些神奇用途
  7. 单片机彩灯移动实验_实验一 单片机彩灯控制器的电路设计与仿真
  8. 关于python使用Onenbsp;Classamp;nbs…
  9. 如何让alias永久生效?
  10. Spring声明式事务管理的配置详解