钱柜娱乐开户 获取外接储存的设备路径(如挂载的U盘)

2017年06月26日 20:05:50

前提介绍:项目中遇到这样一种情况,需要在开机和插入U盘的时候去获取U盘的路径,并读取U盘中的一个文件。其中插入U盘的时候,直接监听U盘挂载广播,可以获取U盘的路径,例如说路径A。但是开机的时候去需要找到U盘的路径,网上看了很多的例子,都不一样,获取的结果和上面的结果A都不一致,最后发现通过Linux可以获取挂载路径。
<转载请注明出处/Zou_pl/article/details/73743974>

  1. 插入U盘时获取U盘路径
  2. 开机时获取U盘路径

    首先是静态注册一个关于开机和挂载U盘的广播:

<receiver 钱柜娱乐开户:name=".receivers.USBReceiver">
            <intent-filter>
                <action 钱柜娱乐开户:name="钱柜娱乐开户.intent.action.BOOT_COMPLETED"/>
                <action 钱柜娱乐开户:name="钱柜娱乐开户.intent.action.MEDIA_REMOVED"/>
                <action 钱柜娱乐开户:name="钱柜娱乐开户.intent.action.MEDIA_MOUNTED"/>
                <action 钱柜娱乐开户:name="钱柜娱乐开户.intent.action.MEDIA_REMOVED"/>
                <action 钱柜娱乐开户:name="钱柜娱乐开户.intent.action.MEDIA_REMOVED"/>
                <data 钱柜娱乐开户:scheme="file"></data>
            </intent-filter>
        </receiver>

BOOT_COMPLETED:开机完成,而MEDIA_MOUNTED、MEDIA_REMOVED、MEDIA_REMOVED、MEDIA_REMOVED则是来获取U盘挂载、拔出等事件。
然后在广播接收者中依次处理这些事件:如下

public class USBReceiver extends BroadcastReceiver{

    private static final String TAG = USBReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(action.equals(Intent.ACTION_MEDIA_MOUNTED)){
            String mountPath = intent.getData().getPath();
            Log.d(TAG,"mountPath = "+mountPath);
            if (!TextUtils.isEmpty(mountPath)) {
                //读取到U盘路径再做其他业务逻辑
            }
        } else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED) || action.equals(Intent.ACTION_MEDIA_EJECT)) {
            Toast.makeText(context, "No services information detected !", Toast.LENGTH_SHORT).show();
        } else if (action.equals("钱柜娱乐开户.intent.action.BOOT_COMPLETED")) {
            //如果是开机完成,则需要调用另外的方法获取U盘的路径
        }
    }
}
先看一下通过intent.getData().getPath()获取的路径是什么:

这里写图片描述
可以看到打印的结果是:/mnt/sda/sda1

那么如果没有广播信息该如何获取对应的路径呢:利用Linux mount 命令。钱柜娱乐开户也就是一种Linux系统,采用的是linux的内核。而linux中挂载存储设备使用的是 mount 命令来挂载设备到文件系统中。具体如下面代码:

public static List<String> getAllExternalSdcardPath() {
        List<String> PathList = new ArrayList<String>();

        String firstPath = Environment.getExternalStorageDirectory().getPath();
        Log.d(TAG,"getAllExternalSdcardPath , firstPath = "+firstPath);

        try {
        // 运行mount命令,获取命令的输出,得到系统中挂载的所有目录
            Runtime runtime = Runtime.getRuntime();
            Process proc = runtime.exec("mount");
            InputStream is = proc.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            String line;
            BufferedReader br = new BufferedReader(isr);
            while ((line = br.readLine()) != null) {
                // 将常见的linux分区过滤掉
                if (line.contains("proc") || line.contains("tmpfs") || line.contains("media") || line.contains("asec") || line.contains("secure") || line.contains("system") || line.contains("cache")
                        || line.contains("sys") || line.contains("data") || line.contains("shell") || line.contains("root") || line.contains("acct") || line.contains("misc") || line.contains("obb")) {
                    continue;
                }

                // 下面这些分区是我们需要的
                if (line.contains("fat") || line.contains("fuse") || (line.contains("ntfs"))){
                    // 将mount命令获取的列表分割,items[0]为设备名,items[1]为挂载路径
                    String items[] = line.split(" ");
                    if (items != null && items.length > 1){
                        String path = items[1].toLowerCase(Locale.getDefault());
                        // 添加一些判断,确保是sd卡,如果是otg等挂载方式,可以具体分析并添加判断条件
                        if (path != null && !PathList.contains(path) && path.contains("sd"))
                            PathList.add(items[1]);
                    }
                }
            }
        } catch (Exception e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (!PathList.contains(firstPath)) {
            PathList.add(firstPath);
        }

        return PathList;
    }

上面是获取的具体方法:看一下打印
这里写图片描述

而上面方法中Environment.getExternalStorageDirectory().getPath()得到的结果是/mnt/shell/emulated。所以去掉这个路径就是我们想要的从插拔U盘广播的广播信息中获取的U盘路径信息一致。

安卓获取外置U盘路径

之前做的是一个读取手机外置存储U盘里的内容,要求插入U盘就读取内容,插入U盘有广播,后来一直被外置U盘的路径获取困住了,找资料找了很久都没找到。。。最后解决的时候发现很简单。。。就一行代码解决问题。 ...
  • yangqi1244
  • yangqi1244
  • 2016年06月01日 12:18
  • 4613

安卓-获取U盘的路径

filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_EJECT); filter.add...
  • wuqingyidongren
  • wuqingyidongren
  • 2016年03月29日 17:13
  • 3446

