文章目录
Android
安卓开发者指南:https://developer.android.google.cn/guide
Android五大存储
Android常用五大数据存储:
1.SharedPreferences存储数据
2.文件存储(内部,外部)
3.SQLite数据库存储(嵌入式数据库)
4.ContentProvider存储数据
5.网络存储数据
1 SharedPreferences存储数据
●用于存放一些类似登录的配置信息
●本质上是一个xml文件,是通过类似键值对的方式存放信息
●位于程序私有目录中,即data/data/[packageName]/shared_prefs
SharedPreferences操作模式
●MODE_APPEND:追加方式存储
●MODE_PRIVATE:私有方式存储,其他应用无法访问
●MODE_WORLD_READABLE:可被其他应用读取
●MODE_WORLD_WRITEABLE:可被其他应用写入
1.1操作步骤
SharedPreferences存储
View–ToolWindows–DeviceFileExplorer找到data/data/[packageName]/shared_prefs
myshare.xml
SharedPreferences的读取
edt.clear();清空
2 文件存储(内部,外部)
●内存 Memory:设备容量
●内部存储 InternalStorage:实际存在的位置
●外部存储 ExternalStorage
2.1 外部存储
外部存储 ExternalStorage
●storage或者mnt文件夹
●Environment.getExternalStorageDirectory()
●公有目录 ( DCIM、DOWNLOAD等)
●私有目录 ( Android/data/应用包名)
获取外部存储的目录
●Context.getExternalFilesDir();
获取到SDCard / Android / data / 包名 / files / 目录
●Context.getExternalCacheDir();
获取到SDCard / Android / data / 包名 / cache / 目录
![](https://i-blog.csdnimg.cn/blog_migrate/7b45b59052bbc25f2fe62d28129f4de6.png)
操作外部存储要添加权限:写权限,内存卡权限
Android6.0动态权限申请
外部存储的动态权限
●ContextCompat.checkSelfPermission(context, permission)
●ActivityCompat.requestPermissions(activity, permissions, code)
内部存储不需要权限。
Android6.0动态权限申请概述
Android 6.0 (API 23)之前应用的权限在安装时全部授予,运行时应用不再需要询问用户。在Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限需要在运行时根据用户的需要动态授予。这样用户就不需要在安装时被强迫同意某些权限。
正常权限和危险权限
(1)正常权限:
涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。这些权限在应用安装时授予,运行时不再询问用户。例如:网络访问、WIFI状态、音量设置等。完整的正常权限列表参考官网正常权限。
(2)危险权限:
涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如:读取通讯录、读写存储器数据、获取用户位置等。如果应用声明需要这些危险权限,则必须在运行时明确告诉用户,让用户手动授予。
权限组
Android系统对所有的危险权限进行了分组,称为权限组。属于同一组的危险权限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得该权限组下的所有权限。
在运行时请求权限
设备系统是Android 6.0 (API 23)或更高版本,并且应用的targetSdkVersion是23或更高版本,则针对在AndroidManifest.xml中声明的危险权限,在运行时还需要动态请求用户授权。动态权限请求相关操作的API封装在android.support.v4包中,发起请求权限的Activity 需要直接或间接继承android.support.v4.app.FragmentActivity。代码步骤中主要包含以下几个方法:
(1)检查权限
ContextCompat. checkSelfPermission (Context context, String permission)
返回值常量:
有权限:PackageManager.PERMISSION_GRANTED
无权限:PackageManager.PERMISSION_DENIED
当应用需要用到危险权限时,在执行权限相关代码前, 使用该方法判断是否拥有指定的权限。有权限,则继续执行设计需要权限的代码;无权限,则向用户请求授予权限。
(2)解释权限
ActivityCompat.shouldShowRequestPermissionRationale (Activity activity, String pe rmission)
判断是否有必要向用户解释为什么要这项权限。如果应用第一次请求过此权限,但是被用户拒绝了则之后调用该方法将返回true,此时就有必要向用户详细说明需要此权限的原因。如果应用第一 次请求此权限时被用户拒绝,第二次再请求此权限时,用户勾选了权限请求对话框的“不再询问”,则此方法返回false。如果设备规范禁止应用拥有该权限,此方法也返回false。
(3)请求权限
ActivityCompat.requestPermissions (Activity activity, String[] permissions, int requestCode)
当检测到应用没有指定的权限时,调用此方法向用户请求权限。调用此方法将弹出权限请求对话框询问用户"允许" 或’ 拒绝”指定的权限。
权限参数传入的是数组,可以调用该方法一次请求多个权限;传入的权限数组参数以单个具体权限为单位,但弹框询问用户授权时,属于同一权限组的权限将自动合并询问授权一次;请求的权限必须事先在AndroidManifest.xml中有声明,否则调用此方法请求时,将不弹框,而是直接返回"拒绝”的结果;第一次请求权限时,用户点击了"拒绝”,第二次再请求该权限时,对话框将出现“不再询问”复选框,如果用户勾选了“不再询问” 并点击了"拒绝”,则之后再请求此权限组时将不弹框,而是直接返回"拒绝"的结果。
(4)处理结果
请求权限的结果返回和接收一个Activity的返回类似,重写FragmentActivity或Fragment中的onRequestPermissionsResult()方法。
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
//在此处理
}
2.2 内部存储
内部存储InternalStorage
●内部存储,简称为内存
●通过DDMS --> File Explorer可以找到,文件夹叫做data
●内存中有两个文件夹:app,data
获取内部存储的目录
●Context.getFilesDir(),获取敏感数据
获取 /data/data/包名/files
●Context.getCacheDir(),缓存文件等,空间不足就清除这个文件夹
获取 /data/data/包名/cache
各大私有目录对比:
写入内部存储:
读取内部存储文件:
问题
FileNotFound异常解决方案
1.检查下错误提示中的路径是否存在
2.检查权限是否处理正确
3.确认设备是否有SDCard
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
DDMS中data、SDCard目录无法展开
1.模拟器需要更改只读权限,有的真机data目录需要root
2.Environment.getExternalStorageDirectory()的获取目录才是SDCard的实际目录,因为系统不同路径会有差异。
3 SQLite数据库存储(嵌入式数据库)
参考:https://blog.csdn.net/weixin_45044097/article/details/106934171
4 ContentProvider存储数据
四大组件之一:https://blog.csdn.net/weixin_45044097/article/details/107214305