【第22期】观点:IT 行业加班,到底有没有价值?

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判断是否挂载外置sd卡

最近程序中需要查看sd卡是否挂载,在网上看到有用Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)来判断是否...

无法挂载sd卡(android),不能安装APK(1)

1、应用程序下载的话是默认安装到/mnt/sdcard下的,如果你sd卡没挂载上,系统会提示你request an SD卡或者damage SD卡,所以此时你去这个/mnt/sdcard或者/sdca...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

android ------ SD卡挂载

点击打开链接

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

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

Android 2.3 SD卡挂载流程浅析(六)

http://blog.csdn.net/yihongyuelan/article/details/6980538        前面五篇文章:      《Android 2.3 S...

android SD卡自动挂载

http://www.cnblogs.com/jqyp/archive/2012/01/02/2310077.html SD card porting 一、进程启动和配置文件的分析   vo...

Android SDCard Mount流程分析(一)(二)(三)

Android SDCard Mount流程分析(一) 前段时间对Android 的SDCard unmount 流程进行了几篇简短的分析,由于当时只是纸上谈兵,没有实际上的跟进,可能会有一些误导人...

android Sdcard挂载

http://blog.csdn.net/jiajie961/article/details/6035369

Android 模拟并挂载sd卡

1.创建模拟sd卡(带路径) mksdcard -l mycard 256M card/mycard.img 也可以使用不带路径的 mksdcard 256M mycard.img 大小范围8M...
  • Giegie
  • Giegie
  • 2011-09-27 10:35
  • 2196

和菜鸟一起学android4.0.3源码之SD卡U盘等自动挂载配置

一直以为android sd卡的自动挂载是在vold中实现的,而其配置文件在网上也很容易找到是哪个system/etc/vold.fstab,中,其配置文件就是mount,一般都是如下所示: dev...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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