2017-12-19 6 views
-1

Ich habe eine Musikstream-App erstellt, die die Daten aus der Firebase holt. Aber Problem ist, dass, wenn ich ein Lied spiele und zur Hauptaktivität gehe, dann App hat Nachricht angehalten wurde, Anzeige und APP nah kommen. Wenn ich einen Song aus der Liste "View" (Ansicht) und "Back" (Zurück) abspiele, wird die App gestoppt. Was ich tun kann, bitte sag es mir. meinen CodeMeine App wurde gestoppt, als ich zurück gehe

public class ViewUploadsActivity extends AppCompatActivity implements MediaPlayer.OnBufferingUpdateListener,View.OnTouchListener 
     ,MediaPlayer.OnCompletionListener{ 

//the listview 
ListView listView; 
    private SeekBar seekBarProgress; 
    private int mediaFileLengthInMilliseconds; 
    private final Handler handler = new Handler(); 
    CustomArrayAdapter adapter; 
    //database reference to get uploads data 
    DatabaseReference mDatabaseReference; 

//list to store uploads data 
    List<Upload> uploadList = new ArrayList<>(); 
    private TextView mSelectedTrackTitle,selected_track_ar; 
    private ImageView mSelectedTrackImage; 
    private MediaPlayer mMediaPlayer =new MediaPlayer(); 
    private ImageView mPlayerControl; 

    TextView length; 

     @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_upload); 
    listView = (ListView) findViewById(R.id.listView); 
    //status = (TextView) findViewById(R.id.status); 

    seekBarProgress = (SeekBar)findViewById(R.id.length); 

    listView.setStackFromBottom(true); 

    mMediaPlayer = new MediaPlayer(); 
    mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      togglePlayPause(); 
     } 
    }); 

    mSelectedTrackTitle(TextView)findViewById(R.id.selected_track_title); 
    mSelectedTrackImage = 
      (ImageView)findViewById(R.id.selected_track_image); 
    mPlayerControl = (ImageView)findViewById(R.id.player_control); 
    selected_track_ar=(TextView)findViewById(R.id.selected_track_ar); 
     mPlayerControl.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      togglePlayPause(); 
     } 
      }); 
      get(); 
      //getting the database reference 
      mDatabaseReference = FirebaseDatabase.getInstance(). 
       getReference(Constants.DATABASE_PATH_UPLOADS); 

    //retrieving upload data from firebase database 
     mDatabaseReference.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       Upload upload = postSnapshot.getValue(Upload.class); 
       uploadList.add(upload); 
      } 

       adapter = new CustomArrayAdapter(getApplicationContext(), 
         (ArrayList<Upload>) uploadList); 
      listView.setAdapter(adapter); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
     }); 

     } 
     @Override 
     protected void onDestroy() { 
      super.onDestroy(); 
    if (mMediaPlayer != null) { 
     if (mMediaPlayer.isPlaying()) { 
      mMediaPlayer.stop(); 
     } 
     mMediaPlayer.release(); 
     mMediaPlayer = null; 
    } 
    } 
    private void togglePlayPause() { 
    if (mMediaPlayer.isPlaying()) { 
     mMediaPlayer.pause(); 
     mPlayerControl.setImageResource(R.drawable.ic_play); 
    } else if(!mMediaPlayer.isPlaying()){ 
     mMediaPlayer.start(); 
     mPlayerControl.setImageResource(R.drawable.ic_pause); 
     mediaFileLengthInMilliseconds = mMediaPlayer.getDuration(); 
     primarySeekBarProgressUpdater(); 
     mSelectedTrackImage.setImageResource(R.drawable.images); 
    } 
    } 
    public void get() 
    { 
    seekBarProgress.setMax(99); // It means 100% .0-99 
    seekBarProgress.setOnTouchListener(this); 
    mMediaPlayer.setOnBufferingUpdateListener(this); 
    mMediaPlayer.setOnCompletionListener(this); 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int 
      i, long l) { 
      //getting the upload 
      Upload upload = uploadList.get(i); 
      mSelectedTrackTitle.setText(upload.getName()); 
      selected_track_ar.setText(upload.getAr()); 
      if (mMediaPlayer.isPlaying()) { 
       mMediaPlayer.stop(); 
       mMediaPlayer.reset(); 
       seekBarProgress.setProgress(0); 
      } 

      try { 
       mMediaPlayer.setDataSource(upload.getUrl()); 
       mMediaPlayer.prepare(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
         } 
     }); 



    } 
     private void primarySeekBarProgressUpdater() { 
    seekBarProgress.setProgress((int 
    (((float)mMediaPlayer.getCurrentPosition() 
     /mediaFileLengthInMilliseconds)*100)); 
     // This math construction give a percentage of "was playing"/"song 
    length" 
    if (mMediaPlayer.isPlaying()) { 
     Runnable notification = new Runnable() { 
      public void run() { 
       primarySeekBarProgressUpdater(); 
      } 
     }; 
     handler.postDelayed(notification,1000); 
    } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    if(v.getId() == R.id.length){ 
     /** Seekbar onTouch event handler. Method which seeks MediaPlayer to 
    seekBar primary progress position*/ 
     if(mMediaPlayer.isPlaying()){ 
      SeekBar sb = (SeekBar)v; 
      int playPositionInMillisecconds = (mediaFileLengthInMilliseconds 
     /100) * sb.getProgress(); 
      mMediaPlayer.seekTo(playPositionInMillisecconds); 
     } 
     } 
     return false; 
    } 

    @Override 
    public void onBufferingUpdate(MediaPlayer mp, int percent) { 

    seekBarProgress.setSecondaryProgress(percent); 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
    mPlayerControl.setImageResource(R.drawable.ic_play); 
    } 

} 

