Android總結之內部&外部存儲分析

Android在開發中使用Storage是必不可少的,但內部存儲和外部存儲卻讓不少人迷茫,不知道怎麼區分,網絡上也有很多介紹這方面的文章,本文是從自己開發應用的角度對常用的Storage進行了彙總一覽

1.Storage存儲方式一覽(參考圖1.1)

圖1.1主要介紹了2類存儲方式,internal Storage(內部存儲)external Storage(外部存儲)
external Storage又分爲2種:Public Directory(公有目錄)Private Directory(私有目錄)
在這裏插入圖片描述

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中的<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.ibu.ivideoplayer">

1.1.3.應用卸載後這些目錄下的數據文件保留狀態的不同

如果應用被卸載了,保存在internal Storageexternal Storage(Private Directory)的數據文件也會被刪除,而保存在external Storage(Public Directory)不會被刪除

1.1.4.應用權限申請的不同

internal Storageexternal Storage(Private Directory)是不需要應用訪問權限的,而external Storage(Public Directory)是需要應用外部存儲訪問權限的,具體用法參考本文"外部存儲權限使用方法"
在這裏插入圖片描述

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.EngetExternalStoragePublicDirectory(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 文檔
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章