Android5.X和Android6.X上读写外置 USB设备的方案

来源:互联网 发布:数据分析师专业 编辑:程序博客网 时间:2024/05/16 07:06

Android5.X和Android6.X上对于Mount USB设备做了很大的变更,所以要获取USB的Mount路径的方法和读写权限也有很大不同


Android5.0系统下, USB设备被mount的路径为以下,以此类推

/storage/sda1

/storage/sdb1

/storage/sdc1

Android5.0系统下,USB中所有路径都有读写权限,当然manifest中android.permission.READ_EXTERNAL_STORAGE, android.permission.WRITE_EXTERNAL_STORAGE权限记得加上

    public void getUsbPath() {

        private StringUSB_DEVICE_FILTER = "/storage/sd";

        private ArrayList<String> usb_list;
        usb_list = new ArrayList<String>();
        usb_list.clear();
        try {
            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) {
                if (line.contains(USB_DEVICE_FILTER)) { //通过路径名过滤真正的USB设备
                    String columns[] = line.split(" ");
                    if (columns != null && columns.length > 1) {
                        usb_list.add(columns[1].trim());
                    }
                    Log.d(TAG,"storage  "+line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        Log.i(TAG, "finally,usb_list.size()=" + usb_list.size());  //可以支持读取多个USB设备,使用USB HUB外接也可以
    }



Android6.0系统下, USB设备被mount的路径为   /storage/xxxx-xxxx/    (这个xxxx-xxxx是USB设备id,每个设备都不同)

Android6.0系统下, 只能在USB下指定路径 /Android/data/PackageName/files下才有写权限,读权限倒是所有路径都可以

 File[] files = getExternalFilesDirs(null);  //call this code to auto create /storage/XXXX-XXXX/Android/data/PackageName/files
                Log.v(TAG, "files.length=" + files.length);
                File usbFile = null;
                for(int i = 0; i < files.length; i++){
                    Log.v(TAG, "files[" + i + "].getPath()=" + files[i].getPath());
                    if(files[i].getPath().indexOf("emulated") >= 0){
                        continue; //   /storage/emulated/0/Android/data/PackageName/files is not USB path, so skip
                    }
                    else{
                        usbFile = files[i]; //如果机器上插了多个U盘,其实可以取得多个USB路径,这里只取第一个
                        break;
                    }
                }


                if(usbFile != null) {
                    Log.v(TAG, "usbFile.getPath=" + usbFile.getPath());
                    Toast.makeText(getApplicationContext(), "usbFile.getPath=" + usbFile.getPath(),Toast.LENGTH_SHORT).show();
                }
                else{
                    Toast.makeText(getApplicationContext(), "No USB device found",Toast.LENGTH_SHORT).show();
                    return;
                }










1 0