Logcat

Unrecognized GLES max version string in extensions: 
    ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_dma_v1 
     12-19 12:28:13.753 1377-3347/? E/OMXNodeInstance: 
      setConfig(5610023:google.mp3.decoder, 
     ConfigPriority(0x6f800002)) ERROR: Undefined(0x80001001) 
      12-19 12:28:31.338 5777-5777/com.example.admin.firebsaseuploadd 
     E/AndroidRuntime: FATAL EXCEPTION: main 

     Process: com.example.admin.firebsaseuploadd, PID: 5777 

    java.lang.NullPointerException: Attempt to invoke virtual method 'int 
     android.media.MediaPlayer.getCurrentPosition()' on a null object 
     reference 

    at 

      com.example.admin.firebsaseuploadd.ViewUploadsActivity. 
     primarySeekBarProgressUp       
     dater(ViewUploadsActivity.java:245) 

     at 
       com.example.admin.firebsaseuploadd.ViewUploadsActivity. 
      access$500(ViewUploadsActivity.java:62) 

     at com.example.admin.firebsaseuploadd.ViewUploadsActivity$5. 
     run(ViewUploadsActivity.java:249) 

      at android.os.Handler.handleCallback(Handler.java:751) 

      at android.os.Handler.dispatchMessage(Handler.java:95) 

      at android.os.Looper.loop(Looper.java:154) 

      at android.app.ActivityThread.main(ActivityThread.java:6119) 

      at java.lang.reflect.Method.invoke(Native Method) 

       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller. 
     run(ZygoteInit.java:886) 

    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
12-19 12:28:31.974 1311-1311/? E/EGL_emulation: tid 1311: egl 
CreateSyncKHR(1881): error 0x3004 (EGL_BAD_ATTRIBUTE) 
    12-19 12:28:32.533 1372-3348/? E/AudioFlinger: not enough memory for 
    AudioTrack size=131296 
     12-19 12:28:32.533 1372-3348/? E/AudioFlinger: createRecordTrack_l() 
    initCheck failed -12; no control block? 
     12-19 12:28:32.534 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord: 
     AudioFlinger could not create record track, status: -12 
    12-19 12:28:32.564 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: 
    Error creating AudioRecord instance: initialization check failed with 
    status -12. 
    12-19 12:28:32.564 2522- 
    5797/com.google.android.googlequicksearchbox:search 
    E/android.media.AudioRecord: Error code -20 when initializing native 
    AudioRecord object. 
    12-19 12:28:32.595 2522- 
    5797/com.google.android.googlequicksearchbox:search E/ActivityThread: 
    Failed to find provider info for 
    com.google.android.apps.gsa.testing.ui.audio.recorded 
    12-19 12:28:37.712 1372-1794/? E/AudioFlinger: not enough memory for 
