Android: 检测SD卡何时作为磁盘驱动器挂载到计算机上

11

我正在编写一个应用程序,需要检测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方法不会触发。

我做错了什么?

3个回答

13

为了使IntentFilter与广播ACTION_MEDIA_*动作意图匹配,您需要添加“file”方案(addDataScheme("file"))。

ACTION_MEDIA_*意图在Intent.mData字段中具有挂载点的路径(请参见Intent文档),但是如果没有设置方案的IntentFilter仅匹配不包含数据的意图(请参见IntentFilter文档)。


3

使用Android NDK可以实现这个吗? - Heshan Perera
我不知道。如果我有任何线索,我会通知你的。 - Chromium
我认为监听 ACTION_UMS_CONNECTED 将适用于 API 版本 8,而 android.os.storage.StorageEventListener 则适用于后续版本的 API。 - Heshan Perera
更正,ACTION_UMS_CONNECTED也没有触发。我使用了在https://dev59.com/p2445IYBdhLWcg3w_PAn发布的最终答案,并通过线程定期使用该函数检查SD卡状态。 - Heshan Perera
Heshan,感谢您提供的信息并选择我的答案。 :) 您能在Android 2.2+(2.3、2.3.3、3.x等)上测试Intent.ACTION_UMS_CONNECTED吗? - Chromium
非常乐意 :) 我可以做到...但是现在不行,因为我正在努力满足截止日期。然而,我怀疑这并不会影响,因为API文档明确说明它已被弃用,并且对于2.2版本(API版本8及以上),android.os.storage.StorageEventListener可用。http://developer.android.com/reference/android/content/Intent.html#ACTION_UMS_CONNECTED - Heshan Perera

2

似乎 ACTION_UMS_CONNECTED 不起作用。我需要在 API 版本 8 上工作,因此任何 android.os.storage.StorageEventListener 都不适用。

我使用了这里发布的答案来更新线程中的静态变量。这也可以用于执行自定义广播。方法如下... *注意:HardwareManager 是用户定义的类。

private static class SDCardMountStatusMonitor implements Runnable{

    public void run() {
        // TODO Auto-generated method stub
        while(true){
            try {
                HardwareManager.IS_MEDIA_MOUNTED = sdIsCardMounted(); //YOU CAN BROADCAST SOMETHING FROM HERE INSTEAD
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

public static boolean sdIsCardMounted() {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            return true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return false;
        } else {
            return false;
        }
}

然后在另一个地方,我从这个Runnable中创建一个线程并启动它。

Thread t = new Thread(new SDCardMountStatusMonitor());
t.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接