2016-12-12 8 views
0

Я делаю приложение для музыкального плеера для Android, и у меня проблемы с сохранением музыки, когда я меняю ориентацию телефона.Сохранение музыки при изменении ориентации

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(); 
     } 
    } 

} 

Я попытался с

android:configChanges="orientation|screenSize" 

в манифесте и она работает, но только для 1-го изменения от вертикали к горизонтальной ориентации. Когда я снова переключаюсь с горизонтального на вертикальный, тот же самый сон начинается с начала, пока старый все еще играет, поэтому в тот же момент у меня есть 2 песни. Может ли кто-нибудь помочь мне с этим?

ответ

0

сохранить изменения конфигурации и добавить переопределение к ONCONFIG ...

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
} 

когда ориентация меняется OnCreate вызывается по умолчанию, вы должны переопределить его как в этом примере, или, возможно, использовать в качестве одиночки медиапланер, поэтому он не будет создавать два из них

+0

Я попытался переопределить его, как вы писали, но он все еще начинает новую песню, когда я перехожу от горизонтальной к вертикальной. – ChrisB

+0

попробуйте использовать флаг, чтобы он не возвращал make mediaplayer глобальную переменную и создавал новый экземпляр, только если он равен нулю – yanivtwin

+0

Я пробовал 'if (player == null) player = new MediaPlayer();' но он все еще начинает новую песню. – ChrisB

0

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

0

При ориентировании устройства оно перерисовывает ваши макеты, и поэтому активность перезапускается (вызовы onC onCreate()). Вы можете сохранить свой экземпляр с переопределения этого метода:

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

и восстановить экземпляр с переопределения этого метода:

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

Я создал источник в GitHub по этой теме, сохранение и восстановление экземпляров. Возможно, это поможет вам в некоторых обстоятельствах. Orientation Mode

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