美文网首页
Android访问系统文件

Android访问系统文件

作者: 海东青_fb7a | 来源:发表于2021-12-09 11:43 被阅读0次
  • App专属文件:app专属文件就是那些只有该app才可以使用的文件,这类文件随app的删除而删除,他们可以被存储两个地方:internal storage和external storage;

存储在internal storage:这是你app私有的目录,你的shared preference文件数据库文件都在这里。目录为"data/data/<package name>/file/.." 访问方法为: File fdir=gerFilesDir();

存储在external storage:这类文件存在在"mnt/sdacard/Android/data/<package name>/file/.."目录下。随app的删除而删除。

获取这个路径的方法:File eFile=getExternalFilesDir(null);

有些时候我们的手机没有安装SD卡,所以我们使用前需要判断一下:

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//SD卡已装入}

  • App独立文件:app独立文件就是那些不依赖某些特定app的文件,这类文件当我们删除应用之后,还应该保留在手机上的。 安卓10以后分区存储开启后就不允许访问了

访问方式:

(1)File sdCard=Environment.getExternalStorageDirectory();这个路径为sd卡的根路径mnt/sdcard

(2)File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
这个路径为sd卡的根路径mnt/sdcard/PICTURES/...
对于这类文件,Android给我们提供了特定的目录,这些目录都是以DIRECTORY开头的,例如:DIRECTORY_MUSIC , DIRECTORY_PICTURES。

  • 安卓10适配
    适配安卓10的时候设置requestLegacyExternalStorage = true来修改外部存储空间视图模型
  • 安卓11适配
    如果你的 targetSdkVersion 等于 30,Scoped Storage 就会被强制启用,requestLegacyExternalStorage 标记将会被忽略。

(1)应用专属目录

//分区存储空间
val file = File(context.filesDir, filename) 
//应用专属外部存储空间
val appSpecificExternalDir = File(context.getExternalFilesDir(), filename) 

(2)访问公共媒体目录文件

val cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, "${MediaStore.MediaColumns.DATE_ADDED} desc")
if (cursor != null) {    
    while (cursor.moveToNext()) {        
        val id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID))        
        val uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id)        
        println("image uri is $uri")    
    }    
    cursor.close()
} 

(3)SAF(存储访问框架--Storage Access Framework)

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)    
intent.addCategory(Intent.CATEGORY_OPENABLE)    
intent.type = "image/*"    
startActivityForResult(intent, 100)     

@RequiresApi(Build.VERSION_CODES.KITKAT)    
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        
    super.onActivityResult(requestCode, resultCode, data)        
    if (data == null || resultCode != Activity.RESULT_OK) 
        return        
    if (requestCode == 100) {            
        val uri = data.data            
        println("image uri is $uri")        
    }    
} 

(4)所有文件访问权限

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />     
val intent = Intent()    
intent.action= Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION    
startActivity(intent)     
//判断是否获取MANAGE_EXTERNAL_STORAGE权限:    
val isHasStoragePermission= Environment.isExternalStorageManager()

相关文章

网友评论

      本文标题:Android访问系统文件

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