Perdendo ‘MediaPlayer’ (& outras variables) quando o dispositivo é girado

Estou criando um player de música para Android e está funcionando principalmente. O problema é que quando eu ligo o dispositivo horizontalmente eu perco todas as variables ​​da Activity (o que faz sentido porque é destruído e recriado).

Eu tentei usar pacotes para armazenar o estado do player com onSaveInstanceState e onRestoreInstanceState, mas ainda não consigo acessar o media player. Existe uma maneira de passar objects como o MediaPlayer em pacotes? Eu deveria estar usando um database?

obrigado

Você deve usar um Serviço para fornecer resources de reprodução de áudio “em segundo plano”, permitindo que o usuário alterne entre atividades ou Gire o dispositivo sem interromper a reprodução.

Confira android_packages_apps_Music que é opensource por CM no github, ele usa MediaPlaybackService estende o serviço para fazer isso, checkout MediaPlaybackService.java

Para objects que você não pode passar por um pacote, sugiro que use o SharedPreference simples para armazenar objects. Aqui você tem uma implementação simples:

public class Data { private SharedPreferences preferences; private int test; public Data (Context context) { preferences = context.getSharedPreferences("Data", 0); test = preferences.getInt("test", 0); } public int getTest() { return test; } public void setTest(int input) { this.test = input; SharedPreferences.Editor editor = preferences.edit(); editor.putInt("Test", input); editor.commit(); } } 

Você tem apenas que inicializar a variável no onCreate ():

Dados mydata = novos dados (este);

E você pode usar set / get com mydata para armazenar / recuperar seus dados persistentes.

Edit: Talvez não seja adequado para objects MediaPlayer, mas para outros tipos clássicos (int, string, boolean …).

Ambos os methods abaixo permitiriam que você mantivesse seu object mediaplayer por meio da rotação, mas nenhum deles usaria pacotes configuráveis.

  • Você poderia persistir seu media player usando onRetainNonConfigurationInstance() para salvar a variável e getLastNonConfigurationInstance() para recuperá-lo após a rotação, mas esse método não é necessariamente o melhor, pois nem sempre é chamado

    -Veja este post para mais informações https://stackoverflow.com/a/3916068/655822

  • Ou você pode persistir no seu media player estendendo sua class de aplicativos e armazenando-a lá

    abaixo da informação copiada da resposta SO vinculada com a finalidade de tornar esta resposta mais rápida de ler

    Você pode passar dados em um Global Singleton se for muito usado.

     public class YourApplication extends Application { public SomeDataClass data = new SomeDataClass(); } 

    Em seguida, chame-o em qualquer atividade por:

     YourApplication appState = ((YourApplication)this.getApplication()); appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here. 

    -Veja este post para mais informações sobre isso https://stackoverflow.com/a/4208947/655822

Outra maneira seria:

Em seu AndroidManifest.xml, encontre sua input para sua atividade e adicione o seguinte atributo e valor:

 android:configChanges="orientation|screenSize" 

Isso impedirá que sua atividade seja destruída e recriada na orientação.