【问题标题】:Android MediaPlayer unknown errorAndroid MediaPlayer 未知错误
【发布时间】:2017-07-06 13:41:56
【问题描述】:

我正在像这样在 MainActivity 的 onCreate() 方法中创建一个 MediaPlayer 实例

 MediaPlayer mPlayer = MediaPlayer.create(this, Uri.fromFile(new File("/storage/emulated/0/soundrecorder/My recording #26.wav")));

创建成功,但出现此错误:

07-06 18:33:44.266 18366-18366/com.audiorecorder.wel.voicerecorder E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
07-06 18:33:44.267 18366-18366/com.audiorecorder.wel.voicerecorder E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0

也试过这个,但在 logcat 上出现同样的错误:

MediaPlayer mp = new MediaPlayer();
    try {
        mp.setDataSource(this, Uri.fromFile(new File("/storage/emulated/0/soundrecorder/My recording #26.wav")));
    } catch (IOException e) {
        e.printStackTrace();
    }
    mp.prepareAsync();
    mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

我尝试了不同格式的不同音频文件,但结果是相同的错误。我也尝试在 stackoverflow 上搜索答案,但无法解决问题。你能帮我解决这个问题吗?

【问题讨论】:

  • 你是在设备还是模拟器上运行?
  • 在运行 Nougat 7.1.1 的摩托罗拉 Moto G 上运行
  • 我看到的一个问题是您的歌曲文件名中的空格,请尝试删除它们。可能会成功。
  • 我试过了,但问题仍然存在。
  • 尝试另一个音频文件,也可以使用另一种格式,例如mp3

标签: java android android-mediaplayer


【解决方案1】:

您的文件似乎有问题。用这个更新:

musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

然后按照以下步骤操作:

    1.  getLoaderManager().initLoader(0,null,this);
    2.  @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
            switch (id){
                case 0 : return new CursorLoader(getApplicationContext(),musicUri,null,null,null,null);        
            return new Loader<>(this);
        }

3. @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        switch (loader.getId()) {
            case 0 :
                if(data != null && data.moveToFirst()) {
                    songTitleColumnIndex = data.getColumnIndex(MediaStore.Audio.Media.TITLE);
                    do {
                        songTitle = data.getString(songTitleColumnIndex);
                        songsList.add(songTitle);
                    } while (data.moveToNext());
                }
                break;

所以 SongTitles 被放在了一个字符串类型的 ArraList 的 SongList 中。

希望这会有所帮助。

【讨论】:

  • 为什么要把歌名放在一个数组列表中?
  • 我只是在维护一个 SongTitles 的 ArrayList,我会将其显示为设备中存在的歌曲列表。
  • 应该的。你尝试恢复。
  • 这并不能解决我在创建新的 MediaPlayer 实例时出现的问题。从数据库中加载歌曲名称列表不是问题中所要求的。
【解决方案2】:

尝试使用 FileInputStream 来使用 FileDescriptor 启动 MediaPlayer:

String yourFilePath = "/wherever/your/file/is.wav";

MediaPlayer mPlayer = new MediaPlayer();

try{
    FileInputStream inputStream = new FileInputStream(yourFilePath);
    mPlayer.setDataSource(inputStream.getFD());
    inputStream.close();

    mPlayer.prepare();
    mPlayer.start();

}catch (IOException e){
    Log.e("IOException", e.getMessage());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多