我最近注意到我开发的音频播放器停止播放。
事实证明"Prepare failed.: status=0x1"
引发了一个例外:
final Uri uri = Uri.parse("/storage/sdcard1/audio/Die Toten Hosen/03 - Boxed Set/2007 - Die DTH Jubiläumsedition [17 CD Boxed Set Remasted]/CD 1 - Opel-Gang/18. Radio Argentina #1.mp3");
mediaPlayer.reset();
mediaPlayer.setDataSource(context, uri);
文件名包含#符号。删除#后,可以播放。我刚删除#符号。文件路径本身很长并且包含空格,[等等。
adb push /tmp/ /storage/sdcard1/audio/
问题是当我用
将文件传输到手机时for i in edr.keys():
if i in expectededr.keys():
print 'true : key'+i
else:
print 'fail : key'+ i
其中一些包含?符号,然后它们被跳过(或发生错误/警告。不记得确切),但成功复制了名称中包含#的文件。如果有一些转义规则,那么问题应该与包含的文件相同?和包含#。
的文件因为我没有看到发生的事情的任何逻辑。看起来没有中心位置来定义应该转义的内容以及如何转义。
答案 0 :(得分:0)
因为您将Uri
传递到audioplayer
,#
和?
是特殊字符。在Uri中,哈希#
被称为Fragment Identifier,例如,它会自动将网页跳到某个锚标签,或者跳回到指定的开始时间。 Uri中的问号?
允许查询参数,可以被消耗Uri的任何内容使用的额外参数。
由于这些是Uri上下文中的特殊字符,因此这就是为什么播放最初失败的原因,并且一旦文件被重命名就会起作用。您可以使用URLEncoder.encode()
public static String encode(String s, 字符串enc) 抛出UnsupportedEncodingException
使用特定的编码方案将字符串转换为application / x-www-form-urlencoded格式。此方法使用提供的编码方案来获取不安全字符的字节。 注意:万维网联盟建议书规定应使用UTF-8。不这样做可能会引入不相容性。
<强>参数:强>
s - 要翻译的字符串。
enc - 支持的字符编码的名称。
<强>返回:强> 翻译过的字符串。
所以在你的情况下:
final String encoded = URLEncoder.encode("/storage/sdcard1/audio/Die Toten Hosen/03 - Boxed Set/2007 - Die DTH Jubiläumsedition [17 CD Boxed Set Remasted]/CD 1 Opel-Gang/18. Radio Argentina #1.mp3", "UTF-8");
final Uri uri = Uri.parse(encoded);
mediaPlayer.reset();
mediaPlayer.setDataSource(context, uri);
答案 1 :(得分:0)
解决方案是使用:
MediaPlayer.setDataSource(String);
显然它可以处理路径名中的#符号。
mediaPlayer.setDataSource("/storage/sdcard1/audio/Die Toten Hosen/03 - Boxed Set/2007 - Die DTH Jubiläumsedition [17 CD Boxed Set Remasted]/CD 1 - Opel-Gang/18. Radio Argentina #1.mp3");