Android总结之内部&外部存储分析

Android在开发中使用Storage是必不可少的,但内部存储和外部存储却让不少人迷茫,不知道怎么区分,网络上也有很多介绍这方面的文章,本文是从自己开发应用的角度对常用的Storage进行了汇总一览

Android内部&外部存储分析

        • 1.Storage存储方式一览(参考图1.1)
          • 1.1.三者区别主要可以从下列角度分析:
            • 1.1.1.方法被调用的类不同
            • 1.1.2.存储的目录不同(参考图1.2)
            • 1.1.3.应用卸载后这些目录下的数据文件保留状态的不同
            • 1.1.4.应用权限申请的不同
        • 2.外部存储权限使用方法
          • 2.1.在AndroidManifest.xml中申明权限
          • 2.2.代码中对权限进行动态申请
            • 2.2.1.判断是否有权限
            • 2.2.2.申请权限的回调函数实现
        • 3.getExternalStoragePublicDirectory(type)和getExternalFilesDir(type)参数说明

1.Storage存储方式一览(参考图1.1)

图1.1主要介绍了2类存储方式,internal Storage(内部存储)external Storage(外部存储)
external Storage又分为2种:Public Directory(公有目录)Private Directory(私有目录)
Android总结之内部&外部存储分析_第1张图片

1.1.三者区别主要可以从下列角度分析:
1.1.1.方法被调用的类不同

internal Storageexternal Storage(Private Directory)都是通过android.content.Context类的对象来调用的,一般我们可以在Activity中直接调用getFilesDir()等方法,因为Activity的祖先类是Context,而external Storage(Public Directory)是直接通过android.os.Enviroment直接调用静态方法操作的

1.1.2.存储的目录不同(参考图1.2)

internal Storage是以/data/user/0/package_name开头的,external Storage(Public Directory)是以/storage/emulated/0开头的,而external Storage(Private Directory)是以/storage/emulated/0/Android/data/package_name,这里package_name是应用的包名,可参考AndroidManifest.xml中的

1.1.3.应用卸载后这些目录下的数据文件保留状态的不同

如果应用被卸载了,保存在internal Storageexternal Storage(Private Directory)的数据文件也会被删除,而保存在external Storage(Public Directory)不会被删除

1.1.4.应用权限申请的不同

internal Storageexternal Storage(Private Directory)是不需要应用访问权限的,而external Storage(Public Directory)是需要应用外部存储访问权限的,具体用法参考本文"外部存储权限使用方法"
Android总结之内部&外部存储分析_第2张图片

2.外部存储权限使用方法

2.1.在AndroidManifest.xml中申明权限

(其实只需声明写的权限,写的权限有了读的权限也就有了)

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2.2.代码中对权限进行动态申请

(在android 6以前只在AndroidManifest.xml声明一下,就可以使用外部存储了,但android 6以后还得在代码中动态申请)

2.2.1.判断是否有权限
 if (ContextCompat.checkSelfPermission(MainActivity.this, 
 						Manifest.permission.WRITE_EXTERNAL_STORAGE)
                       != PackageManager.PERMISSION_GRANTED) {
    /* request WRITE_EXTERNAL_STORAGE permission if not granted */
     ActivityCompat.requestPermissions(MainActivity.this,
     			 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
             	WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
 }
2.2.2.申请权限的回调函数实现
    /**
     * override request permission callback method here
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, 
    									String[] permissions, 
   										int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
	    /**
	     * WRITE_EXTERNAL_STORAGE_REQUEST_CODE is use-defined code 
	     * to identify your permission request
	     */
        if(requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE){
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
	            /**
			     * grant permission successfully
			     * you can write your code here
			     */
            }else{
	            /**
			     * grant permission Failed
			     */
                Toast.makeText(MainActivity.this, 
                	"please agree to premisson of writing storage frist"+
                	"before you use this application", 
                	Toast.LENGTH_SHORT).show();
            }
        }
    }

3.getExternalStoragePublicDirectory(type)和getExternalFilesDir(type)参数说明

变量名 说明
Environment.DIRECTORY_MUSIC Music 音乐
Environment.DIRECTORY_PODCASTS Podcasts 播客
Environment.DIRECTORY_ALARMS Alarms 警告
Environment.DIRECTORY_RINGTONES Ringtones 随机铃声
Environment.DIRECTORY_NOTIFICATIONS Notifications 通知
Environment.DIRECTORY_PICTURES Pictures 图片
Environment.DIRECTORY_MOVIES Movies 电影
Environment.DIRECTORY_DOWNLOADS Download 下载
Environment.DIRECTORY_DCIM DCIM 相册
Environment.DIRECTORY_DOCUMENTS Documents 文档

你可能感兴趣的:(Android)