gpt4 book ai didi

安卓 : MediaPlayer getDuration() and getCurrentPosition() has NullPointerException

转载 作者:太空狗 更新时间:2023-10-29 16:36:21 26 4
gpt4 key购买 nike

创建一个 MediaPlayer。特定类具有播放、暂停和恢复的功能。我正在尝试制作一个 SeekBar 来显示进度。SeekBar 需要作为 maxlength 的值,它是从调用 mediaplayer.getDuration( ) 函数并返回值。SeekBar 还需要从 getCurrentPostion() 函数获得的当前位置值。它们都返回一个 NullPointerException

public class PlayMedia extends AsyncTask<Void, Void, Void>
implements MediaPlayer.OnPreparedListener {


private MediaPlayer mediaPlayer;
int length;
int duration =0;
int currentPosition=0;
@Override
protected Void doInBackground(Void... params) {
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath().toString()+"/Notate/"+MainActivity.filepath+".wav");
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {

}
return null;
}

@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);

}
public int getDuration(){
duration=mediaPlayer.getDuration();
Log.d("Position",Integer.toString(duration));
return duration;
}
public int getPresentDuration(){
currentPosition=mediaPlayer.getCurrentPosition();
Log.d("CurrentPosition",Integer.toString(currentPosition));
return currentPosition;
}

@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
if(mediaPlayer != null && mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
else if(mediaPlayer != null){
mediaPlayer.start();
}
Log.d("Shivram", "Started Playing");

}
public void pause(){
mediaPlayer.pause();
length=mediaPlayer.getCurrentPosition();
Log.d("Shivram","Paused");
}
public void resume(){
mediaPlayer.seekTo(length);
mediaPlayer.start();
Log.d("Shivram","Resume");

此 fragment 类调用 getDuration() 函数,在该函数中创建异常。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
contentViewC = inflater.inflate(R.layout.fragment_fragment_b, container, false);
final SeekBar seekBar;

Button button = (Button) contentViewC.findViewById(R.id.button1);
Button button2 = (Button) contentViewC.findViewById(R.id.button2);

textToChange=(TextView)contentViewC.findViewById(R.id.textView1);
final PlayMedia play=new PlayMedia();
boolean pause=false;
seekBar = (SeekBar) contentViewC.findViewById(R.id.SeekBar01);
final int[] recordingDuration = new int[1];


button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (MainActivity.filepath != "Nothing") {
if(play.getStatus()==AsyncTask.Status.FINISHED || play.getStatus()==AsyncTask.Status.RUNNING){
Log.d("Shivram-FragmentA", "Resume");
play.resume();

}
if(play.getStatus()==AsyncTask.Status.PENDING) {
play.execute();
recordingDuration[0] =play.getDuration();
seekBar.setMax(recordingDuration[0]);
}
Frequency getFreq=new Frequency();

getFreq.execute();
}
}
});

stackTrace如下

01-13 21:44:15.182  16263-16263/com.example.shivram.notate E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.shivram.notate, PID: 16263
java.lang.NullPointerException
at com.example.shivram.notate.PlayMedia.getDuration(PlayMedia.java:43)
at com.example.shivram.notate.FragmentC$1.onClick(FragmentC.java:66)
at android.view.View.performClick(View.java:4456)
at android.view.View$PerformClick.run(View.java:18465)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

最佳答案

您的问题区域在这里:

play.execute();
recordingDuration[0] =play.getDuration();

无法保证 AsyncTask 在执行 play.execute() 后何时完成,因为这是一个 Thread 并且有自己的生命周期。因此,您的 MediaPlayer 可能尚未初始化。尝试做这部分:

recordingDuration[0] =play.getDuration();
seekBar.setMax(recordingDuration[0]);

在您的 AsyncTask 完成后台作业之后。这应该在您的 PostExecute 方法中完成并将解决异常。

但经过一番思考,让我们意识到设计是错误的。 您不需要在 AsyncTask 中维护 MediaPlayer

在您的 Activity 中创建和管理 MediaPlayer。让您的 Activity 实现 OnPreparedListener。通过onPrepared获取持续时间并设置搜索栏(查看下面的示例代码)。仅当文件加载且播放器准备就绪时,您才能获取持续时间。

将暂停和恢复方法移至您的 Activity 。 AsyncTask 主要用于完成长时间运行的任务。我在下面放了一个示例代码,应该有助于理解这一点。

public class MainActivity implements MediaPlayer.OnPreparedListener{

private MediaPlayer mediaPlayer;
boolean isReady;
boolean paused;

.....
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Your logic to play, pause and initialize if needed
if (!MainActivity.filepath.equals("Nothing")) {
if(mediaPlayer != null && mediaPlayer.isPlaying()){
pause();
paused = true;
}else if(paused){
resume();
paused = false;
}
// initialize again when player is stopped and another file is set
// in that case put logic so that mediaPlayer is disposed and set to null
if (mediaPlayer == null){
initializeMediaPlayer();
}


}
}
});

public void initializeMediaPlayer(){
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath().toString()+"/Notate/"+MainActivity.filepath+".wav");
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.prepareAsync(); // this is important so that UI is not stuck
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {

}
}

// You need to listen for when the Media Player is finished preparing and is ready
@Override
public void onPrepared(MediaPlayer mp) {

recordingDuration[0] = mediaPlayer.getDuration();

//Called when the media file is ready for playback.
isReady = true;
// Start the player
mediaPlayer.start();

}

public void pause(){

if (mediaPlayer != null){
mediaPlayer.pause();
length=mediaPlayer.getCurrentPosition();
}
}
public void resume(){

if (mediaPlayer != null){
mediaPlayer.seekTo(length);
mediaPlayer.start();
}
}

@Override
public void onDestroy() {
if (mediaPlayer != null) mediaPlayer.release();
}


}

关于安卓 : MediaPlayer getDuration() and getCurrentPosition() has NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27926267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com