- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
创建一个 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/
这个问题已经有答案了: How do I return the response from an asynchronous call? (42 个回答) 已关闭 7 年前。 我正在尝试将用户当前位置置
这是我的: var position; navigator.geolocation.getCurrentPosition(onSuccess, onError); function on
我正在开发一款不断需要用户当前位置的应用程序。 我遇到了一个问题,即设备第一次获取用户当前位置的纬度和经度并将其缓存起来,我认为每次都返回相同的纬度和经度。有没有办法从设备中删除缓存位置?任何帮助将不
我一直在开发一个使用 getCurrentPosition() 的应用,但它在最新版本的 Chrome 中不再起作用,请参阅: Deprecating Powerful Features on Ins
我正在使用谷歌地理定位的 getCurrentPosition() 函数来获取用户的当前位置。 它在 Firefox 中运行良好,但在 chrome 中不起作用。 我的代码如下:: Click
我试图通过本地 IPv4 地址连接到本地计算机上托管的网站,通过 navigator.geolocation.getCurrentPosition 访问我的手机的地理位置。问题是,当从我的手机运行代码
我想从 getCurrentPosition() 方法获取坐标,以便可以在其他方法中使用它,但我无法做到这一点。 这是我的 HTML 这是我的 JavaScript 代码 var x = docum
我正在尝试初始化一个以当前用户位置为中心并带有标记的 map 。在本地,一切都很好,但是当我将 html 页面部署到 Google Appengine 时,它只显示 map ,没有地理定位....
我有一个关于 geolocation.getCurrentPosition() 的问题 我有以下代码: $(document).on('click', '#find_pickupStoresNearM
我正在使用 getCurrentPosition 获取本地纬度和经度。我知道这个函数是异步的,只是想知道如何返回可以被其他函数访问的纬度和经度值? function getGeo() {
我正在使用 android.media.MediaPlayer 在我的 Android 应用程序中播放歌曲。我的应用程序中的某些事件是在歌曲的某些部分触发的。要知道我现在在歌曲中的哪个位置,我使用 M
这个问题在这里已经有了答案: How do I return the response from an asynchronous call? (41 个回答) 关闭 7 年前。 我试图获取这些变量:
你能帮我解决这个问题吗?我有一个从 url 流式传输的搜索栏,我想在 textView 中显示 mediaplayer 的 currentTime,那么如何更新 textview 以每秒获取 curr
我的 cordova 版本是 6.3.1,我使用的是 cordova-plugin-geolocation 2.3.0。 在调用 navigator.geolocation.getCurrentPos
我尝试这个(为了在页面加载时获取当前用户位置) angular.module('ionicApp', ['ionic']) .controller('MyCtrl', function($scope)
我有这个 html 页面: Geolocation test navigator.geolocation.getCurrentPosition(functi
请教我如何解决 MediaPlayer 错误。我有 Mediaplayer、MediaController 和 listview。当我触摸列表时,歌曲会从 MediaController 开始,但是当
我遵循了 Igor Khrupin 关于使用 MediaPlayer 类在 Android 中流式传输 mp3 文件的教程:http://www.hrupin.com/2011/02/example-
我正在编写一个短音频持续时间(通常为 1-5 秒)的音频播放器,如下所示 //start media player mediaPlayer = new MediaPlayer(); mediaPlay
我正在使用一个 SeekBar 来显示音频文件的进度和搜索到某个时间。为了更新,我使用了一个 Runnable,它每隔一秒左右在 MediaPlayer 上调用 getCurrentPosition(
我是一名优秀的程序员,十分优秀!