外部U盘插入钱柜娱乐开户系统后获取外部U盘的路径

使用系统广播获取U盘的路径:   在钱柜娱乐开户Manifest.xml中注册一个用于接收U盘挂载的广播                                        ...
  • mantoutagege
  • mantoutagege
  • 2016年08月24日 13:32
  • 459

钱柜娱乐开户 6.0上sdcard和U盘路径获取和区分

钱柜娱乐开户6.0上会根据卡的种类和卡的挂载状态来动态生成挂载路径,所以之前写固定路径的办法不可用,最后通过网上查找和分析钱柜娱乐开户源码,通过反射获取到路径,并且进行了正确区分,代码如下: /...
  • xuan521521
  • xuan521521
  • 2017年04月26日 13:58
  • 1726

钱柜娱乐开户开发——遍历读写U盘、SD卡等外部存储

1.首先需要得到挂载在手机上的有哪些盘符 这里需要用到一个被系统隐藏的方法,即StorageManager下的getVolumePaths()方法。具体通过反射得到。方法返回值为字符串数组,在我的真...
  • SEU_Calvin
  • SEU_Calvin
  • 2016年07月15日 10:26
  • 17017

钱柜娱乐开户开发-动态获取电视盒子U盘的插拔状态和路径

最近公司的盒子端扩展一个新功能:插入U盘后自动幻灯片播放U盘指定文件夹下的所有图片,拔出U盘后恢复视频播放。直接上代码:一、注册广播监听U盘的插拔1.1、注册 IntentFilter intentF...
  • luuzhu
  • luuzhu
  • 2016年11月15日 16:33
  • 1951

钱柜娱乐开户6.0 外部存储设备插拔广播以及获取路径(U盘)

这里我将U盘作为例子来说明解析。钱柜娱乐开户4.1版本时U盘插拔时的广播在钱柜娱乐开户4.1时我们可以用以下的BroadcastReceiver接收U盘广播。 ...
  • zhouchengxi
  • zhouchengxi
  • 2017年01月02日 21:09
  • 1602

钱柜娱乐开户获取扩展存储路径,TF卡、U盘等

/** * 获取扩展存储路径,TF卡、U盘 * 2014-5-21 * lifusheng * @return */ public static String getExter...
  • zhongshansubor
  • zhongshansubor
  • 2014年06月24日 15:53
  • 6411

钱柜娱乐开户 N获取外置SD卡或挂载U盘路径

在钱柜娱乐开户 N上并没有提供直接的方法获取外置SD卡或挂载U盘路径,可以通过下面方法获取内置sd卡路径 Environment.getExternalStorageDirectory().get...
  • yin1031468524
  • yin1031468524
  • 2017年10月21日 16:25
  • 358

钱柜娱乐开户获取内置、外置以及OTG等方式挂载的存储设备路径

众所周知,谷歌提供给了我们获取钱柜娱乐开户内置存储卡的绝对路径的方法,但是如果要获取外置的存储的路径的话,谷歌就没有提供了。我们需要自己去写方法来获取这些路径,比如外置的tf卡,OTG挂载的U盘等。...
  • luckytzq
  • luckytzq
  • 2015年07月10日 11:50
  • 7138
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:钱柜娱乐开户 获取外接储存的设备路径(如挂载的U盘)
举报原因:
原因补充:

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