2016-06-19 3 views
0

Я сделал музыкальный плеер usim MediaPlayer. Когда я закрываю приложение, песня продолжает играть, но когда я возобновляю, onCreate называется все начинается снова, и предыдущая песня также продолжает играть. Поэтому, если теперь я начинаю новую песню, обе песни воспроизводятся, хотя есть только одна переменная MediaPlayer. Почему вызов onCreate при повторном открытии приложения. Каким образом это предотвратить?Как предотвратить onCreate, когда приложение возобновлено?

EDIT: Обратите внимание, что файл xml также сбрасывается. PLUS Я потерял контроль над воспроизведением песен перед тем, как покинуть приложение.

public class MainActivity extends AppCompatActivity { 

SeekBar seekBar; 
MediaPlayer mediaPlayer; 
ImageView imageView; 
Handler handler = new Handler(); 
private String[] mAudioPath; 
private String[] mMusicList; 
static int i = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final Button ctrl = (Button) findViewById(R.id.play); 
    Button stop = (Button) findViewById(R.id.stop); 
    imageView = (ImageView) findViewById(R.id.imageView); 
    ListView listView = (ListView) findViewById(R.id.listView); 
    seekBar = (SeekBar) findViewById(R.id.seekBar); 
    mediaPlayer = MediaPlayer.create(MainActivity.this,R.raw.song); 
    seekBar.setMax(mediaPlayer.getDuration()); 

    //get tracks list 
    mMusicList = getAudioList(); 
    mAudioPath = getmAudioPath(); 

    ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMusicList); 
    listView.setAdapter(mAdapter); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      //Toast.makeText(MainActivity.this,mAudioPath[position],Toast.LENGTH_SHORT).show(); 
      try { 
       mediaPlayer.reset(); 
       mediaPlayer.setDataSource(mAudioPath[position]); 
       mediaPlayer.prepare(); 
       mediaPlayer.seekTo(0); 
       seekBar.setMax(mediaPlayer.getDuration()); 
       seekBar.setProgress(0); 
       ctrl.setText("║"); 
       try { 
        byte[] art; 
        MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); 
        mediaMetadataRetriever.setDataSource(mAudioPath[position]); 
        art = mediaMetadataRetriever.getEmbeddedPicture(); 
        Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length); 
        imageView.setImageBitmap(songImage); 
       } 
       catch (Exception e){ 
        byte[] art; 
        Bitmap songImage = BitmapFactory.decodeResource(getResources(), R.drawable.default_artwork); 
        imageView.getLayoutParams().width= ViewGroup.LayoutParams.MATCH_PARENT; 
        imageView.setImageBitmap(songImage); 
       } 
       mediaPlayer.start(); 
       handler.postDelayed(runnable,1); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
}); 

    //Get track data 
    MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); 
    mediaMetadataRetriever.setDataSource(MainActivity.this, Uri.parse("android.resource://in.swapsha96.playtime/"+R.raw.song)); 
    String artist; 
    artist = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); 
    if (artist == null) 
     artist = "Unknown Artist"; 
    try { 
     byte[] art; 
     art = mediaMetadataRetriever.getEmbeddedPicture(); 
     Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length); 
     imageView.setImageBitmap(songImage); 
    } 
    catch (Exception e){ 
     imageView.setBackgroundColor(Color.BLACK); 
    } 
    Toast.makeText(MainActivity.this,artist,Toast.LENGTH_SHORT).show(); 

    //Controls 
    ctrl.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(!mediaPlayer.isPlaying()) { 
       mediaPlayer.start(); 
       ctrl.setText("║"); 
      } 
      else { 
       mediaPlayer.pause(); 
       ctrl.setText("►"); 
      } 
      seekBar.setProgress(mediaPlayer.getCurrentPosition()); 
      handler.postDelayed(runnable,1); 
     } 
    }); 

    stop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mediaPlayer.pause(); 
      mediaPlayer.seekTo(0); 
      ctrl.setText("►"); 
     } 
    }); 

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
      handler.removeCallbacks(runnable); 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      handler.removeCallbacks(runnable); 
      mediaPlayer.seekTo(seekBar.getProgress()); 
      handler.postDelayed(runnable,1); 
     } 
    }); 
} 

//update seekBar 
Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     seekBar.setProgress(mediaPlayer.getCurrentPosition()); 
     handler.postDelayed(this,1); 
    } 
}; 
private String[] getAudioList() { 
    final Cursor mCursor = getContentResolver().query(
      MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA }, null, null, 
      "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC"); 

    int count = mCursor.getCount(); 

    String[] songs = new String[count]; 
    String[] mAudioPath = new String[count]; 
    int i = 0; 
    if (mCursor.moveToFirst()) { 
     do { 
      songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); 
      mAudioPath[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
      i++; 
     } while (mCursor.moveToNext()); 
    } 

    mCursor.close(); 

    return songs; 
}private String[] getmAudioPath() { 
    final Cursor mCursor = getContentResolver().query(
      MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
      new String[] { MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA }, null, null, 
      "LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC"); 

    int count = mCursor.getCount(); 

    String[] songs = new String[count]; 
    String[] path = new String[count]; 
    int i = 0; 
    if (mCursor.moveToFirst()) { 
     do { 
      songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)); 
      path[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
      i++; 
     } while (mCursor.moveToNext()); 
    } 

    mCursor.close(); 

    return path; 
} 
} 
+0

Вам нужно предоставить дополнительную информацию. О каком 'onCreate()' вы говорите? – Karakuri

+0

onCreate inside MainActivity.java –

ответ

0

В вашем коде вы не проверяете, играл ли медиаплеер каждый раз, когда вы выбираете новую песню.

if(mediaPlayer.isPlaying()) 
    {mediaplyer.stop()} 

необходимо остановить его, а затем снова сбросить. попробуйте также установить режим запуска в файле манифеста тега activitg как singleTask.

<activity 
     android:name=".MainActivity" 
     android:launchMode="singleTask"> 

Мой совет для вас, если вы хотите, чтобы вы выбрались из всего этого, это использовать связанный сервис. Это поможет вам управлять состояниями медиапланера и будет работать в фоновом режиме. Этот отличный tutorial может помочь.

+0

Это должен быть комментарий, а не ответ. – Karakuri

+0

Мне нужно еще 4 балла, поэтому я мог бы прокомментировать. В любом случае, если он даст более подробную информацию, я отредактирую его и отвечу. –

+0

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

0

Как вы знаете: onCreate(), onStart() и onResume() будет вызываться при запуске Activity.So, чтобы избежать onCreate отзыва, вы можете использовать логическое значение в методе onCreate, например isActivityReopened, который установлен в ложь, то значение ИСТИНА при первом использовании onCreate. Вот пример, который вы можете вдохновить от него:

@Override 
public void onCreate(Bundle bundle) { 
super.onCreate(bundle); 
// Other stuff 

if (!isActivityReopened) { 
    // Run what do you want to do only once. 

    // To avoid onCreate() if it will be called a second time, 
    // so put the boolean to true 
    isActivityReopened = true; 
} 
}