SD卡的启用和禁止 硬件设备的监控处理之四——SD卡的禁用和启用

安卓系统手机有一套自己的存储管理制度:几乎任何类型的存储设备都被称为“外部存储”(external storage),包括内部的NAND闪存,这个叫做“主要存储”(primary storage),而其他的一切都是“次要存储”(secondary storage),比如SD卡。
随着安卓系统的不断升级,第三方应用对存储的访问权限控制经过了多次调整,详细三说起来就复杂了,这里重点说最早、最常用的写入要求权限“WRITE_EXTERNAL_STORAGE”,它可以让应用写入主要存储(内置闪存),但不能写入次要存储(SD卡)。






在Android 4.0之前,Android设备都是单存储,第三方app写文件,必须申请WRITE_EXTERNAL_STORAGE权限


在4.0之后,Android设备开始有了内置闪存,即primary storage,并且可以外置SD卡,即secondary external storage device,必须申请WRITE_EXTERNAL_STORAGE权限,
该权限也仅仅用于授权用户写primary external storage,即系统默认的sd卡sdcard0。
而且创建的文件会在应用的根目录即Android/data/包名/文件夹   下随意访问,其它任何地方都不允许写。
当应用被卸载的时候也会随之被清除。
通过Context.getExternalFilesDir()方法可以获取到 SDCard/SDCard/Android/data/{package_name}/files/ ,储存一些长时间保存的数据;


通过Context.getExternalCacheDir()方法可以获取到 SDCard/SDCard/Android/data/{package_name}/cache/,储存临时缓存数据;


这两个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项。




WRITE_MEDIA_STORAGE权限来控制secondary external storage device的操作。


到了Android 4.4 KitKat,WRITE_MEDIA_STORAGE权限仅提供给系统应用,不再授予第三方APP.


幸运的是在Android 5.0及其之后,有一个官网操作外部存储SD卡的方法,通过弹出一个对话框,并且让用户授权,可以进行操作

选择    ----> SELECT "SD card"





Google做了这个限制后解决了这个问题:


随便一个App,都会在/sdcard、/sdcard1 上建一个目录,删了也会重新建,即使被卸载,也会留下一些垃圾文件。


但是,也产生了一个问题:


类似于视频、图像处理这种想在外部存储缓存大量音视频文件,并且App被卸载后还想保留的,就没办法了。




硬件设备的监控处理之四——SD卡的禁用和启用


思路:与USB设备的禁用启用类似,只是关系的注册表路径不一样,原理是完全一样的 禁用: SD卡是存储设备,如果存储设备被打开其它人就没办法使用即可实现禁用效果,并且将"System//StorageManager//Profiles//SDMemory";中写入键项 MountHidden= 1,dismount掉SD卡 启用: 将"System//StorageManager//Profiles//SDMemory";中写入键项 MountHidden= 0,mountSD卡 重新插入SD卡即可启用







原文地址:

https://my.oschina.net/liucundong/blog/314520

https://plus.google.com/+TodLiebeck/posts/gjnmuaDM8snhttp://blog.csdn.net/olevin/article/details/29575127 http://source.android.com/devices/tech/storage/index.html

https://blog.csdn.net/huaerge/article/details/6454244

https://www.2cto.com/kf/201608/539094.html

https://metactrl.com/docs/sdcard-on-lollipop/



root手机后修改文件platform.xml

https://technofaq.org/posts/2014/04/fixing-external-sd-card-write-issue-on-android-kitkat/


获取手机内存和内置、外置sdcard的大小

https://blog.csdn.net/qq_28261343/article/details/51176110


StorageManager和MountService之间的关系

https://www.2cto.com/kf/201310/253644.html



获取Android的所有存储设备

https://blog.csdn.net/wangsf1112/article/details/51427007


内部存储和外部存储的理解

https://www.cnblogs.com/wzxwhd/p/5966737.html


