路径-各位android的高手,请问怎么得到,判断一台机器上usb盘的目录是什么

问题描述

各位android的高手,请问怎么得到,判断一台机器上usb盘的目录是什么

各位android的高手,请问怎么得到,判断一台机器上usb盘的目录是什么
或者怎么判断一个路径是不是usb盘的

一个实例如下(我现在的一个android设备现状):
1,有内部存储器sdcard,具体路径:/mnt/sdcard
2,有tf卡,具体路径:/mnt/ext_sd
3,有u盘,具体路径:/mnt/usbhost1
我可以得到/mnt/usbhost1,并且确定其是u盘的路径

但是其他设备不一定会和我这个设备相同,
比如有的设备u盘路径可能是/mnt/sda1,tf卡设备路径可能是/mnt/tfcard

我想知道有没有方法可以获取到/mnt/sda1,并且确定其是u盘的路径而不是tf卡路径

我现在是通过以下方法判断的

String devicePath = intent.getDataString().toLowerCase().substring(7);
if (devicePath.contains("usb"))
{
   //这个是u盘
}

但是这并不准确,如上面的/mnt/sda1

解决方案

public static String getExtSDCard(){
    File[] files=new File("/mnt").listFiles();
    String sdcard=Environment.getExternalStorageDirectory().getAbsolutePath();
    String file;
    for (int i = 0; i < files.length; i++) {
        file=files[i].getAbsolutePath();
        if(!file.equalsIgnoreCase(sdcard)&&file.contains("ext")){
            return file;
        }

    }
    return null;
}

你可以这么做 根据经验所有sdcard都在mnt下面 首先获取默认sdcard的路径 然后遍历mnt下面的所有设备 如果出了默认sdcard之外还有别的设备名字包含"ext"字符的 则返回该设备名字(极大可能是扩展sdcard)

解决方案二:

各个厂商不一样,设备节点命名的方式不一样,挂载的路径也不一样
可以通过mount命令来分析

解决方案三:

之前做过一个项目有个需求是将外接存储设备细分:USB连接和TF卡等存储卡两类。当时网上找的资料都是要判断外接存储设备的状态只能监听android.intent.action.MEDIA_MOUNTED等一系列的action;但系统只提供一个监听,怎么办?你无法判断监听到的是哪一类存储设备。经过思考发现两类存储在系统的路径是不同的可以根据路径是否存在来进一步区分使用的是哪一类存储。

代码如下,希望对你能有点参考:

private final BroadcastReceiver broadcastRec = new BroadcastReceiver(){
?????public void onReceive(Context context, Intent intent){
???? ?if(intent.getAction().equals("android.intent.action.MEDIA_MOUNTED"))
???? ?{??
???? ???File file=new File("/sdcard/card/");
???? ???File file2=new File("/usb/");
???? ? if (file.exists() && !isSdcard) { //判断SD卡 插入
???? ???isSdcard=true;
???? ?? ? Log.d("explorer", "SDcard is useful!");
???? ?? ? Toast.makeText(context, R.string.SDCardin, Toast.LENGTH_LONG).show();
???? ?? ? btn_sdcard.setEnabled(true);
???? ?? ? ?
???? ?? ???String strPath="/sdcard/card/";
???? ?? ????
???? ?? ???path_list.AddPathToList(strPath);
???? ?? ???updateFileList();
???? ?? ? }
???? ? else if(file2.exists() && !isUsb) {??//判断usb 接入
???? ?? ? //
???? ?? ???isUsb=true;
???? ?? ???Log.d("explorer", "USB is useful!");
???? ?? ???Toast.makeText(context, R.string.USBin, Toast.LENGTH_LONG).show();
???? ?? ???btn_usb.setEnabled(true);
???? ?? ????
???? ?? ???String strPath="/usb/";
???? ?? ????
???? ?? ?? ?path_list.AddPathToList(strPath);//显示当前路径为usb
???? ?? ?? ?updateFileList();//更新文件显示列表
???? ?? ? }
???? ? ?
???? ? ?
???? ?}else if(intent.getAction().equals("android.intent.action.MEDIA_REMOVED")
???? ???||intent.getAction().equals("android.intent.action.MEDIA_UNMOUNTED")
???? ???||intent.getAction().equals("android.intent.action.MEDIA_BAD_REMOVAL")){
???? ?? ?? ????
???? ? File file=new File("/sdcard/card/");
???? ? File file2=new File("/usb/");
???? ? if (!file.exists() && isSdcard) {? ?
???? ?? ? Log.d("explorer", "SDcard is not useful!");
???? ?? ? Toast.makeText(context, R.string.SDCardout, Toast.LENGTH_LONG).show();
???? ?? ? isSdcard=false;
???? ?? ? btn_sdcard.setEnabled(false);
???? ?? ???if(path_list.GetCurPath().startsWith("/sdcard/")){
???? ?? ?select_list.ClearList();
???? ?? ?path_list.AddPathToList("/");
???? ???}
???? ?? ????
???? ?? ? }
???? ?? ?? ????
???? ? else if(!file2.exists() && isUsb){? ?
???? ?? ????
???? ???isUsb=false;
???? ?? ???Log.d("explorer", "USB is not useful!");
???? ?? ???Toast.makeText(context, R.string.USBout, Toast.LENGTH_LONG).show();
???? ?? ???btn_usb.setEnabled(false);
???? ?? ????
???? ?? ???if(path_list.GetCurPath().startsWith("/usb/")){
???? ?? ?select_list.ClearList();
???? ?? ?path_list.AddPathToList("/");
???? ???}
???? ?? ? }
???? ? ?
???? ? updateFileList();
???? ?}
?????}
??? };

