zoukankan      html  css  js  c++  java
  • 有关Android存储的相关概念辨析

    我想念许多Android开发人员在碰到有关存储的相关问题时,肯定遇到过“内部存储/内存”、“外部存储/外存”等类似的概念,尤其是将相关概念跟非开发人员解释时,那真是“秀才遇到兵,有理说不清哪”。包括我自己在内,之前也对这些概念有些认识不清。所以我觉得有必要对这些概念进行深入的辨析一下。

    我曾经在Android手机外置SD卡(TF卡)的获取方法这篇博客中尝试获取Android手机中所有外置存储卡的路径,并且它也奏效了,但是那时候我对这些概念还不十分的清楚他们之间的差别,所以就更加应该写这篇文章了。

    首先,要弄明白这些概念:内置存储外部存储第二外部存储
    内置存储:即Internal Storage,该存储一般情况下用户是不可以访问的,除非通过已安装应用或者刷过机获取了root权限。比如该目录“data/data/your-package-name”即属于内置存储。
    外部存储:即External Storage,也叫首要外部存储(Primary External Storage),属于内置于手机的共享的存储,用户可以通过插入USB线在主机电脑上作为一个驱动来访问它。例如我们常说“Nexus 5 32G”,其中的“32G”即指该部分存储。
    第二外部存储:即Secondary External Storage,是部分Android手机预留插口,可以插入的存储设备,如SD Card,这部分存储可以随时插拔。但并不是所有手机都支持可插拔的第二外部存储,例如Nexus 5,就不支持。作用Google的原生手机,这也是Google不推荐预留第二外部存储的良好体现。
    我们知道,在Android 4.4(API 19)中,Android引进了“存储访问框架”(Storage Access Framework)。那么在新的API情况下,如何访问SD Card存储即第二外部存储呢?
    新API下查看目录树与旧API有些许相似,但又有许多不同。
    启动intent以选择目录树时,要像这样:
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    startActivityForResult(intent, 42);
    然后重写onActivityResult(),将用户选择的Uri传递给DocumentFile帮助类。下面是个小例子,用以在选定的文件夹中列出所有文件,然后再创建新的文件:

     1 public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
     2     if (resultCode == RESULT_OK) {
     3         Uri treeUri = resultData.getData();
     4         DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
     5         // List all existing files inside picked directory
     6         for (DocumentFile file : pickedDir.listFiles()) {
     7             Log.d(TAG, "Found file " + file.getName() + " with size " + file.length());
     8         }
     9         // Create a new file and write into it
    10         DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");
    11         OutputStream out = getContentResolver().openOutputStream(newFile.getUri());
    12         out.write("A long time ago...".getBytes());
    13         out.close();
    14     }
    15 }
    View Code

    DocumentFile.getUri()返回的Uri可以灵活地跟各个版本的API一直使用。比如,你可以使用Intent.setData()Intent.FLAG_READ_URI_PERMISSIONUri分享。如果你想要从本地代码中访问Uri,你可以调用ContentResolver.openFileDescriptor(),然后使用ParcelFileDescriptor.getFd()或者detachFd()来获取传统的POSIX文件描述整型值。

  • 相关阅读:
    iOS开发>学无止境
    iOS开发>学无止境
    Review1(C#语言基础)
    Lua
    c#笔记(四)——switch
    鼠标拖拽物体
    lua-路径加载lua文件-函数返回值,访问lua文件中的变量
    lua-1-c# 执行lua文件-调用lua文件中的方法
    Unity实现手机录音功能
    lua-table类的继承
  • 原文地址:https://www.cnblogs.com/littlepanpc/p/4497595.html
Copyright © 2011-2022 走看看