Android:检测 SD 卡何时作为磁盘驱动器安装到计算机

标签 android broadcastreceiver android-sdcard

我正在编写一个应用程序,需要检测 SD 卡何时作为磁盘驱动器通过 USB 安装到计算机或何时被手动移除。为此,我尝试使用广播接收器,但没有调用 onReceive。我的代码如下。

IntentFilter filter2 = new IntentFilter();
        //filter2.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        filter2.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
        filter2.addAction(Intent.ACTION_MEDIA_SHARED);
        filter2.addAction(Intent.ACTION_MEDIA_REMOVED);
        filter2.addAction(Intent.ACTION_MEDIA_MOUNTED);

        registerReceiver(new CustomBroadcastReceiver(), filter2);

我的广播接收器如下...

public class CustomBroadcastReceiver extends BroadcastReceiver{

    public CustomBroadcastReceiver(){

    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if(action.equals(Intent.ACTION_MEDIA_UNMOUNTED) || action.equals(Intent.ACTION_MEDIA_SHARED) || action.equals(Intent.ACTION_MEDIA_REMOVED)){
            HardwareManager.IS_MEDIA_MOUNTED = false;
        }else if(action.equals(Intent.ACTION_MEDIA_MOUNTED)){
            HardwareManager.IS_MEDIA_MOUNTED = true;
        }else if(action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)){
            HardwareManager.IN_AIRPLANE_MODE = intent.getBooleanExtra("state", false);
        }
    }

}

当我通过 USB 连接为磁盘驱动器时,onReceive 方法不会触发。

我做错了什么?

最佳答案

您必须添加"file"方案 (addDataScheme("file")),以便 IntentFilter 匹配广播 ACTION_MEDIA_* 操作 Intent 。

ACTION_MEDIA_* Intent 在 Intent.mData 字段中具有到挂载点的路径(参见 Intent docs ),但未设置方案的 IntentFilter 将仅匹配不包含数据的 Intent (参见 IntentFilter docs )。

关于Android:检测 SD 卡何时作为磁盘驱动器安装到计算机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10088802/

相关文章:

android - 如何在 Android 4.4.2(Kitkat) API 级别 19 的外部 SD 卡中创建文件夹

java - Android - 在java中仅获取列中具有值的行

java - 在 Android 中搜索带有另一个属性的 XML 属性

android - 如何在运行时添加操作栏项

android - 使用 AlarmManager 从 BroadcastReceiver 启动服务

android - 检测哪张SIM卡收到信息

android - 安装 SD 卡与手机内存?为什么应用程序的大小不同?

java - 动态填充字符序列中的数据

android - 通话录音/处理服务! - 安卓

Android Studio - 无法解码流(权限被拒绝)