Android SD卡挂载状态

原创 2016年08月29日 22:00:31

一、           Sd卡挂载主要ACTION

ACTION_MEDIA_BAD_REMOVAL

sd卡已经从sd卡插槽拔出,但是挂载点还没解除

ACTION_MEDIA_BUTTON

“媒体”按钮被按下

ACTION_MEDIA_CHECKING

存在外部媒体,磁盘检查挂载点的路径中包含的检查媒体意图

ACTION_MEDIA_EJECT

用户移除外部存储媒体

ACTION_MEDIA_MOUNTED

Sd卡被插入,且已经挂载

ACTION_MEDIA_NOFS

外部媒体存在,而是使用一个不兼容的fs(或者是空白)挂载点的路径中包含的检查媒体意图

ACTION_MEDIA_REMOVED

Sd卡被移除

ACTION_MEDIA_SCANNER_FINISHED

扫描完成

ACTION_MEDIA_SCANNER_STARTED

开始扫描

ACTION_MEDIA_SCANNER_SCAN_FILE

请求媒体扫描仪扫描一个文件,并将它添加到媒体数据库

ACTION_MEDIA_SHARED

Sd卡作为USB大容量存储被共享,挂载被解除

ACTION_MEDIA_UNMOUNTABLE

 

ACTION_MEDIA_UNMOUNTED

Sd卡存在,但还没有挂载


一、           热插拔sd卡

1.       直接拔掉sdcard

BroadcastReceiver.android.intent.action.MEDIA_UNMOUNTED

BroadcastReceiver.android.intent.action.MEDIA_BAD_REMOVAL

BroadcastReceiver.android.intent.action.MEDIA_EJECT

BroadcastReceiver.android.intent.action.MEDIA_SCANNER_STARTED

BroadcastReceiver.android.intent.action.MEDIA_SCANNER_FINISHED

2.       再次插入sd卡

BroadcastReceiver.android.intent.action.MEDIA_CHECKING

BroadcastReceiver.android.intent.action.MEDIA_MOUNTED

BroadcastReceiver.android.intent.action.MEDIA_SCANNER_STARTED

BroadcastReceiver.android.intent.action.MEDIA_SCANNER_FINISHED

3.       在通知栏卸载sdcard

BroadcastReceiver.android.intent.action.MEDIA_EJECT

BroadcastReceiver.android.intent.action.MEDIA_UNMOUNTED

注意:接收到 ACTION_MEDIA_EJECT 广播之后,sd 卡还是可以读写的,

直到接收到 ACTION_MEDIA_REMOVEDACTION_MEDIA_UNMOUNTED等广播之后,sd 卡才不可以读写。

二、           Sd卡示例

1.       获取sd卡路径

public static String getSDPath(Context context) {

        String sd = null;      

        StorageManager storageManager = (StorageManager) context

                .getSystemService(Context.STORAGE_SERVICE);

        StorageVolume[] volumes = storageManager.getVolumeList();

        for (int i = 0; i < volumes.length; i++) {

            if (volumes[i].isRemovable()&& volumes[i].allowMassStorage()

                    && volumes[i].getDescription(context).contains("SD")) {

                sd = volumes[i].getPath();

            }

        }

        return sd;

 }

2. 编写广播接收器

public void registerReceivers(){

    if(mReceiver == null){

         mReceiver = new BroadcastReceiver() {              

                @Override

                public void onReceive(Context context, Intent intent) {

                    // TODO Auto-generated method stub

                    Log.i("usb", "BroadcastReceiver."+ intent.getAction());

                   

                    String action = intent.getAction();

                    if(action.equals("android.intent.action.MEDIA_CHECKING")){                 

                        Toast.makeText(context, "sdcard MEDIA_CHECKING",0).show();

                        //updateListMounted();01-01 09:20:41.663: I/usb(14544):path:/storage/emulated/0

                        /*String path = getSDPath(context);

                        Log.i("liting","path = " + path);

                        MediaScannerConnection.scanFile(context,

                                newString[]{path + "/DICM"},

                                null,null);

                        updateListMounted();*/

                        ad.start();

                        loading_layout.setVisibility(View.VISIBLE);

                        list_layout.setVisibility(View.INVISIBLE);

                        loading_text.setVisibility(View.VISIBLE);

                    }else if(action.equals("android.intent.action.MEDIA_SCANNER_FINISHED")){

                        Toast.makeText(context, "sdcard MEDIA_SCANNER_FINISHED", 0).show();

                        if(ad.isRunning()){

                            ad.stop();

                            loading_layout.setVisibility(View.INVISIBLE);

                            list_layout.setVisibility(View.VISIBLE);

                            loading_text.setVisibility(View.INVISIBLE);

                        }

                    }else if(action.equals("android.intent.action.ACTION_MEDIA_UNMOUNTED")){

                        Toast.makeText(context, "sdcard ACTION_MEDIA_UNMOUNTED", 0).show();

                        if(ad.isRunning()){

                            ad.stop();

                            loading_layout.setVisibility(View.INVISIBLE);

                        }

                    }

                }

         };

         final IntentFilter filter = new IntentFilter();

         filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);

         filter.addAction(Intent.ACTION_MEDIA_BUTTON);

         filter.addAction(Intent.ACTION_MEDIA_CHECKING);

         filter.addAction(Intent.ACTION_MEDIA_EJECT);

         filter.addAction(Intent.ACTION_MEDIA_MOUNTED);

         filter.addAction(Intent.ACTION_MEDIA_NOFS);

         filter.addAction(Intent.ACTION_MEDIA_REMOVED);

         filter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);

         filter.addAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

         filter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);

         filter.addAction(Intent.ACTION_MEDIA_UNMOUNTABLE);

         filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);

         filter.addAction(Intent.ACTION_MEDIA_SHARED);

        

         filter.addDataScheme("file");

         registerReceiver(mReceiver, filter);

    }

 }