AudioTrack size=131296 
    12-19 12:28:37.714 1372-1794/? E/AudioFlinger: createRecordTrack_l() 
    initCheck failed -12; no control block? 
    12-19 12:28:37.715 2522- 
5797/com.google.android.googlequicksearchbox:search E/AudioRecord: 
    AudioFlinger could not create record track, status: -12 
     12-19 12:28:37.728 2522- 
     5797/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: 
     Error creating AudioRecord instance: initialization check failed 
     with status -12. 
    12-19 12:28:37.728 2522-          
    5797/com.google.android.googlequicksearchbox:search 
    E/android.media.AudioRecord: Error code -20 when initializing native 
    AudioRecord object. 

    12-19 12:28:37.729 2522- 
    5797/com.google.android.googlequicksearchbox:search E/ActivityThread: 
    Failed to find provider info for                 
    com.google.android.apps.gsa.testing.ui.audio.recorded 
    12-19 12:28:42.882 1372-1443/? E/AudioFlinger: not enough memory for          
    AudioTrack size=131296 

    12-19 12:28:42.883 1372-1443/? E/AudioFlinger: createRecordTrack_l() 
    initCheck failed -12; no control block? 

    12-19 12:28:42.883 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord: 
    AudioFlinger could not create record track, status: -12 

    12-19 12:28:42.916 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: 
    Error creating AudioRecord instance: initialization check failed with 
    status -12. 

    12-19 12:28:42.917 2522- 
    5797/com.google.android.googlequicksearchbox:search 
    E/android.media.AudioRecord: Error code -20 when initializing native 
    AudioRecord object. 

    12-19 12:28:42.929 2522- 
    5797/com.google.android.googlequicksearchbox:search E/ActivityThread: 
    Failed to find provider info for 
    com.google.android.apps.gsa.testing.ui.audio.recorded 

    12-19 12:28:48.085 1372-1793/? E/AudioFlinger: not enough memory for 
    AudioTrack size=131296 

    12-19 12:28:48.136 1372-1793/? E/AudioFlinger: createRecordTrack_l() 
    initCheck failed -12; no control block? 

    12-19 12:28:48.151 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord: 
    AudioFlinger could not create record track, status: -12 

    12-19 12:28:48.248 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: 
    Error creating AudioRecord instance: initialization check failed with 
    status -12. 

    12-19 12:28:48.249 2522- 
    5797/com.google.android.googlequicksearchbox:search 
    E/android.media.AudioRecord: Error code -20 when initializing native 
    AudioRecord object. 

    12-19 12:28:48.251 2522- 
    5797/com.google.android.googlequicksearchbox:search E/ActivityThread: 
    Failed to find provider info for 
    com.google.android.apps.gsa.testing.ui.audio.recorded 

    12-19 12:28:53.439 1372-1793/? E/AudioFlinger: not enough memory for 
    AudioTrack size=131296 

    12-19 12:28:53.439 1372-1793/? E/AudioFlinger: createRecordTrack_l() 
    initCheck failed -12; no control block? 

    12-19 12:28:53.443 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord: 
    AudioFlinger could not create record track, status: -12 

    12-19 12:28:53.455 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: 
    Error creating AudioRecord instance: initialization check failed with 
    status -12. 

    12-19 12:28:53.456 2522- 
    5797/com.google.android.googlequicksearchbox:search 
    E/android.media.AudioRecord: Error code -20 when initializing native 
    AudioRecord object. 

    12-19 12:28:53.457 2522- 
    5797/com.google.android.googlequicksearchbox:search E/ActivityThread: 
    Failed to find provider info for 
    com.google.android.apps.gsa.testing.ui.audio.recorded 

    12-19 12:28:58.551 1372-1793/? E/AudioFlinger: not enough memory for 
    AudioTrack size=131296 

    12-19 12:28:58.552 1372-1793/? E/AudioFlinger: createRecordTrack_l() 
    initCheck failed -12; no control block? 

    12-19 12:28:58.552 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord: 
    AudioFlinger could not create record track, status: -12 

    12-19 12:28:58.573 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: 
    Error creating AudioRecord instance: initialization check failed with 
    status -12. 

    12-19 12:28:58.574 2522- 
    5797/com.google.android.googlequicksearchbox:search 
    E/android.media.AudioRecord: Error code -20 when initializing native 
    AudioRecord 
    object. 

    12-19 12:28:58.577 2522- 
    5797/com.google.android.googlequicksearchbox:search E/ActivityThread: 
    Failed to find provider info for 
    com.google.android.apps.gsa.testing.ui.audio.recorded 

    12-19 12:29:03.652 1372-1794/? E/AudioFlinger: not enough memory for 
    AudioTrack size=131296 

    12-19 12:29:03.652 1372-1794/? E/AudioFlinger: createRecordTrack_l() 
    initCheck failed -12; no control block? 
    12-19 12:29:03.652 2522-           
     5797/com.google.android.googlequicksearchbox:search E/AudioRecord: 
     AudioFlinger    could not create record track, status:-12 

    12-19 12:29:03.678 2522- 
    5797/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: 
    Error creating AudioRecord instance: initialization check failed with 
    status -12. 

    12-19 12:29:03.678 2522- 
    5797/com.google.android.googlequicksearchbox:search 
    E/android.media.AudioRecord: Error code -20 when initializing native 
    AudioRecord object. 

    12-19 12:29:03.679 2522- 
    5797/com.google.android.googlequicksearchbox:search E/ActivityThread: 
    Failed to find provider info for 
    com.google.android.apps.gsa.testing.ui.audio.recorded 
