PathMgr(重要)
ImagePickerMgr(图片选择)
Log2File(日志)
ActivityPersonalInfo(ai教练,没用到)
Global(另外一个手环的)
sAppDir += ".yuedong/";不起作用
1) 先申请前台位置信息访问权限
2) 再申请后台位置信息访问权限,也就是所谓的“始终允许”,而用户将被引导到设置中进行授予
- requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)
- Android11 设备,targetSdkVersion<=29 (Android 10), 申请前台和后台位置权限:
- requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)
- Android11 设备,targetSdkVersion=30 (Android 11), 申请前台和后台位置权限:
requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)
targetSdkVersion<30
情况下,如果你之前就有判断过前台和后台位置权限,那就无需担心,没有什么需要适配。targetSdkVersion>30
情况下,需要分开申请前后台位置权限,并且对后台位置权限申请做好说明和引导,当然也是为了更好的服务用户
val permissionAccessCoarseLocationApproved = ActivityCompat
.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED
if (permissionAccessCoarseLocationApproved) {
val backgroundLocationPermissionApproved = ActivityCompat
.checkSelfPermission(this, permission.ACCESS_BACKGROUND_LOCATION) ==
PackageManager.PERMISSION_GRANTED
if (backgroundLocationPermissionApproved) {
//前后台位置权限都有
} else {
//申请后台权限
if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.R){
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
200)
}else{
AlertDialog.Builder(this).setMessage("需要提供后台位置权限,请在设置页面选择始终允许")
.setPositiveButton("确定", DialogInterface.OnClickListener { dialog, which ->
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
200)
}).create().show()
}
}
} else {
if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.R){
//申请前台和后台位置权限
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION),
100)
}else{
//申请前台位置权限
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
100)
}
}
在Android10 之前,我们通过ACCESSCOARRSELOCATION 或 ACCESSFINELOCATION(精确位置) 配置即可申请前后台位置权限。
Android 11将位置权限分为前台和后台两种权限。前文说的主要是前台权限,授权方式没有变化。应用想要申请后台权限,除了需要在清单文件中额外添加 ACCESSBACKGROUNDLOCATION 权限外,还需要应用主动引导用户到指定页面授权。
电话号码相关权限展开目录
Android 11 更改了您的应用在读取电话号码时使用的与电话相关的权限。
具体改了什么呢?其实就是两个 API:
- TelecomManager 类中的 getLine1Number () 方法
- TelecomManager 类中的 getMsisdn () 方法
TelephonyManager 类中不受支持的 getMsisdn () 方法。
如果您的应用声明 READ_PHONE_STATE
也就是当用到这两个 API 的时候,原来的 READ_PHONE_STATE
权限不管用了,需要 READ_PHONE_NUMBERS
权限才行。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Environment.isExternalStorageManager();
}
Environment.isExternalStorageManager();
Environment.getExternalStorageDirectory()
- 应用专属存储空间:存储仅供应用使用的文件,可以存储到内部存储卷中的专属目录或外部存储空间中的其他专属目录。使用内部存储空间中的目录保存其他应用不应访问的敏感信息。
您的数据需要占用多少空间?
内部存储空间中用于存储应用专属数据的空间有限。如果您需要保存大量数据,请使用其他类型的存储空间。
getFilesDir()
或 getCacheDir()
方法
创建缓存文件:getCacheDir().当设备的内部存储空间不足时,Android 可能会删除这些缓存文件以回收空间。因此,请在读取前检查缓存文件是否存在。
// 不需要权限
return context.getFilesDir().getPath() + StrUtil.toMD5Hex(videoUrl);
return context.getExternalFilesDir("assets").getAbsolutePath()
getExternalFilesDir()
或 getExternalCacheDir()
方法
内部存贮API |
// 内部私有缓存路径,/data/user/0/com.exam.pkg/cache (6.0之后路径) context.getCacheDir().getPath() // 内部私有存贮路径,/data/user/0/com.exam.pkg/files (6.0之后路径) context.getFilesDir().getPath() |
外部存贮API |
// 外部私有目录路径 // /storage/emulated/0/Android/data/com.exam.pkg/files/Pictures context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getPath() // 外部私有缓存目录路径 // /storage/emulated/0/Android/data/com.exam.pkg/cache context.getExternalCacheDir().getPath() // 外部私有media目录 Context#getExternalMediaDirs() |
Environment |
// 外部存贮根目录 // /storage/emulated/0 Environment.getExternalStorageDirectory().getPath() // 外部存贮公共目录 Environment.getExternalStoragePublicDirectory(type).getPath() |
二、getDataDirectory,getFilesDir,getCacheDir,getDir,getExternalStorageDirectory,getExternalStoragePublicDirectory,getExternalFilesDir,getExternalCacheDir,getExternalCacheDir,getRootDirectory的区别和联系
上面这些方法,我们可能似曾相识,但是对于有些同学来说却又很难分清出,主要还是不同的Android版本的问题。为了方便大家理解,我先简要介绍以上各个方法,为方便大家理解我把这些方法的结果打印出来(以下的打印结果是基于荣耀7的(系统版本6.0):
1、Environment.getDataDirectory() = /data
这个方法是获取内部存储的根路径
2、getFilesDir().getAbsolutePath() = /data/user/0/packname/files
这个方法是获取某个应用在内部存储中的files路径
3、getCacheDir().getAbsolutePath() = /data/user/0/packname/cache
这个方法是获取某个应用在内部存储中的cache路径
4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() = /data/user/0/packname/app_myFile
这个方法是获取某个应用在内部存储中的自定义路径
方法2,3,4的路径中都带有包名,说明他们是属于某个应用
…………………………………………………………………………………………
External存在的都是外部存储,Environment的是根目录下的地址
5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0
这个方法是获取外部存储的根路径
6、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = /storage/emulated/0
这个方法是获取外部存储的根路径
================================================
7、getExternalFilesDir(“”).getAbsolutePath() = /storage/emulated/0/Android/data/packname/files
这个方法是获取某个应用在外部存储中的files路径
8、getExternalCacheDir().getAbsolutePath() = /storage/emulated/0/Android/data/packname/cache
这个方法是获取某个应用在外部存储中的cache路径
从 Android 11 开始,应用无法在外部存储设备上创建自己的应用专用目录。如需访问系统为您的应用提供的目录,请调用 getExternalFilesDirs()
。