2015-09-26 5 views
1

Я пытаюсь сделать круговой прогресс MediaPlayer, так что это неопределенный, пока он готовит и устанавливает прогресс во время игры.ProgressBar заблокирован во время воспроизведения MediaPlayer

Я пробовал много способов, но это мой последний: я обновляю панель на AsyncTask<Object, Object, Object>.

Класс я использую CircularProgressView, но я пытался поменять на ProgressBar и поведение является же:

public void startPlaying(final Audio audio, final CircularProgressView progress_view) { 

    if (!isPLAYING) { 
     progress_view.setIndeterminate(true); 
     progress_view.setVisibility(View.VISIBLE); 
     progress_view.startAnimation(); 
     isPLAYING = true; 
     audioPlaying = audio; 
     mp = new MediaPlayer(); 

     new AsyncTask<Object, Object, Object>() { 
      @Override 
      protected Object doInBackground(Object... objects) { 
       try { 
        mp.prepare(); 
        publishProgress((int)-1); 

        mediaFileLengthInMilliseconds = mp.getDuration(); 
        mp.start(); 

        while (mp != null && mp.isPlaying()) { 
         Thread.sleep(100); 
         publishProgress((int) (mp.getCurrentPosition())); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       return null; 
      } 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       try { 
        mp.setDataSource(audio.getFile().getUrl()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        @Override 
        public void onCompletion(MediaPlayer mediaPlayer) { 
         stopPlaying(); 
         publishProgress((int)-2); 
        } 
       }); 
      } 

      @Override 
      protected void onProgressUpdate(Object... values) { 
       super.onProgressUpdate(values); 
       int value = (int)values[0]; 
       if (value == -1) { 
        progress_view.setIndeterminate(false); 
        progress_view.setMaxProgress(mediaFileLengthInMilliseconds); 
       } else if (value == -2) { 
        progress_view.setVisibility(View.GONE); 
       } else { 
        progress_view.setProgress((int) values[0]); 
        System.out.println("setting: " + values[0]); 
       } 
      } 

      @Override 
      protected void onPostExecute(Object o) { 
       super.onPostExecute(o); 
      } 
     }.execute(); 

    } else { 
     isPLAYING = false; 
     stopPlaying(); 
    } 
} 

на отладку, то ProgressBar или CircularProgressView.setProgress() вызывается во время аудио но он остается заблокированным в indeterminate, но также вызывается progress_view.setIndeterminate(false), и он не становится неопределенным.

Когда звук заканчивается, ProgressBar или CircularProgressView получает 100% прогресс.

Любой ключ?

спасибо, что заранее.


EDIT:

, как предложил @Blackbelt, я должен был назвать mediaFileLengthInMilliseconds = mp.getDuration(); до того publishProgress((int)-1);

но теперь это поведение:

https://drive.google.com/file/d/0B-V0KHNRjbE_b3hkbkwtTXhIeTg/view?usp=sharing


EDIT 2: Журнал mp.getDuration() и mp.getCurrentPosition():

http://pastebin.com/g93V5X9F

или, возможно, это более ясно:

http://pastebin.com/kYm01Gpg

называется по этой части:

  @Override 
      protected void onProgressUpdate(Object... values) { 
       super.onProgressUpdate(values); 
       int value = (int)values[0]; 
       if (value == -1) { 
        progress_view.setIndeterminate(false); 
        progress_view.setMaxProgress(mediaFileLengthInMilliseconds); 
        Log.i("Stackoverflow:", "setMaxProgress to " + mediaFileLengthInMilliseconds); 
       } else if (value == -2) { 
        progress_view.setVisibility(View.GONE); 
       } else { 
        progress_view.setProgress((int) values[0]); 
        Log.i("Stackoverflow:", "setProgress to " + (int)values[0]); 

       } 
      } 

EDIT 3: Я добавляю новый код, закомментировав функции setIndeterminate(boolean) и обменивать в ProgressBar:

XML:

<ProgressBar 
     android:id="@+id/progress_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:indeterminate="false" 
     android:progress="40" 
     android:visibility="gone" 
     android:layout_alignTop="@+id/play_button" 
     android:layout_alignLeft="@+id/play_button" 
     android:layout_alignStart="@+id/play_button" 
     android:layout_alignRight="@+id/play_button" 
     android:layout_alignEnd="@+id/play_button" 
     android:layout_alignBottom="@+id/play_button" /> 

Java:

public void startPlaying(final Audio audio, final ProgressBar progress_view) { 

    if (!isPLAYING) { 
     Log.i("Stackoverflow", "startPlaying called"); 
     audio.put("times_listened", audio.getTimes_Listened() + 1); 
     audio.saveEventually(); 

     progress_view.setVisibility(View.VISIBLE); 
     isPLAYING = true; 
     audioPlaying = audio; 
     mp = new MediaPlayer(); 

     new AsyncTask<Object, Object, Object>() { 
      @Override 
      protected Object doInBackground(Object... objects) { 
       try { 
        mp.prepare(); 
        mediaFileLengthInMilliseconds = mp.getDuration(); 
        publishProgress((int)-1); 


        mp.start(); 

        while (mp != null && mp.isPlaying()) { 
         Thread.sleep(100); 
         publishProgress((int) (mp.getCurrentPosition())); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       return null; 
      } 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       try { 
        mp.setDataSource(audio.getFile().getUrl()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
        @Override 
        public void onCompletion(MediaPlayer mediaPlayer) { 
         stopPlaying(); 
         publishProgress((int)-2); 
        } 
       }); 
      } 

      @Override 
      protected void onProgressUpdate(Object... values) { 
       super.onProgressUpdate(values); 
       int value = (int)values[0]; 
       if (value == -1) { 
        progress_view.setMax(mediaFileLengthInMilliseconds); 
        Log.i("Stackoverflow:", "setMaxProgress to " + mediaFileLengthInMilliseconds); 
       } else if (value == -2) { 
        progress_view.setVisibility(View.GONE); 
       } else { 
        progress_view.setProgress((int) values[0]); 
        Log.i("Stackoverflow:", "setProgress to " + (int)values[0]); 

        System.out.println("setting: " + values[0]); 
       } 
      } 

      @Override 
      protected void onPostExecute(Object o) { 
       super.onPostExecute(o); 
      } 
     }.execute(); 

    } else { 
     isPLAYING = false; 
     stopPlaying(); 
    } 
} 

ED IT 4:

Я звоню progress_view.isDeterminate(), и он возвращает меня true каждый раз. Поэтому я решил сделать при изменении хода:

@Override 
      protected void onProgressUpdate(Object... values) { 
       super.onProgressUpdate(values); 
       int value = (int)values[0]; 
       if (value == -1) { 
        progress_view.setMax(mediaFileLengthInMilliseconds); 
        Log.i("Stackoverflow:", "setMaxProgress to " + mediaFileLengthInMilliseconds); 
       } else if (value == -2) { 
        progress_view.setVisibility(View.GONE); 
       } else { 
        if (progress_view.isIndeterminate()) // LOOK AT THIS 
         progress_view.setIndeterminate(false); 
        progress_view.setProgress((int) values[0]); 
        Log.i("Stackoverflow:", "setProgress to " + (int) values[0]); 
        Log.i("Stackoverflow", "Indeterminate state: " + progress_view.isIndeterminate()); 

        System.out.println("setting: " + values[0]); 
       } 
      } 

и выход всегда:

Неопределенное состояние: истинный

* ПОЧЕМУ? *: '(

ответ

1

Вероятно, вы хотите позвонить mediaFileLengthInMilliseconds = mp.getDuration(); перед вызовом publishProgress((int)-1);, а не после, или не использовать этот элемент на всех, так как вы сохраняете уже MediaPlayer в качестве члена, вы можете запросить непосредственно его

Edit.

Чтобы устранить проблему в вашем видео, вы должны использовать следующий стиль: style="@android:style/Widget.ProgressBar.Horizontal.С круговой ProgressBar, то setIndetermiate флаг игнорируется

+0

Привет, поведение изменилось, но по-прежнему не работает, это то, как он работает: https://drive.google.com/file/d/0B- V0KHNRjbE_b3hkbkwtTXhIeTg/view? Usp = sharing –

+0

Почему у вас есть 'setOnCompletionListener' в onPreExecute? – Blackbelt

+0

Где я должен установить его? это как установить что-то, чтобы заставить его работать в конце –

Смежные вопросы