以上是广播接收外接存储插拔状态的。还有就是程序启动时判断usb和sdcard是否存在的:

private void initList(){
??????
???? ?File file=new File("/sdcard/card/");
???? ?? ?if (file.exists()) {? ?
???? ?? ? Log.d("explorer", "SDcard is useful!");
???? ?? ? isSdcard=true;
???? ?? ? btn_sdcard.setEnabled(true);? ?? ?? ???
???? ?? ? }else {? ?
???? ?? ? // 当前不可用
???? ?? ???isSdcard=false;
???? ?? ???Log.d("explorer", "SDcard is no use!");
???? ?? ???btn_sdcard.setEnabled(false);
???? ?? ? }
???? ?? ?String strPath="/";
???? ?? ?File file2=new File("/usb/");
???? ?? ?if (file2.exists()) {
???? ?? ? ?
???? ?? ? isUsb=true;
???? ?? ? btn_usb.setEnabled(true);
???? ?? ???if (isSdcard) {
???? ?? ?? ???strPath="/sdcard/card/";? ?? ?? ?? ?? ?? ?? ?
?????}else {
???? ? strPath="/usb/";? ?? ?? ?? ?? ?
?????}
???? ?? ? ?
???}else {
??? isUsb=false;
??? btn_usb.setEnabled(false);
?????if (isSdcard) {
???? ? strPath="/sdcard/card/";? ?? ?? ?
???? ?? ?? ?? ??
?????}else {
???? ? strPath="/";? ?? ???
?????}
???}
???? ?? ?path_list.AddPathToList(strPath);
???? ?? ?updateFileList();
??? }

如果你是想同时识别多个存储设备,我提供个思路,没有试验过:
在android广播插入存储设备时,它的intent中有data,用方法getDataString()获取其中数据你会发现那里面是这个设备的路径,你根据自己的需要截取路径,并根据这个来识别不同的存储设备。
String path=intent.getDataString();
path=path.substring(11)+"/";//path=file:///mnt/sdcard/external_sdcard

解决方案四:

Environment.getExternalStoragePublicDirectory()
Context.getExternalFilesDir()

解决方案五:

public static String getExtSDCard(){
    File[] files=new File("/mnt").listFiles();
    String sdcard=Environment.getExternalStorageDirectory().getAbsolutePath().toLowerCase();
    String file;
    for (int i = 0; i < files.length; i++) {
        file=files[i].getAbsolutePath().toLowerCase();
        if(!file.equals(sdcard)&&(file.contains("ext")||file.contains("sdcard"))){
            return file;
        }
    }
    return null;
}

改进一下

解决方案六:

你也可以遍历mnt路径下面的所有设备 使用

StatFs statFs=new StatFs(path);

来读取大小信息 大的自然就是存储卡了 然后再根据名字来排除内部sdcard即可获得外部存储卡路径

解决方案七:

以通过shell命令来查看 mount 相关信息,从而判断出已挂载的设备路径。
比如

root@android:/ # mount
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/mmcblk0p12 /system ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/mmcblk0p13 /data ext4 rw,nosuid,nodev,relatime,user_xattr,barrier=1,data=ordered,noauto_da_alloc 0 0
/dev/block/mmcblk0p15 /cache ext4 rw,nosuid,nodev,relatime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/vold/179:18 /mnt/sdcard2 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
时间: 2024-10-31 20:52:59