Android 8.0写入sdcard(指定授权特定的文件夹)

https://www.2cto.com/kf/201802/720060.html


Android 4.4第三方应用无法写外置存储卡,但是内置文件管理器可以

https://www.zhihu.com/question/24639739/answer/131250190



Environment.getExternalStorageState()与getExternalFileDir()的区别

https://www.journaldev.com/9400/android-external-storage-read-write-save-file

https://www.cnblogs.com/dazhao/p/6547811.html

https://www.jianshu.com/p/a0870499d736



没有外部存储时如何操作,应用正常开发时的路径

https://blog.csdn.net/losefrank/article/details/53464646




2、几个概念或者需要注意的地方

①所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。

外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。

如果你的api 版本低于8,那么不能使用getExternalStoragePublicDirectory(),而是使用Environment.getExternalStorageDirectory(),他不带参数,也就不能自己创建一个目录,只是返回外部存储的根路径。

创建应用私有文件的方法是 Context.getExternalFilesDir()

所有应用程序的外部存储的私有文件都放在根目录的Android/data/下,目录形式为/Android/data/<package_name>/

如果你的api 版本低于8,那么不能使用getExternalFilesDir(),而是使用Environment.getExternalStorageDirectory()获得根路径之后,自己再想办法操作/Android/data/<package_name>/下的文件。

④将文件保存在外部存储中

由于外部存储可能不可用—比如,当用户已将存储装载到电脑或已移除提供外部存储的 SD 卡时—因此,在访问它之前,您应始终确认其容量。 您可以通过调用 getExternalStorageState() 查询外部存储状态。 如果返回的状态为 MEDIA_MOUNTED,那么您可以对您的文件进行读写。

⑤由于用户把外部存储作为了一个USB存储进行了挂载进而不可用,所以使用之前需要检查一下是否可用并且不是只读

⑥Environment.getExternalStorageState():得到的是内部存储sd卡的路径如:/mnt/sdcard

getExternalFileDir()返回的是内部存储sd卡中本应用的根目录文件的路径如:/Android/data/data/application_package/

getExternalFileDir()

getExternalFilesDir()
It returns the path to files folder inside Android/data/data/your_package/ on your SD card. It is used to store any required files for your app (e.g. images downloaded from web or cache files). Once the app is uninstalled, any data stored in this folder is gone too.
获取应用程序下的存储目录,/data/data/your_package/,随着应用的卸载存储的文件被删除


getExternalStorageDirectory()
It returns the root path to your SD card (e.g mnt/sdcard/). If you save data on this path and uninstall the app, that data won't be lost.
获取sd卡根目录,跟应用的是否卸载无关。


<cache-path>,表示应用默认缓存根目录,对应根目录等价于getCacheDir(),查看完整路径:/data/user/0/cn.teachcourse.demos/cache


<external-path>,表示外部内存卡根目录,对应根目录等价于
Environment.getExternalStorageDirectory(),
查看完整路径:/storage/emulated/0


<external-files-path>,表示外部内存卡根目录下的APP公共目录,对应根目录等价于
Context#getExternalFilesDir(String) Context.getExternalFilesDir(null),
查看完整路径:
/storage/emulated/0/Android/data/cn.teachcourse.demos/files/Download


<external-cache-path>,表示外部内存卡根目录下的APP缓存目录,对应根目录等价于Context.getExternalCacheDir(),查看完整路径:
/storage/emulated/0/Android/data/cn.teachcourse.demos/cache


 
 
context.getFilesDir()得到的是内置存储卡的路径如:/data/user/0/com.example.applications/files/
context.getExternalFilesDir()得到的是外置存储卡的路径如:/storage/emulated/0/Android/data/com.example.applications/files/myinfos
context.getExternalStorageDirectory()得到的是外置存储卡的根路径,应用删除后内容不会一起被删除

 
 


猜你喜欢

转载自blog.csdn.net/nicolelili1/article/details/79925330