我遇到了同样的问题,但最后我得到了它的工作!
如果你使用例如 C#,你必须像下面的例子那样做:
02.12.2019
根据protocol.txt,ADB-Protocol 支持“智能套接字”。这些套接字可用于完成所有工作,adb.exe 中的 ADB-Client 可以。例如,如果要上传文件,则必须请求这样的“智能套接字”。之后,您必须遵循分配给服务的协议(有关服务概述,请参见SERVICE.txt),例如SYNC.txt中所述。
13.10.2014
public static List<string> ExecuteBG(string exe, string args, int timeOut = -1)
{
if (File.Exists(exe) || exe == "cmd.exe")
{
ProcessStartInfo StartInfo = new ProcessStartInfo();
StartInfo.FileName = exe;
StartInfo.Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args));
StartInfo.CreateNoWindow = true;
StartInfo.UseShellExecute = false;
StartInfo.RedirectStandardError = true;
StartInfo.RedirectStandardOutput = true;
StartInfo.StandardErrorEncoding = Encoding.UTF8;
StartInfo.StandardOutputEncoding = Encoding.UTF8;
AutoResetEvent errorWaitHandle = new AutoResetEvent(false);
AutoResetEvent outputWaitHandle = new AutoResetEvent(false);
List<string> response = new List<string>();
Process proc = new Process();
proc.StartInfo = StartInfo;
proc.ErrorDataReceived += (s, e) =>
{
if (String.IsNullOrEmpty(e.Data))
{
errorWaitHandle.Set();
}
else
{
response.Add(e.Data);
}
};
proc.OutputDataReceived += (s, e) =>
{
if (String.IsNullOrEmpty(e.Data))
{
outputWaitHandle.Set();
}
else
{
response.Add(e.Data);
}
};
proc.Start();
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
proc.WaitForExit(timeOut);
errorWaitHandle.WaitOne(timeOut);
outputWaitHandle.WaitOne(timeOut);
return response;
}
return new List<string>();
}
真正重要的是这部分“StartInfo.Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args));”,这里我们将 UTF8 字符串转换为 cmd 已知的 Windows“默认”字符集。因此,我们向 cmd 发送一个“已销毁”“默认”编码字符串,Android shell 会将其转换回 UTF8。所以我们有“üöäÜÖÄàè 等”之类的“变音符号”。
希望这可以帮助某人。
PS:如果您需要一个支持 UTF8 推/拉文件/文件夹的工作“框架”,还请查看我的 AndroidCtrl.dll,它是 C# .NET4 编写的。
问候,塞巴斯蒂安