路径-各位android的高手,请问怎么得到,判断一台机器上usb盘的目录是什么的相关文章

请问asp.net将通过Internet文件发送到另一台机器上的解决方法?

问题描述 如题,另一台机器上没有用webservice,以前是通过ftp软件上传的,现在想通过asp.net程序实现的,不知道有什么好的方案没? 解决方案 解决方案二:asp.net动态调用FTP上传吧~解决方案三:貌似Remoting可以

apk-两台机器的android studio aok签名不一致

问题描述 两台机器的android studio aok签名不一致 两台机器上的android studio用同样keyStore生成的apk,md5值不同是为什么? keyStore是在机器A上的android studio上生成,A的android studio没有设置master password ,机器B上有master password,虽然我觉得这没什么关系,md5应该只跟keyStore有关吧? 请问这到到底是怎么回事?很困扰啊 解决方案 http://www.oschina.ne

Android数据库高手秘籍(二)——创建表和LitePal的基本用法

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38556989 上一篇文章中我们学习了一些Android数据库相关的基础知识,和几个颇为有用的SQLite命令,都是直接在命令行操作的.但是我们都知道,数据库是要和程序结合在一起使用的,单独对一个数据库去进行増删改查操作并没有什么意义,因此今天我们就来学习一下如何在Android程序当中去操作SQLite数据库,还没看过前一篇文章的朋友可以先去参考 Android数据库高手秘籍(一

按钮-网页要实现控制一台遥控车(硬件)的行走路径(行为),请问如何实现?

问题描述 网页要实现控制一台遥控车(硬件)的行走路径(行为),请问如何实现? 前几天买了一台遥控车玩具,只有一个遥控手柄,不大方便. 我想如果能搞个网页然后坐在电脑前或者拿出手机打开浏览器登录网页,网页左面是遥控车上装载的摄像头传过来的视频事实画面,右面是行为操控按钮,这样该有多好玩啊. 解决方案 你买的是啥遥控车-不好实现 解决方案二: 遥控车是脉冲信号,电脑无法模拟施放出这种信号,除非你接上某种外设,能释放脉冲信号,但是如何将数字信号转换成脉冲信号,这是个问题

android中,请问谁知道怎样将视屏画面旋转180度之后播放?

问题描述 android中,请问谁知道怎样将视屏画面旋转180度之后播放? 不关横竖屏的事,各位大神,谁知道啊,急需啊.......................... 解决方案 试试看setOrientaionHint(180); 解决方案二: android中视频的操作中有个setOrientaionHint(180);//视频旋转180就可以了: 如果对您有帮助,请采纳

求助各位高手,请问怎样用java实现一个基于正则表达式的查找程序呢?

问题描述 求助各位高手,请问怎样用java实现一个基于正则表达式的查找程序呢?谢谢! 解决方案 解决方案二:你想查找什么呀?问题说清楚一些解决方案三:publicstaticString[]getStrExpression(Stringregex,Stringstr){List<String>temp=newArrayList<String>();Patternp=Pattern.compile(regex);Matcherm=p.matcher(str);while(m.find

请高手看下,下面红色的动态Input上传的图片怎么没有赋值给PIC3

问题描述 请高手看下,下面红色的动态Input上传的图片怎么没有赋值给PIC3.上传图片将地址和文件名给PIC3,然后从数据库中取出并显示.当提交保存的时候,一直是数据库中旧的值.不知道问题出在哪儿?是不是循环中的动态input有问题?谢谢!<%dimpaixuifrs.EOFandrs.BOFthenresponse.Write"<divalign=center><fontcolor=red>还没有分类</font></center>&qu

http协议-android 服务器 怎样通过Http协议实现两台设备之间进行通信?

问题描述 android 服务器 怎样通过Http协议实现两台设备之间进行通信? 做一个程序,要A客户端通过服务器向B终端发送一条指令,B回复信息给服务器,服务器再回复到A客户端,(在网上查好像可以用Servlet转发实现,但是考虑好久不知道是什么逻辑~糗~)我是刚入行的小菜鸟,请大神们指教~跪谢~ 解决方案 Android HTTP 实现与服务器通信 解决方案二: 调用http接口,但是不能实现实时消息,需要定时刷新,流量消耗大,你可以用xmpp协议,或者用第三方的IM框架,比如 环信IM服务

数据库-Android开发把知道的坐标显示到百度地图上

问题描述 Android开发把知道的坐标显示到百度地图上 如题所述,我从数据库中取出来上一次的坐标,怎么让它显示到百度地图上呀 解决方案 http://www.2cto.com/kf/201406/305878.html