12-19 12:29:08.775 1372-1443/? E/AudioFlinger: not enough memory for 
    AudioTrack 
size=131296 
12-19 12:29:08.775 1372-1443/? E/AudioFlinger: createRecordTrack_l() 
    initCheck 
     failed -12; no control block? 
    12-19 12:29:08.778 2522-5 
    797/com.google.android.googlequicksearchbox:search 
E/AudioRecord: AudioFlinger could not create record track, status: -12 
12-19 12:29:08.804 2522-5797/com.google.android.googlequicksearchbox:search 

    E/AudioRecord-JNI: Error creating AudioRecord instance: initialization 
    check failed with status -12. 
    12-19 12:29:08.805 2522- 
     5797/com.google.android.googlequicksearchbox:search 
    E/android.media.AudioRecord: Error code -20 when initializing native 
    AudioRecord object. 
    12-19 12:29:08.809 2522- 
5797/com.google.android.googlequicksearchbox:search 

    E/ActivityThread: Failed to find provider info for 
    com.google.android.apps.gsa.testing.ui.audio.record ed 
+0

teilen logcat Fehler –

+1

deutlich in Ihrem 'logcat' geschrieben, dass Es ist 'NullPointerException'. Sieh dir das an. 'java.lang.NullPointerException: Versuch virtuelle Methode aufzurufen int android.media.MediaPlayer.getCurrentPosition() auf einem Null-Objekt Referenz bei com.example.admin.firebsaseuploadd.ViewUploadsActivity. primarySeekBarProgressUp dater (ViewUploadsActivity.java:245) 'so debuggen Sie Ihren Code und versuchen, Exception zu lösen. – Dharmishtha

+0

vollständige Aktivität Lebenszyklus kann es Ihnen helfen onPause() onResume() –

Antwort

0

Wenn ich Ihre logcat lesen, Ihr das Problem NullPointerException bei 'int android.media.MediaPlayer.getCurrentPosition()'. Wenn Sie die MainActivity zurückgehen, wird die ViewUploadsActivity#onDestroy() aufgerufen. Diese Methode löscht Ihre mMediaPlayer und setzt sie auf null. Sie verfügen jedoch über einen Benachrichtigungshandler, der immer im Laufe der Zeit ausgeführt wird. Beim letzten Lauf ruft dieser Läufer iewUploadsActivity#primarySeekBarProgressUpdater() an, die auch seekBarProgress.setProgress((int (((float)mMediaPlayer.getCurrentPosition())) anrufen.

Lösung:

  1. prüfen null vor Aufruf mMediaPlayer.getCurrentPosition()

    if (mMediaPlayer != null) { 
        int position = mMediaPlayer.getCurrentPosition(); 
        seekBarProgress.setProgress(position); 
    } 
    
  2. Handler Stopp bei onDestroy()

Verwandte Themen