您的位置:首页 > 移动开发 > Android开发

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

2016-06-07 21:40 603 查看
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;

                }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息