Android存储(1)-你还在乱用Android存储嘛!

简介

Q: 为什么会单独详解Android存储这个模块?

A: 进一步分析Google对Android存储模块的设计,最初只支持内部存储,到后来国内ROM厂商各自改造,人为的把内部存储分为,导致开发者对Androi存储系统产生很多迷惑。同时破坏了Android原有的生态系统,Google一直对这块都没有发布更新,直到引入了的方式来支持外置的SD卡。

Q: 现有Android存储模块乱用现象有哪些?

A: 1、随意创建文件夹 2、随意访问别的应用数据 3、私有数据和公有数据没有明显区分

存储区概念

所有的设备都有两块存储区域:和。它们的名称来源于早期的系统,那时候大家的手机都内置()一块较小存储板(即),并配上一个的外置的()储存卡(即)。后来部分手机开始将最初定义的,即,分成和两部分。这样一来就算没有,手机也有和两块存储区域。当手机可以插入外置SD卡的时候,这个时候插入的SD卡被称作

这两块存储区域的区别是:

封装库(对内外存储常用API封装)

Storage https://github.com/changjiashuai/Storage

使用

1

2

3

存储选项

在系统中你有仔细考虑过数据的存储使用吗?例如数据应该是应用的私有数据,还是可供其他应用(和用户)访问,以及您的数据需要多少空间等。在提供了多种选项来保存永久性的应用数据。

本文介绍其中的两种方式(其余的另开博文介绍)。1、内部存储 2、外部存储

最后会针对这两种方式常用进行封装,并提供。

扩展阅读

Android存储(2)–适配器存储

Android存储(3)–外部存储暴露给应用程序之前Android系统挂载过程

Android存储(4)–各种设备类型的外部存储配置示例:,, 从此再也不会为获取外置存储路径中出现,而疑惑啦

以下正式开始本文内容介绍

内部存储

在设备内存中存储私有数据。

内部存储在Android文件系统的位置是当我们在打开DDMS下的File Explorer面板的时候,目录就是所谓的内部存储(ROM)。但是注意,当手机没有root的时候不能打开此文件夹。

其中的两个目录重点说下:

/data/app : app文件夹里存放着我们所有安装的app的apk文件

/data/data: 第二个文件夹是data,也就是我们常说的/data/data目录(存储包私有数据)

应用内部私有数据:/data/data/包名/XXX

此目录下将每一个APP的存储内容按照包名分类存放好。

比如:

包名/shared_prefs 存放该APP内的SP信息

包名/databases 存放该APP的数据库信息

包名/files 将APP的文件信息存放在files文件夹

包名/cache 存放的是APP的缓存信息

您可以直接在设备的内部存储中保存文件。默认情况下,保存到内部存储的文件是应用的私有文件,其他应用(和用户)不能访问这些文件。当用户卸载您的应用时,这些文件也会被移除。Android对其提供了一些方法可以操作这些数据

要创建私有文件并写入到内部存储:

使用文件名称和操作模式调用。这将返回一个。

使用写入到文件。

使用关闭流式传输。

要从内部存储读取文件:

调用并向其传递要读取的文件名称。这将返回一个。

使用读取文件字节。

然后使用关闭流式传输。

保存缓存文件

如果您想要缓存一些数据,而不是永久存储这些数据,应该使用 来打开一个,它表示您的应用应该将临时缓存文件保存到的内部目录。

当设备的内部存储空间不足时,Android 可能会删除这些缓存文件以回收空间。 但您不应该依赖系统来为您清理这些文件, 而应该始终自行维护缓存文件,使其占用的空间保持在合理的限制范围内(例如 1 MB)。 当用户卸载您的应用时,这些文件也会被移除。

其他实用方法

获取在其中存储内部文件的文件系统目录的绝对路径。

在您的内部存储空间内创建(或打开现有的)目录。

删除保存在内部存储的文件。

返回您的应用当前保存的一系列文件。

针对以上Android提供的API简单封装内部存储类如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

外部存储

在共享的外部存储中存储公共数据。

每个兼容 Android 的设备都支持可用于保存文件的共享“外部存储”。 该存储可能是可移除的存储介质(例如 SD 卡)或内部(不可移除)存储。 保存到外部存储的文件是全局可读取文件,而且,在计算机上启用 USB 大容量存储以传输文件后,可由用户修改这些文件。

