Adb在其路径中具有特殊字符的拉文件

时间:2014-06-14 10:42:02

标签: java android escaping adb

我正在尝试使用adb over network将手机中的文件复制到我的电脑上。 即使对于路径中包含空格的文件,我的代码也能正常工作,但对于包含任何特殊字符的文件(例如“ßáö”)而言,它会失败,这就是我的问题。

我需要从java执行此命令,我目前正在使用此代码来提取文件:

public static void pullFile() {
    try {
        // Setting file paths
        String androidFilePath = "\"/storage/sdcard0/Download/Bußgeld 2014 TGC.pdf\"";
        String windowsFilePath = "\"C:\\Dropbox\\Java Projekte\\ADB Browser\\bin\\files\\Bußgeld 2014 TGC.pdf\"";
        System.out.println(androidFilePath);
        System.out.println(windowsFilePath);

        // Building command
        List<String> cmd = new LinkedList<>();
        cmd.add("adb");
        cmd.add("pull");
        cmd.add(androidFilePath);
        cmd.add(windowsFilePath);

        // Running command
        ProcessBuilder builder = new ProcessBuilder(cmd);
        builder.redirectErrorStream(true);
        Process p = builder.start();

        // Getting the output from the command ...

        System.out.println(stringBuilder.toString);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

当我运行此代码时,我收到以下错误: 远程对象'/ storage / sdcard0 /下载/Bu geld2014TGC.pdf'不存在

我现在的问题是如何正确转义adb的字符。

我曾尝试使用

ByteBuffer buf = Charset.forName("UTF-8").encode(androidFilePath);
androidFilePath = new String(buf.array(), "UTF-8");

但这样我得到一些尾随空格,我无法删除,因为trim将返回一个新的String,它不是用“UTF-8”编码的;

好的,我想通了,这可能不是java代码的错!我从cmd以及windows powershell运行命令并返回:

  

远程对象'/ storage / sdcard0 /下载/Bu▀geld2014TGC.pdf'不存在

1 个答案:

答案 0 :(得分:2)

我设法通过使用以下代码段对路径进行编码来解决问题(这显然是adb Issue 8185: adb push doesn't accept unicode filenames中的错误)。

byte ptext[] = androidFilePath.getBytes("UTF-8");
androidFilePath = new String(ptext, "CP1252");