2016-06-19 6 views
0

私は音楽プレーヤーでMediaPlayerを使用しました。私がアプリを閉じると、曲は再生され続けますが、再開すると、onCreateはすべてが再び開始され、前の曲も再生され続けます。だから、私が新しい曲を始めると、MediaPlayer変数が1つだけでも、両方の曲が再生されます。なぜアプリケーションが再オープンされたときに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 MainActivity.java –

答えて

0

コードでは、新しい曲を選択するたびにメディアプレーヤーが再生されているかどうかを確認していません。

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

これを停止してもう一度リセットする必要があります。 activitgタグのManifestファイルの起動モードをsingleTaskに設定してみてください。

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

あなたがこのすべてから抜け出すために私の助言をするのは、バインドされたサービスを使用することです。メディアプレイヤーの状態を管理するのに役立ち、バックグラウンドで実行し続けます。この偉大なtutorialが役に立ちます。

+0

これはコメントであり、答えではありません。 – Karakuri

+0

私はコメントすることができるように私は4ポイントがさらに必要です。とにかく彼がもっと詳細を与えるなら私はそれを編集し、彼に答えます。 –

+0

物事は私が戻って、アプリをクリックonCreateが実行され、すべてがリセットされ、まだ音楽がまだ再生されているためです。私のアプリケーションが他の音楽プレーヤーのように機能することを望んでいます。 –

0

ご存知のように:onCreate()onStart()onResume()はその後、trueに設定され、あなたがonCreateリコールを避けるためにActivity.Soを起動したとき、あなたはfalseに設定されている例isActivityReopenedのためのあなたのonCreate方法でブール値を使用することができますと呼ばれます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; 
} 
} 
関連する問題