Android在開發中使用Storage是必不可少的,但內部存儲和外部存儲卻讓不少人迷茫,不知道怎麼區分,網絡上也有很多介紹這方面的文章,本文是從自己開發應用的角度對常用的Storage進行了彙總一覽
Android內部&外部存儲分析
1.Storage存儲方式一覽(參考圖1.1)
圖1.1主要介紹了2類存儲方式,internal Storage(內部存儲)
和 external Storage(外部存儲)
external Storage又分爲2種:Public Directory(公有目錄)
、Private Directory(私有目錄)
1.1.三者區別主要可以從下列角度分析:
1.1.1.方法被調用的類不同
internal Storage
和external 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 Storage
和external Storage(Private Directory)
的數據文件也會被刪除,而保存在external Storage(Public Directory)
不會被刪除
1.1.4.應用權限申請的不同
internal Storage
和external 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 | 文檔 |