2010-09-08 50 views
1

我有一个下载的MP3,我可以验证为MP3通过adb拉到我的mac或pc,并在其各自的媒体播放器中播放。但是,Android的错误意味着它不支持该格式。我认为它可能与我存储文件的目录位置有关,但这没有意义(/data/data/com.myapp/files/file_audio.mp3)。这是一个的AsyncTask里面的代码:Android媒体播放器与PVMFErrNotSupported的MP3失败?

protected String doInBackground(String... params) { 

     String filename = params[0]; 

     try { 
      StringBuilder filenameMp3 = new StringBuilder().append(context.getFilesDir()); 
      filenameMp3.append("/").append(filename); 

      Uri uriMp3 = Uri.parse(filenameMp3.toString()); 
      Log.d(TAG, "Listen to this ringtone! [" + uriMp3.toString() + "]"); 

      MediaPlayer mp = MediaPlayer.create(context, uriMp3); 
      mp.prepare(); 
      mp.start(); 
     } catch (IllegalStateException e) { 
      Log.e(TAG, e.toString()); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.e(TAG, e.toString()); 
      e.printStackTrace(); 
     } 

     return null; 
    } 

这里是日志:

09-07 23:16:09.617 E/MediaPlayerService(1128): The Default Player is PV_PLAYER*********************** 
09-07 23:16:09.617 V/PVPlayer(1128): PVPlayer constructor 
09-07 23:16:09.617 V/PVPlayer(1128): construct PlayerDriver 
09-07 23:16:09.617 V/PlayerDriver(1128): constructor 
09-07 23:16:09.627 V/PlayerDriver(1128): OpenCore hardware module loaded 
09-07 23:16:09.627 V/PlayerDriver(1128): start player thread 
09-07 23:16:09.627 V/PlayerDriver(1128): startPlayerThread 
09-07 23:16:09.627 V/PlayerDriver(1128): InitializeForThread 
09-07 23:16:09.627 V/PlayerDriver(1128): OMX_MasterInit 
09-07 23:16:09.647 V/PlayerDriver(1128): OsclScheduler::Init 
09-07 23:16:09.647 V/PlayerDriver(1128): CreatePlayer 
09-07 23:16:09.657 V/PlayerDriver(1128): AddToScheduler 
09-07 23:16:09.657 V/PlayerDriver(1128): PendForExec 
09-07 23:16:09.657 V/PlayerDriver(1128): OsclActiveScheduler::Current 
09-07 23:16:09.657 V/PlayerDriver(1128): StartScheduler 
09-07 23:16:09.657 V/PVPlayer(1128): send PLAYER_SETUP 
09-07 23:16:09.667 V/PlayerDriver(1128): Send player code: 2 
09-07 23:16:09.667 V/PlayerDriver(1128): CommandCompleted 
09-07 23:16:09.667 V/PlayerDriver(1128): Completed command PLAYER_SETUP status=PVMFSuccess 
09-07 23:16:09.667 V/PVPlayer(1128): setDataSource(/data/data/com.myapp/files/audio.mp3) 
09-07 23:16:09.667 V/PVPlayer(1128): prepareAsync 
09-07 23:16:09.667 V/PVPlayer(1128): data source = /data/data/com.myapp/files/audio.mp3 
09-07 23:16:09.667 V/PlayerDriver(1128): Send player code: 3 
09-07 23:16:09.667 V/PlayerDriver(1128): handleSetDataSource 
09-07 23:16:09.667 V/PlayerDriver(1128): handleSetDataSource- scanning for extension 
09-07 23:16:09.667 V/PlayerDriver(1128): HandleInformationalEvent: PVMFInfoErrorHandlingStart 
09-07 23:16:09.667 V/PlayerDriver(1128): HandleInformationalEvent: type=26 UNHANDLED 
09-07 23:16:09.667 W/MediaPlayer(14630): info/warning (1, 26) 
09-07 23:16:09.667 I/MediaPlayer(14630): Info (1,26) 
09-07 23:16:09.667 V/PlayerDriver(1128): CommandCompleted 
09-07 23:16:09.667 V/PlayerDriver(1128): Completed command PLAYER_SET_DATA_SOURCE status=PVMFErrNotSupported 
09-07 23:16:09.667 E/PlayerDriver(1128): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported 
09-07 23:16:09.667 E/MediaPlayer(14630): error (1, -4) 
09-07 23:16:09.677 V/PVPlayer(1128): run_init s=-2147483648, cancelled=0 
09-07 23:16:09.677 V/PlayerDriver(1128): HandleInformationalEvent: PVMFInfoErrorHandlingComplete 
09-07 23:16:09.677 W/PlayerDriver(1128): PVMFInfoErrorHandlingComplete 

任何线索?

回答

2
FileInputStream fis = getBaseContext().openFileInput(filename.toString()); 
mp = new MediaPlayer(); 
mp.setOnCompletionListener(onCompleteAudioListener); 
mp.setDataSource(fis.getFD()); 
mp.prepare(); 
mp.start(); 

加上正常的检查和错误处理。

+0

谢谢亚历克斯 - 这是一个更好的解决方案,因为它不需要搞乱系统媒体文件夹。 – mobibob 2010-09-08 16:55:38

0

这将是很好的选择您要播放的文件是否存在,并且其长度大于0,以确保公正的路径是正确的:

File file = new File("/data/...../....mp3"); 

boolean exists = file.exists(); 

long length = file.length(); 

另外,还要确保你的URI与file://开始

+0

好的 - 我做到了,但我得到了同样的错误,但是我得到了同样的错误。此外,我会期待不同的错误。此错误意味着它找到了该文件,但它不是MP3。 – mobibob 2010-09-08 14:07:37

+0

尝试以不同的方式创建MediaPlayer。 'MediaPlayer mp = new MediaPlayer(...); mp.setDataSource( “/路径/到/ mp3file.mp3”);熔点。准备();' – plugmind 2010-09-09 14:31:03

0

好的 - 我得到它的工作,但不是因为我希望我能实施。首先,我必须在系统媒体文件夹中存储:

File file = new File("/system/media/audio/ringtones/", filename); 

其次,我不得不停下来准备启动媒体播放器。我尝试了基于网络上其他帖子的其他帖子。

  if (exists && length > 0) { 
       mp = MediaPlayer.create(context, uriMp3); 
       mp.stop(); 
       mp.prepare(); 
       mp.start(); 
      } else { 
       if (exists) { 
        return String.format("Ringtone has length %d.", length); 
       } else { 
        return String.format("Ringtone %s is missing.", uriMp3.toString()); 
       } 
      } 
+0

Arghh ...这是一个不可接受的解决方案,因为我不得不重新装入卷以使其可写。必须有一种方法让媒体播放器对我的存储位置感到满意。此外,它需要成为手机可访问的铃声文件。 – mobibob 2010-09-08 15:32:30