MediaPlayer在路径中使用#播放文件时是否有问题?

时间:2017-12-06 11:19:25

标签: android android-mediaplayer

我最近注意到我开发的音频播放器停止播放。

事实证明"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

其中一些包含?符号,然后它们被跳过(或发生错误/警告。不记得确切),但成功复制了名称中包含#的文件。如果有一些转义规则,那么问题应该与包含的文件相同?和包含#。

的文件

因为我没有看到发生的事情的任何逻辑。看起来没有中心位置来定义应该转义的内容以及如何转义。

2 个答案:

答案 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");