这今天项目中有一个将设备的数据文件复制到U盘的功能,复制完成之后,在设备看U盘的文件都是好的,数据也正常,当拔出U盘后放到电脑上,有时就会出现文件为0B的情况,后来才发现,是U盘没有安全卸载的原因。

初期的设想是控制程序跳转到android的设置的存储界面,让用户进行点击U盘的安全卸载选项,代码如下:

Intent intent = new Intent(Settings.ACTION_MEMORY_CARD_SETTINGS);
startActivity(intent);

很简单粗暴,直接跳转界面。

But,问题来了,系统的界面和当前设备的UI风格不统一。这就是个很让人挠头的问题了,只能自己实现U盘卸载的功能了。

网上查了好多的资料,感觉没有自己想要的功能,无奈之下,给硬件组要了一份当前系统的Setting的源码,请教了一圈,最后确定了存储功能的源码位置:

在这个文件夹下的Memory.java这个文件中,下面来看看U盘卸载功能是如何实现的,直接上源码:

 private void doUnmount() {// Present a toast hereToast.makeText(getActivity(), unmoutUSBorSD.equals("usb")?R.string.custom_usb_unmount_inform_text:R.string.custom_sd_unmount_inform_text, Toast.LENGTH_SHORT).show();IMountService mountService = getMountService();try {sLastClickedMountToggle.setEnabled(false);sLastClickedMountToggle.setTitle(getString(R.string.sd_ejecting_title));sLastClickedMountToggle.setSummary(getString(R.string.sd_ejecting_summary));mountService.unmountVolume(sClickedMountPoint, true, false);} catch (RemoteException e) {// Informative dialog to user that unmount failed.showDialogInner(DLG_ERROR_UNMOUNT);}}

关键点就两句 IMountService mountService = getMountService();和mountService.unmountVolume(sClickedMountPoint, true, false); ,其余的和U盘卸载基本没有关系,下面来看 getMountService()方法:

private synchronized IMountService getMountService() {if (mMountService == null) {IBinder service = ServiceManager.getService("mount");if (service != null) {mMountService = IMountService.Stub.asInterface(service);} else {Log.e(TAG, "Can't get mount service");}}return mMountService;}

只是获取了系统的一个服务,那么unmountVolume(sClickedMountPoint, true, false);中的sClickedMountPoint又是啥呢?

接着找,如下:

final StorageVolume volume = category.getStorageVolume();if (volume != null && category.mountToggleClicked(preference)) {sLastClickedMountToggle = preference;sClickedMountPoint = volume.getPath();String state = mStorageManager.getVolumeState(volume.getPath());if (volume.getPath().contains("usb")){unmoutUSBorSD = "usb";}else{unmoutUSBorSD = "sd";}if (Environment.MEDIA_MOUNTED.equals(state) ||Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {unmount();} else {mount();}return true;}

可以确定是U盘的挂载路径,OK到这里,基本U盘的卸载方法已经明了,如果使用系统的服务或方法的话,采用反射机制是一个不错的方式,过程不在进行说明,增加如下文件

       

文件下载地址: https://download.csdn.net/download/u011685953/10992318

使用方法如下:

//安全卸载U盘public void doUnMountU() {IMountService service = IMountService.Stub.asInterface(ServiceManager.getService("mount"));try {service.unmountVolume(App_DataPara.getApp().GetExternalStorageDirectory(), true, false);} catch (RemoteException e) {e.printStackTrace();}}
App_DataPara.getApp().GetExternalStorageDirectory()为需要卸载的U盘的挂载的文件目录。String类型 

因为踩过坑,所以记录一下,同时分享出来,哪怕对一个人有帮助也行!

Android 安全卸载U盘的方法相关推荐

  1. android usb卸载不了,Android 安全卸载U盘的方法

    这今天项目中有一个将设备的数据文件复制到U盘的功能,复制完成之后,在设备看U盘的文件都是好的,数据也正常,当拔出U盘后放到电脑上,有时就会出现文件为0B的情况,后来才发现,是U盘没有安全卸载的原因. ...

  2. Android studio占用C盘资源的解决方法

    Android studio占用C盘资源的解决方法 Android Studio安装成功后会在系统盘用户目录下产生这几个文件夹 一.目录介绍 1..android 是Android SDK生成的AVD ...

  3. VMware虚拟机挂载/卸载U盘的两种方法

    闲话短述(仅记录个人学习原由): 还是在测试装机U盘时遇到的问题,怎么让虚拟机挂载U盘,并且作为启动盘安装系统. 方法一: 挂载U盘: 将U盘插入电脑,并且识别到插入,打开指定虚拟机,点击编辑虚拟机设 ...

  4. Android盒子看百度云,【沙发管家】智能电视和电视盒子如何使用百度网盘的方法!看你想看的片子!...

    原标题:[沙发管家]智能电视和电视盒子如何使用百度网盘的方法!看你想看的片子! 很多小伙伴把重要的视频资料放到了百度网盘里,想在智能电视或者电视盒子上观看.不过百度网盘没有TV版本很是纠结,不过小伙伴 ...

  5. rufus linux开机密码,使用Rufus 3.4制作Ubuntu 18.04.1 U盘启动盘的方法

    本文介绍使用Rufus 3.4版本来制作Ubuntu 18.04.1 U盘启动盘的方法,一共需要八个步骤即可完成. 简介 Rufus是一个开源免费的快速制作U盘系统启动盘和格式化USB的实用小工具,它 ...

  6. Android PopupWindow 隐藏软键盘的方法

    今天,简单讲讲android里  PopupWindow 弹出在底部,被软键盘遮挡的问题. 之前,自己写一个PopupWindow 弹出在底部,可是如果软键盘显示时弹出,软键盘会遮挡PopupWi ...

  7. 研华电脑510上电自启_研华工控机怎么设置u盘启动_研华工控机U盘引导方法

    描述 本文主要介绍的是研华工控机,首先介绍了研华工控机怎么设置u盘启动,其次阐述了研华工控机U盘引导方法,具体的步骤教程跟随小编一起来了解一下. 研华工控机怎么设置u盘启动 研华IPC-610 工控机 ...

  8. linux php7 yum 卸载,Linux_在Centos中yum安装和卸载软件的使用方法,安装一个软件时 yum -y install h - phpStudy...

    在Centos中yum安装和卸载软件的使用方法 安装一个软件时 yum -y install httpd 安装多个相类似的软件时 yum -y install httpd* 安装多个非类似软件时 yu ...

  9. dos从优盘启动计算机,DOS启动版U盘制作方法(usbboot)

    下载后把USBBOOT程序解压缩出来,再把你的U盘插上,按照下面的步骤就可以把你的U盘制作成DOS启动型的(注意事先备份U盘中有用的数据) ①选中你的U盘: ②点击蓝色的字选择工作模式: ③强烈建议选 ...

最新文章

  1. 入门级Mat (java版)
  2. 科研实习 | 北京大学计算机学院杨智老师组招收系统方向科研实习生
  3. web.xml 中的listener、 filter、servlet 加载顺序
  4. html5 职工入职后台管理系统_ChemCMS是一款基于GO+PHP+MYSQL+HTML5构建的化学内容管理系统
  5. 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)
  6. 95-290-040-源码-内存管理-MemorySegment
  7. 读书:梭罗的《瓦尔登湖》
  8. Mysql之左连接右连接内连接——示例
  9. Shaolin(map||set)
  10. 《幸福来敲门》观后感
  11. 计算机编程考试题库和答案,计算机程序设计员试题及答案
  12. 38 全志平台的script.bin在linux内核里的应用分析
  13. Android 渲染机制——SurfaceFlinger
  14. idea社区版的安装和安装中文插件
  15. 当电脑80端口被占用怎么办
  16. mac m1 office卸载重装(学校官方正版)
  17. PE文件结构图解,比较牵强,仅为学习笔记,高手见笑
  18. 火狐浏览器 如何设置成 打开一个新的页面,原有的页面继续存在
  19. 2022国赛高教杯数学建模A题B题(预测)
  20. beanstalkd 安装 入门

热门文章

  1. DBA Scripts
  2. 我的2019“木桶插曲”——三个月考上研
  3. PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
  4. Windows安装mysql,亲测有效
  5. python-分分钟入门-基础语法
  6. 为什么开直通车后搜索上不来?手淘压制搜索如何解决?
  7. 微信小程序radio单选框如何修改宽高及选中样式
  8. 外行学计算机,《新手无忧学电脑:外行入门学电脑(2008至尊经典版)》低价购书_计算机与互联网_孔网...
  9. eclipse解决js提示
  10. Codeforce Round #764 div3