Android MediaPlayer 问题:“Error (-38 , 0)"和“停止在状态 1 中调用" [英] Android MediaPlayer Problems :"Error (-38 , 0) " and "stop called in state 1"
问题描述
即使是模拟器,我的设备也没有声音.
It's no sound from my device even the emulator.
实际上,在 "mMediaPlayer.create(this, musicIds[0]); " 行,eclipse 建议我两个选择:"使用'MediaPlayer'更改对静态的访问(声明type)" 或 "在 Create() 上添加 @SuppressWarnings 'static-access'".顺便说一句,我接受了 eclipse 的建议........但仍然不起作用.
Actually, at the line "mMediaPlayer.create(this, musicIds[0]); " , eclipse suggests me two choices : "Change access to static using 'MediaPlayer'(declaring type)" or "Add @SuppressWarnings 'static-access' to on Create()". By the way, I take eclipse's suggestions........but still don't work.
附言我从其他项目(寻呼机)调用了一个包.
P.S. I called a package from other project (pager).
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.diff_title);
setContentView(R.layout.title_layout);
viewFlow = (ViewFlow) findViewById(R.id.viewflow);
DiffAdapter adapter = new DiffAdapter(this);
viewFlow.setAdapter(adapter);
TitleFlowIndicator indicator = (TitleFlowIndicator) findViewById(R.id.viewflowindic);
indicator.setTitleProvider(adapter);
viewFlow.setFlowIndicator(indicator);
//Set all views
listView = (ListView) findViewById(R.id.listView1);
listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, listeStrings));
final ImageView imv=(ImageView)findViewById(R.id.imv);
imv.setImageResource(imageIds[0]);
final ImageView pic = (ImageView)findViewById(R.id.Picture);
pic.setImageResource(imageIds[0]);
btnPlay = (ImageButton)findViewById(R.id.btnplay);
btnPlay.setOnClickListener(this);
btnNext = (ImageView)findViewById(R.id.imvnext);
btnLast = (ImageView)findViewById(R.id.imvlast);
final TextView textview = (TextView)findViewById(R.id.textView2);
textview.setText(listeStrings[0]);
seekBar = (SeekBar)findViewById(R.id.seekbar);
//seekBar.setMax(mMediaPlayer.getDuration());
mMediaPlayer.create(this, musicIds[0]);
try {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
}
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int songIndex = position;
String songTitle=musicNames[position];
imv.setImageResource(imageIds[position]);
pic.setImageResource(imageIds[position]);
textview.setText(listeStrings[position]);
}
});
}
}
这是我的日志:
08-11 07:33:19.217: E/MediaPlayer(338): stop called in state 1
08-11 07:33:19.217: E/MediaPlayer(338): error (-38, 0)
08-11 07:33:19.217: E/MediaPlayer(338): prepareAsync called in state 0
08-11 07:33:19.217: W/System.err(338): java.lang.IllegalStateException
08-11 07:33:19.227: W/System.err(338): at android.media.MediaPlayer.prepare(Native Method)
08-11 07:33:19.227: W/System.err(338): at org.taptwo.android.widget.viewflow.example.DiffViewFlowExample.onCreate(DiffViewFlowExample.java:95)
08-11 07:33:19.227: W/System.err(338): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-11 07:33:19.227: W/System.err(338): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-11 07:33:19.227: W/System.err(338): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-11 07:33:19.227: W/System.err(338): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-11 07:33:19.227: W/System.err(338): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-11 07:33:19.227: W/System.err(338): at android.os.Handler.dispatchMessage(Handler.java:99)
08-11 07:33:19.227: W/System.err(338): at android.os.Looper.loop(Looper.java:123)
08-11 07:33:19.227: W/System.err(338): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-11 07:33:19.227: W/System.err(338): at java.lang.reflect.Method.invokeNative(Native Method)
08-11 07:33:19.227: W/System.err(338): at java.lang.reflect.Method.invoke(Method.java:507)
08-11 07:33:19.227: W/System.err(338): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-11 07:33:19.227: W/System.err(338): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-11 07:33:19.227: W/System.err(338): at dalvik.system.NativeStart.main(Native Method)<br>
08-11 07:33:19.257: E/MediaPlayer(338): Error (-38,0)
推荐答案
在prepare()
之前,需要先调用setDataSource(..)
.
Media 框架是一个非常严格的状态机,处理所有不同的状态真的很麻烦.
The Media framework is a very strict state machine, and it's really cumbersome to handle all the different states.
我使用了这个小包装器,它使编码/调试更容易一些.你可以试试看.
I've used this little wrapper that makes the coding/debugging a bit easier. You can give it a try.
关于模拟器 - 请注意,并非所有文件格式都受其支持.
Regarding emulator - note that not all file formats are supported on it.
这篇关于Android MediaPlayer 问题:“Error (-38 , 0)"和“停止在状态 1 中调用"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!