安卓播放器抛出异常:准备失败,状态为0x1。

3

我想从res/raw文件夹播放音频文件,但是出现了错误:

准备失败:状态=0x1

我的代码:

package com.example.lvm;

import java.io.IOException;

import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
Button introAudio;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                introAudio=(Button)findViewById(R.id.introAudio);
                introAudio.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View arg0) {
                                MediaPlayer mp = new MediaPlayer();
                                String name = "greeting";
                                 mp.setOnCompletionListener(new OnCompletionListener() {

                                        @Override
                                        public void onCompletion(MediaPlayer mp) {
                                            mp.release();
                                        }

                                    });

                                try {
                                     mp.setDataSource("android.resource://com.example.lvm/raw/"+name);
                                         mp.prepare();
                                         mp.start();
                                } catch (Exception e) {
                                         Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
                                }
                        }
                });
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.activity_main, menu);
                return true;
        }

}

我有同样的问题。但在我的情况下,我下载文件并存储它。在调用prepare之前,文件已存在,所有其他流都已关闭。如果我稍后调用prepare,它不会抛出异常。不知道问题出在哪里,但还没有找到解决方案。 文件名只是guid。 - Alex Sorokoletov
和往常一样,我一分享我的评论就找到了解决方案。 首先,我在DDMS中检查日志,以查看有关错误的任何其他信息。我发现在异常Failed to open file 'audio/2f32a5de.mp4'. (No such file or directory)之前出现了错误。然后我发现,在某种特定情况下,我没有正确创建完整路径 :) - Alex Sorokoletov
3个回答

4
prepare failed:status 0x1

发生这种情况是由于文件路径错误、目录不正确、Url或Uri错误导致的。
在您的代码中尝试以下操作。
 mediaplayer.setDataSource(MainActivity.this, Uri.parse("android.resource://com.example.lvm/raw/"+name)); 
 //do not add any extension to name, eg. `R.raw.your_raw_file` 

代替

mp.setDataSource("android.resource://com.example.lvm/raw/"+name);

我已经完成了。现在没有任何异常抛出,但是我听不到声音。 - dsharew
1
请确保文件没有损坏,请尝试使用另一个文件。我现在看不到任何问题。 - Ritesh Gune
谢谢您的建议,我不得不修改我的代码,但是您的建议对我很有帮助 :) - ani0904071

1
似乎创建31个准备好的MediaPlayer是最大限制。当你尝试创建第32个并调用prepare时,会出现此错误。
如果是这种情况,如何解决:
  1. 在无用的MediaPlayer上调用release
  2. 限制可以创建多少个MediaPlayer。例如,如果您正在使用队列,请尝试ArrayBlockingQueue<T>
  3. 捕获IOException e,检查"Prepare failed.: status=0x1".equals(e.getMessage()),如果是,则重试。

1
我是说第32个。:P - Mygod

1

首先,检查您文件的名称。它不能包含大写字母和特殊字符。删除该文件,更改名称并将其再次复制到环境中。然后在Eclipse中使用Project => Clean功能(应重新生成R.java)。您还可以尝试使用mp.setDataSource("android.resource://com.example.lvm/raw/"+name);而不是mediaplayer.setDataSrouce(MainActivity.this, Uri.parse("android.resource://com.example.lvm/raw/"+name));请记住不要向名称添加任何扩展名,例如R.raw.your_raw_file


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接