3. 注册/取消注册广播监听器

四、     媒体数据库刷新

1. 手动扫描刷新

当android的系统启动的时候,系统会自动扫描sdcard内的文件,并把获得的媒体文件信息保存在一个系统媒体数据库中,程序想要访问多媒体文件,就可以直接访问媒体数据库中即可,而用直接去sdcard中取。但是,如果系统在不重新启动情况下,媒体数据库信息是不会更新的,这里举个例子,当应用程序保存一张图片到本地后(已成功),但打开系统图片库查看时候,你会发现图片库内并没有你刚刚保存的那张图片,原因就在于系统媒体库没有及时更新,这时就需要手动刷新文件系统了。

2. 自动刷新

在后视镜的视频回放中,热插拔sd卡,当插上sd卡时,sd卡会扫描好久的数据库。通过log分析,在MEDIA_SCANNER_STARTED到MEDIA_SCANNER_FINISHED之间花费了太久的时间。如此提高系统扫描的速度呢?

\packages\providers\MediaProvider\src\com\android\providers\media\MediaScannerService.java

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND+

               Process.THRE

AD_PRIORITY_LESS_FAVORABLE);将值降低


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android下开机启动后U盘经常不能自动挂载

======================

Android-vold源码分析之卸载SD卡(9)

作者:gzshun. 原创作品,转载请标明出处! 来源:http://blog.csdn.net/gzshun 本文分析卸载sd卡的源码,这些涉及的内容比较少,走过就行。在Android系统,...
  • gzshun
  • gzshun
  • 2011-12-31 21:20
  • 11157

android 5.0挂载子系统

[plain] view plain copy print? logcat -s Vold MountService DirectVolume   logcat ...

【Android】卸载SD卡上应用导致重启的问题分析

问题描述 在L版本上安装一个apk 移动到sd卡上 升级系统到M版本 打开应用(必要操作) 卸载 就出现了重启   系统被杀掉了 自己写一个ap,也会出现这个问题     在应用信息中进行move操...
  • aaajj
  • aaajj
  • 2017-08-30 20:33
  • 130

Android5.0挂载NTFS为只读问题

一、问题描述 二、问题原因 三、问题解决

android vold初始化及sd卡挂载流程

1 总体介绍   在Android 中,当SD卡插入系统之后,系统会自动挂载。Vold 就是负责挂载SD卡的,vold 的全称是volume daemon。实际上是负责完成系统的CDROM,...

android MountService实现------外设挂载及状态监听

事件起因:         我们的测试报出一个问题,插着U盘开机(我们的机顶盒),多媒体文件未扫描到(U盘里有视频文件还有音乐文件)。说本地的视频文件列表还有音乐列表也是空的。 我是做应用的,兼顾Fr...

android 判断手机中是否有SD卡,USB。静态判断

public static String getSDPath(Context context) { String sd = null; StorageManager s...

android 6.0检查设备是否挂载SD卡,USB设备

做了一个智能电视的项目, 里面需要文件管理器 , 去下载了一些相关的 ,达不到老板的需求 ,那就没办法了,只能自己撸一个了 , 也碰到许多坑 。 关于挂载SD卡的,就是一个 ,android6.0以下...

Android判断是否挂载外置sd卡

最近程序中需要查看sd卡是否挂载,在网上看到有用Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)来判断是否...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)