繁体   English   中英

我无法在Android Nougat中获得根路径usb otg。但是能够获得SD卡的根路径

[英]I am not able get root path usb otg in Android Nougat .but able to get root path of sd card

我无法在Android Nougat中获得根路径usb otg正常工作直到棉花糖。 甚至能够获得SD卡的根路径。可以任何身体帮我解决这个问题我几天都很沮丧。

这是我的代码返回根路径到marshmallow和nougat sdcard。 但不是usb otg

public static String FileSystem() {
        String path = null;
        String SD_CARD_DIR = null;
        try {
            Process mount = Runtime.getRuntime().exec("mount");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mount.getInputStream()));
            mount.waitFor();

//            String extPath = Environment.getExternalStorageDirectory().getPath();
//            String isMedai = Environment.getExternalStorageState();
//            if(Environment.MEDIA_MOUNTED.equalsIgnoreCase(isMedai)){
//                String root = Environment.getRootDirectory().getPath();
//                path  = Environment.getExternalStoragePublicDirectory(DIRECTORY_EDUCOMP).getPath();
//            }
            String line;
            String strFileSystem = null;
            while ((line = bufferedReader.readLine()) != null) {
                String[] split = line.split("\\s+");
                for (int i = 0; i < split.length - 1; i++) {
                    if (SD_CARD_DIR == null) {
                        File mainroot = new File(split[i]);
                        File f[] = mainroot.listFiles(new FilenameFilter() {
                            @Override
                            public boolean accept(File dir, String name) {
                                return new File(dir, name).isDirectory();
                            }
                        }); // Get First level folders /mnt
                        if (f != null) {
                            for (File aFile : f) {
                                File[] filenames = aFile.listFiles(); // Get second level
                                // folders
                                // /mnt/sdcard so on
                                // and math Educomp
                                // folder
                                if (filenames != null) {
                                    for (File ff : filenames) {
                                        String eduFileName = ff.getName();
                                        if (eduFileName.equals("Temp")) {
                                            File[] listEducompfile = ff.listFiles();
                                            if (listEducompfile != null) {
                                                for (File fff : listEducompfile) {
                                                    String contentFileName = fff.getName();
                                                    if (contentFileName.equals("ts")) {
                                                        SD_CARD_DIR = aFile
                                                                .getAbsolutePath() + "/";
                                                        break;
                                                    }
                                                }

                                            }
                                        } else {
                                            File[] filenamesList = ff.listFiles(new FilenameFilter() {
                                                @Override
                                                public boolean accept(File dir, String name) {
                                                    return new File(dir, name).isDirectory();
                                                }
                                            });
                                            if (filenamesList != null) {
                                                for (File fff : filenamesList) {
                                                    String eduFileNamess = fff.getName();
                                                    if (eduFileNamess.equals("Temp")) {
                                                        File[] listEducompfile = fff.listFiles();
                                                        if (listEducompfile != null) {
                                                            for (File fffds : listEducompfile) {
                                                                String contentFileName = fffds.getName();
                                                                if (contentFileName.equals("ts")) {
                                                                    return SD_CARD_DIR = ff + "/";

                                                                }
                                                            }

                                                        }
                                                    }
                                                }
                                            }

                                        }
                                    }
                                }

                            }
                        }
                    }

                    // SD_CARD_DIR = DEFAULT_SD_CARD_DIR;
                }

                return SD_CARD_DIR;
            }

            return path;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }
File dir = new File ("/");

File files = dir.listFiles();

您将无法在Nougat中获取根目录的列表。 你本可以告诉我们的。

`files==null` or files.length()==0

Nougat不允许列出root。 还有其他几个目录,你不能再在Nougat下列出了。

您可以在Nougat上查看此方法 但如果可移动SD卡和USB闪存同时连接到您的设备,则无法区分它们。

你的方法-解析挂载文件-不会为某些(?,葡萄牙语)设备工作,因为内部存储器的字符串项可能是完全一样的可移动SD卡。

PS用户有责任在“设计良好”的应用程序中查找USB闪存或可移动SD卡的位置。 你不应该自己这样做,因为Android没有为此目的提供公共API ,除了Intent.ACTION_OPEN_DOCUMENT_TREE调用内置文件选择器与用户交互以选择文件夹。

PPS与USER交互:创建名为“Show USB OTG Root”的按钮和包含的onClick方法

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);//http://stackoverflow.com/questions/28605278/android-5-sd-card-label
startActivityForResult(intent, REQUEST_CODE_USB_ACCESS);

onActivityResult回调中,当他在内部Android选择器中选择USB OTG root时,您必须捕获用户答案:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    switch (requestCode) { 
        case REQUEST_CODE_USB_ACCESS:                    
            if (data.getData() != null) {
                int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                getContentResolver().takePersistableUriPermission(data.getData(), takeFlags);
                DocumentFile documentFile = DocumentFile.fromTreeUri(this, data.getData());
            }
    }
}

documentFile是一个表示USB OTG root的访问对象(如果用户在选择时没有出错)。 您可以在其上进行一些文件操作,如documentFile.listFiles()。 从Lollipop开始,没有其他方法可以在公共API中的可移动媒体上使用文件。 即你想要的USB OTG路径不能从一些公共API方法获得。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM