美文网首页
Android 对SD卡,File的操作

Android 对SD卡,File的操作

作者: 图之 | 来源:发表于2018-11-02 15:23 被阅读0次

操作File

创建一个File实例:

/**
*parent :文件的保存路径
*child: 文件名(xx.jpg、xx.apk、xx.png)
*/
File file = new File(Sting parent,String child);

常用的方法:

createNewFile(); //创建一个文件,只有该文件不存在时才可以成功创建
mkdir();//创建一个文件夹,如果创建目标文件夹父级目录不存在就会创建不成功
mkdirs();//创建一个文件夹,如果创建目标文件夹父级目录不存在则会依次创建父级目录
isFile();//判断是否是一个文件
isDictory();//判断是否是一个文件夹
delete();//删除一个文件或者文件夹(如果删除的文件夹中还有文件或者文件夹,则不能删除)
exists();//判断文件或者文件夹是否存在
getName();//获取文件或者文件夹的名称
getPath();//获取相对路径
//获取绝对路径
length();//获取文件或者文件夹的长度

如果实例化File时参数为绝对路径,则 “getPath();” 与“getAbsolutePath();” 得到的效果相同。

操作SD卡

操作SD卡需要获取的权限:

READ_EXTRNAK_STORAGE//读SD卡权限
WRITE_EXTRNAK_STORAGE//写SD卡权限

因为这两个权限在同一个危险权限组内(STORAGE),所以只要获取其中一个权限,另一个权限就默认隐式拥有,不必获取。
如果你要在应用程序的私有目录中读取和写入文件时,就不需要获取以上两个权限。
私有目录获取路径:

Context.getExternalFilesDir(String)
Context.getExternalCacheDir()

内部存储

data目录为内部存储目录
data目录中存放的是引用保存的数据(sharedPreferenced和数据库)

外部存储

外部存储才是最常用的操作,我们下载的图片,apk都应该保存在外部存储中
外部存储分为公有存储私有存储

公有存储

在“/storage/emulated/0”目录下创建的目录或文件都在公有存储中,公有存储的文件不会因为应用程序的卸载而删除

获取SD卡根目录:

Environment.getExternalStorageDirectory();//       /storage/emulated/0/

获取9大公有目录:

//type:九大公有目录
Environment.getExternalStoragePublicDirectory(int type);
私有存储

在“/storage/emulated/0/Android/data/应用包名/”目录下创建的目录或文件都在私有存储中,私有目录下的文件会在apk卸载时一并删除掉。
获取私有目录:

//如果不想指定九大目录,则参数为“”即可
Context.getExternalFilesDir("").“getAbsolutePath()

Android 7.0 新特性之应用文件限制访问

如果一项包含文件URL的intent离开应用,则应用出现故障,并出现FileUriExposedException异常
要应用共享文件,应该发送一项content://URL,并授予URL临时访问权限。进行此授权的最简单方式是使用FileProvider类。

URL

uri指通用资源标识符,其组成分为三部分(scheme+authority+path)
举个例子

content://com.xxx.fileprovider/xxx/apk
//xxx是包名
//scheme为content
//authority为com.xxx.fileprovider
//path为/xxx/apk

URL和URI的区别
URL表示一个地址
URI表示一个资源

FileProvider出现的原因
利用FileProvider避免完整的文件目录暴露
被保护后的URI:
content://com.xxx.fileprovider/xxx/apk

<meta_data>标签有什么用
用于给组件提供数据,可以用在application和四大组件中
它本身是一个键值对,有以下几个属性

<meta-data
android :name="userCode"
android :resource="@xml/file_path"
android :value="123123">
</meta-data>
//name:该item唯一的名称(类似于key)
//resource:资源id,并非资源id对应的值,可以通过bundle.getIn()获取到id的值
//value:分配给item的值

Java代码中获取值
标签在application中

ApplicationInfo applicationInfo =getPakeageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = applicationInfo.matData;
int userCode =bundle.getIn("userCode1"); 

标签在activity中

ActivityInfo activityInfo = this.getPackageManager().getActivityInfo(
                    new ComponentName(this, MetadataActivity.class), PackageManager.GET_META_DATA);
Bundle bundle = activityInfo .matData;
int userCode =bundle.getString("userCode1"); 

相关文章

网友评论

      本文标题:Android 对SD卡,File的操作

      本文链接:https://www.haomeiwen.com/subject/zzcqxqtx.html