1.内部存储空间
默认情况下,保存到内部存储的文件是应用的私有文件,其他应用(和用户)不能访问这些文件。 当用户卸载您的应用时,这些文件也会被移除。
内部存储,用户如果不root手机是看不到的内部存储的。通常用户看到的都是外部存储,用户可以操控的也只是
外部存储,我们可以通过程序来访问内部存储getFileDir()
官方关于内部存储。
2.外部存储空间
每个兼容 Android 的设备都支持可用于保存文件的共享“外部存储”。 该存储可能是可移除的存储介质(例如 SD 卡)或内部(不可移除)存储。 保存到外部存储的文件是全局可读取文件,而且,在计算机上启用 USB 大容量存储以传输文件后,可由用户修改这些文件。
这里提醒大家一点,千万不要简单得理解外部存储就是SD卡里的存储,我之前对这是有些模糊。如果对内部存储外部存储不是很清晰,看这里,官方关于外部存储
这里是借用了一下别人博客的图,大家看到,有包名的路径我们都是调用Context中的方法来获得,
没有包名的路径,我们直接调用Environment中的方法获得。
Attention Please:我要说的就是我会忘记的东西
从 Android 4.4 开始,读取或写入应用私有目录中的文件不再需要 READ_EXTERNAL_STORAGE
或 WRITE_EXTERNAL_STORAGE
权限。 因此,您可以通过添加 maxSdkVersion
属性来声明,只能在较低版本的 Android 中请求该权限:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
...
</manifest>
总结一下:
当我们不希望用户看到我们的数据,也不希望其他应用程序访问我们的数据时,我们使用内部存储。当然使用内部存储也不是一定不能与其他应用共享这里的文件,API 17以后 FileProvider
与 FLAG_GRANT_READ_URI_PERMISSION
配合使用,具体请看官方说明,但是内部存储的空间有限,我们首先选择的应该还是外部存储。
外部存储分为两个部分,一个部分是公共的部分,其他应用可以访问,一部分是私有部分,也带有包名,这里我们可以存放应用私有的信息。其他应用不允许访问。一般情况下我们的文件希望用户和其他应用程序共享的时候,我们都放在外部存储里面,不希望别的应用程序访问我们的资源时放在外部存储的私有目录里(即带有包名的目录),如果想要加密可以用对称加密,秘钥存放在Android Keystore里面就可以了。当然如果事先在APK端已经出现秘钥而不是服务器传递过来,那么这个时候就不能放在KeyStore里了,而要选择存放在native层,用so文件取得,注意native层要用签名验证,不然别人拿到你的so用你的so文件也是能获取你的密码。