2016-12-12 11 views
0

Ich mache Musik Player App für Android und ich habe Probleme mit der Musikwiedergabe, während ich die Ausrichtung des Telefons ändern.Halten Sie Musik spielen, während Sie die Orientierung ändern

package nori.beta.musicplayer; 

import android.app.Activity; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.graphics.Color; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 
import android.widget.SeekBar; 
import android.widget.TextView; 

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Random; 

import nori.beta.musicplayer.Class.BlurBuilder; 
import nori.beta.musicplayer.Fragment.Playlist; 
import nori.beta.musicplayer.Fragment.Utilities; 

public class MainActivity extends Activity { 

    private ImageView bg;  // blured backgroud of size of screen 
    private ImageView cover; // small image in center of activity that plays song 
    private BlurBuilder blured; // class to blur image for background 

    private SeekBar 
      progressBar;   // Creating seekbar that show progress of song and allow us scroll and rewind song 
    private ImageButton 
      play_pause_stopButton; //on click do 1.play/2.paues/3.stop for all change icon 
    private MediaPlayer player; // Player that play music 
    private Handler mHandler = new Handler(); //Handler that help with refreshing progressBar 
    private Utilities utils; //Change seconds into min + sec 
    ArrayList<File> mySongs; // list of music file 
    ArrayList<Song> songsInfo; //list of music file with extract information about them 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // init all GUI staff 
     initGUI(); 
     setButtons(); 


    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // init Database and rest of gui staff that need database 
     // Here have u data of all file and chosen song and can u make to play song 
    } 

    private void initGUI() { 
     // Image Part 
     bg = (ImageView) findViewById(R.id.main_background); 
     cover = (ImageView) findViewById(R.id.cover_image); 
     blured = new BlurBuilder(); 

     //Buttons 
     play_pause_stopButton = (ImageButton) findViewById(R.id.play_pause_stop_button); 
     progressBar = (SeekBar) findViewById(R.id.progressBar); 
     player = new MediaPlayer(); 
     utils = new Utilities(); 
     mySongs = findSongs(Environment.getExternalStorageDirectory()); 
     songsInfo = new ArrayList<Song>(); 
     for (File f : mySongs) { 
      songsInfo.add(new Song(f)); 
     } 
     //progressBar.setOnSeekBarChangeListener(this); 

    } 

    private ArrayList<File> findSongs(File root) { 
     ArrayList<File> al = new ArrayList<File>(); 
     File[] files = root.listFiles(); 

     /** 
     * findSongs Search for music file in memory 
     * 
     * for each file in memory 
     * 1.if is that file a folder , then take all file then give it in method findSongs 
     * and with requrency 
     * 2.Else if that file end with .mp3 or .wav ,then add to list 
     */ 

     for (File singleFile : files) { 
      if (singleFile.isDirectory() && !singleFile.isHidden()) { 
       al.addAll(findSongs(singleFile)); 
       //Log.e("findsongs","Folder"); 
      } else { 
       if (singleFile.getName().endsWith(".mp3") || singleFile.getName().endsWith(".wav")) { 
        al.add(singleFile); 
        Log.e("FileInfo.GetSong", singleFile.getName().toString()); 
       } 
      } 
     } 
     return al; 
    } 

    private void setButtons() { 
     play_pause_stopButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { //Play/Pause song button clicked 
       playSong(0); 
      } 
     }); 

     progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { //Using progress bar to scrolling song 

      @Override 
      public void onStopTrackingTouch(SeekBar progressBar) { 

      } 

      @Override 
      public void onStartTrackingTouch(SeekBar progressBar) { 
      } 

      @Override 
      public void onProgressChanged(SeekBar progressBar, int progress, boolean fromUser) { //When user move progress bar song go to moment that user choosed 
       if (player != null && fromUser) { 
        player.seekTo(progress * 1000); 
       } 
      } 
     }); 
     player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer player) { //When song ended playing 
       playSong(0); 
      } 
     }); 
    } 

    public void updateProgressBar() { 
     mHandler.postDelayed(mUpdateTimeTask, 100); //Updating progressBar every 100ms 
    } 

    private Runnable mUpdateTimeTask = new Runnable() { 
     public void run() { //Updating time of song and progressbar 
      long totalDuration = player.getDuration(); 
      long currentDuration = player.getCurrentPosition(); 

      // Updating progress bar 
      int mCurrentPosition = player.getCurrentPosition()/1000; 
      progressBar.setProgress(mCurrentPosition); 

      // Running this thread after 100 milliseconds 
      mHandler.postDelayed(this, 100); 

     } 
    }; 

    // set it in all changes of the privius songs <#-- Krzysiek --> 
    private void setBackground(int i) { 
     //setting the back image and cover image to the chosen song 
     if (songsInfo.get(i).getBackground() != null) { 
      bg.setImageBitmap(blured.blur(this, songsInfo.get(i).getBackground())); 
      cover.setImageBitmap(songsInfo.get(i).getBackground()); 
      Log.i("FileInfo.SetCover", "Set cover of " + songsInfo.get(i).getName()); 
     } 

    } 

    public void playSong(int index) { 
     try { 
      player.reset(); 
      player.setDataSource(songsInfo.get(index).getPath()); //Getting song with proper index from list 
      player.prepare(); 
      player.start(); //Playing prepared song 
      // Displaying Song title 
      String songTitle = songsInfo.get(index).getTitle(); 
      String songArtist = songsInfo.get(index).getArtist(); 

      setBackground(index); 
      // Changing Button Image to pause image 
      play_pause_stopButton.setImageResource(R.drawable.pause); 

      // set Progress bar values 
      progressBar.setProgress(0); 
      progressBar.setMax(player.getDuration()/1000); 

      // Updating progress bar 
      updateProgressBar(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Ich habe versucht, mit

android:configChanges="orientation|screenSize" 

in manifest und es funktioniert, aber nur für den 1. Wechsel von der vertikalen zur horizontalen Ausrichtung. Wenn ich wieder von horizontal auf vertikal wechsle, beginnt der gleiche Song mit dem Beginn, während der alte noch spielt, also habe ich 2 Songs im selben Moment gespielt. Kann mir jemand dabei helfen?

Antwort

0

die Konfigurationsänderungen halten und eine Überschreibung der onconfig hinzufügen ...

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
} 

, wenn die Ausrichtung ändert sich die oncreate standardmäßig aufgerufen wird, müssen Sie es wie in diesem Beispiel außer Kraft zu setzen oder vielleicht ein Singleton verwenden, wie ein Mediaplayer, so wird es nicht zwei von ihnen erstellen

+0

Ich habe versucht, es zu überschreiben, wie Sie geschrieben haben, aber es immer noch neue Song starten, wenn ich von horizontal zu vertikal wechseln. – ChrisB

+0

versuchen Sie es mit einem Flag, so dass es nicht den make mediaplayer wieder eine globale Variable und erstellen Sie eine neue Instanz von ihm nur wenn es Null ist – yanivtwin

+0

Ich habe versucht 'if (player == null) player = new MediaPlayer(); ' aber es beginnt immer noch ein neues Lied. – ChrisB

0

Es war nur dumm, aber ich mache nur Spieler statisch. Es half und jetzt erstellt es keine zusätzlichen Instanzen

0

Wenn Sie Ihr Gerät orientieren, ziehen Sie Ihre Layouts neu und deshalb Aktivität neu gestartet (Anrufe onC onCreate()).

@Override 
protected void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
} 

und Restore-Instanz mit Überschreiben dieser Methode:

@Override 
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
} 

Ich habe Quelle in Github zu diesem Thema, Speichern und Wiederherstellen von Instanzen Sie können Ihre Instanz mit Überschreiben dieser Methode speichern. Vielleicht hilft es dir unter Umständen. Orientation Mode

Verwandte Themen