注:如果用户在计算机上装载了外部存储或移除了介质,则外部存储可能变为不可用状态,并且在您保存到外部存储的文件上没有实施任何安全性。所有应用都能读取和写入放置在外部存储上的文件,并且用户可以移除这些文件。

获取外部存储的访问权限

要读取或写入外部存储上的文件,您的应用必须获取或系统权限。 例如:

1

2

3

4

如果您同时需要读取和写入文件,则只需请求 WRITE_EXTERNAL_STORAGE 权限,因为此权限也隐含了读取权限要求。

注:从 Android 4.4开始,如果您仅仅读取或写入应用的私有文件,则不需要这些权限。 如需了解更多信息,请参阅下面有关保存应用私有文件的部分。

检查介质可用性

在使用外部存储执行任何工作之前,应始终调用以检查介质是否可用。介质可能已装载到计算机,处于缺失、只读或其他某种状态。

1

2

保存可与其他应用共享的文件

一般而言,应该将用户可通过您的应用获取的新文件保存到设备上的“公共”位置,以便其他应用能够在其中访问这些文件,并且用户也能轻松地从该设备复制这些文件。 执行此操作时,应使用共享的公共目录之一,例如 、 和 等。

要获取表示相应的公共目录的,请调用,向其传递您需要的目录类型,例如、、或其他类型。通过将您的文件保存到相应的媒体类型目录,系统的媒体扫描程序可以在系统中正确地归类您的文件(例如铃声在系统设置中显示为铃声而不是音乐)。

例如,以下方法在公共目录中创建了一个指定名称的目录:

保存应用私有文件

如果您正在处理的文件不适合其他应用使用(例如仅供您的应用使用的图形纹理或音效),则应该通过调用来使用外部存储上的私有存储目录。此方法还会采用参数指定子目录的类型(例如)。 如果您不需要特定的媒体目录,请传递以接收应用私有目录的根目录。

从 开始,读取或写入应用私有目录中的文件不再需要或权限。因此,您可以通过添加 属性来声明,只能在较低版本的中请求该权限:

1

2

3

4

5

注:当用户卸载您的应用时,此目录及其内容将被删除。此外,系统媒体扫描程序不会读取这些目录中的文件,因此不能从内容提供程序访问这些文件。 同样,不应将这些目录用于最终属于用户的媒体,例如使用您的应用拍摄或编辑的照片或用户使用您的应用购买的音乐等 — 这些文件应保存在公共目录中。

有时,已分配某个内部存储器分区用作外部存储的设备可能还提供了SD卡槽。在使用运行和更低版本的这类设备时,方法将仅提供内部分区的访问权限,而您的应用无法读取或写入SD卡。不过,从开始,可通过调用来同时访问两个位置,该方法将会返回包含各个位置条目的数组。数组中的第一个条目被视为外部主存储;除非该位置已满或不可用,否则应该使用该位置。 如果您希望在支持 和更低版本的同时访问两个可能的位置,请使用支持库中的静态方法 。 在 和更低版本中,此方法也会返回一个数组,但其中始终仅包含一个条目

注意: 尽管内容提供程序不能访问和所提供的目录,但其他具有权限的应用仍可访问外部存储上的所有文件,包括上述文件。如果您需要完全限制您的文件的访问权限,则应该转而将您的文件写入到内部存储。

保存缓存文件

要打开表示应该将缓存文件保存到的外部存储目录的,请调用。 如果用户卸载您的应用,这些文件也会被自动删除。

与前述相似,您也可以通过调用来访问辅助外部存储(如果可用)上的缓存目录。

提示:为节省文件空间并保持应用性能,您应该在应用的整个生命周期内仔细管理您的缓存文件并移除其中不再需要的文件,这一点非常重要。

针对以上Android提供的API简单封装内部存储类如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

注意事项

自API级别17以来,常量和已被弃用。从开始,使用这些常量将会导致引发。这意味着,面向和更高版本的应用无法按名称共享私有文件,尝试共享URI将会导致引发。如果您的应用需要与其他应用共享私有文件,则可以将与配合使用。另请参阅共享文件(后续会讲解)。

提示:如果在编译时想要保存应用中的静态文件,请在项目的目录中保存该文件。可以使用打开该资源并传递资源 。此方法将返回一个,您可以使用该流式传输读取文件(但不能写入到原始文件)。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180903G1VR2G00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券