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 的外部存储的挂载的理解

我们大多数情况下操纵的是外部存储,而外部存储都是通过挂载来让系统对外部存储进行链接的,下面一小队就是对挂在的理解 /sdcard : /mnt/sdcard的符号链,是一个软链接(就是快捷方式)...

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

1 总体介绍   在Android 中,当SD卡插入系统之后,系统会自动挂载。Vold 就是负责挂载SD卡的,vold 的全称是volume daemon。实际上是负责完成系统的CDROM,...
  • sdkdlwk
  • sdkdlwk
  • 2017年07月25日 09:35
  • 529

Android-vold源码分析之挂载SD卡(8)

这里续上一篇文章,讲解挂载磁盘的操作: 3.挂载磁盘。这里都有一个const char *类型的参数,这参数保存着每个磁盘的标签信息,比如sd卡的label是sdcard。 int Volum...
  • gzshun
  • gzshun
  • 2011年12月30日 20:15
  • 12387

Android判断是否挂载外置sd卡

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

android5.0与6.0 sd卡挂载

Adb remount Adb shell Cd system/etc Cat vold.fstab Cd dev/block ls android 5.1 vold.fstab 显示为 ...

Android-->检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播

直接上重点:1:获取内置SD卡的路径, 但是判断是否有效(是否挂载), 需要用到下面检测挂载点的方法 /** * 获取内置SD卡路径 * * @return ...
  • angcyo
  • angcyo
  • 2015年05月29日 11:39
  • 3988

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android-vold源码分析之挂载SD卡(8)

这里续上一篇文章,讲解挂载磁盘的操作: 3.挂载磁盘。这里都有一个const char *类型的参数,这参数保存着每个磁盘的标签信息,比如sd卡的label是sdcard。 int Volum...
  • gzshun
  • gzshun
  • 2011年12月30日 20:15
  • 12387

Android音视频处理之MediaMuxer(MP4)

http://www.jianshu.com/p/aeadf260258a 在Android中,可以使用MediaMuxer来封装编码后的视频流和音频流到mp4容器中: ...
  • STN_LCD
  • STN_LCD
  • 2017年05月22日 13:56
  • 1185

android监听sd卡挂载状态,onReceive无法被调用问题

MyExternalStorageReceiver package com.rishiqing.receiver; import android.app.AlertDialog; import an...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android SD卡挂载状态
举报原因:
原因补充:

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