Android: Как воспроизвести песню, когда выбран элемент списка - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть один просмотр списка для воспроизведения mp3-файлов медиа-файлов.Если я выбираю 1-ю песню для воспроизведения, она воспроизводится, но если я выбираю вторую или другую песню в списке, она снова воспроизводит 1-ю песню.Я хочу, чтобы, если я выберу вторую или любую другую песню из списка, они будут выбраны для воспроизведения. Пожалуйста, помогите мне решить эту проблему ... Спасибо заранее.Ниже мой код.Основная деятельность

public class MainActivity extends AppCompatActivity {

ListView mysonglistview;
String[] items;

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

    mysonglistview = (ListView) findViewById(R.id.songlistview);
    runtimepermission();



}

public void runtimepermission(){

    Dexter.withActivity(this)
            .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
            .withListener(new PermissionListener() {
                @Override
                public void onPermissionGranted(PermissionGrantedResponse response) {
                    display();

                }

                @Override
                public void onPermissionDenied(PermissionDeniedResponse response) {

                }

                @Override
                public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                    token.continuePermissionRequest();

                }
            }).check();

}

public ArrayList<File> findSong(File file){
    ArrayList<File> arrayList = new ArrayList<>();
    File[] files = file.listFiles();
    for (File singleFile: files){
        if (singleFile.isDirectory() && !singleFile.isHidden()){

            arrayList.addAll(findSong(singleFile));
        }
        else {
            if (singleFile.getName().endsWith(".mp3") ||
            singleFile.getName().endsWith(".wav")){

                arrayList.add(singleFile);


            }
        }


    }

    return arrayList;

}

void display(){
    final ArrayList<File> mySongs = findSong(Environment.getExternalStorageDirectory());
    items = new String[mySongs.size()];
    for (int i=0;i<mySongs.size();i++){

        items [i] = mySongs.get(i).getName().toString().replace(".mp3","").replace(".wav","");

    }

    ArrayAdapter<String> myadapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
    mysonglistview.setAdapter(myadapter);

    mysonglistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int i, long l) {

            String SongName = mysonglistview.getItemAtPosition(i).toString();

            startActivity(new Intent(getApplicationContext(), PlayerActivity.class)
                    .putExtra("songs", mySongs).putExtra("songname", SongName)
                    .putExtra("pos", 1));

        }
    });
}

}

Вот PlayerActivity.Java код

public class PlayerActivity extends AppCompatActivity {

Button btn_next, previous, pause;
TextView songTextlabel;
SeekBar songseekbar;

static MediaPlayer mymediaplayer;
int position;
String sname;
ArrayList<File> mySongs;
Thread updateseekbar;

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

    btn_next = (Button) findViewById(R.id.next);
    previous = (Button) findViewById(R.id.previous);
    pause = (Button) findViewById(R.id.pause);

    songTextlabel = (TextView) findViewById(R.id.songlabel);
    songseekbar = (SeekBar) findViewById(R.id.seekbar);


    getSupportActionBar().setTitle("Now Playing");
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);


    updateseekbar = new Thread() {
        @Override
        public void run() {

            int totalDuration = mymediaplayer.getDuration();
            int currentposition = 0;

            while (currentposition < totalDuration) {
                try {
                    sleep(500);
                    currentposition = mymediaplayer.getCurrentPosition();
                    songseekbar.setProgress(currentposition);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    };

    if (mymediaplayer != null) {
        mymediaplayer.stop();
        mymediaplayer.release();
    }

    Intent i = getIntent();
    Bundle bundle = i.getExtras();

    mySongs = (ArrayList) bundle.getParcelableArrayList("songs");
    sname = mySongs.get(position).getName().toString();

    String songName = i.getStringExtra("songname");

    songTextlabel.setText(songName);
    songTextlabel.setSelected(true);

    position = bundle.getInt("pos", 0);

    Uri u = Uri.parse(mySongs.get(position).toString());

    mymediaplayer = MediaPlayer.create(getApplicationContext(), u);

    mymediaplayer.start();
    songseekbar.setMax(mymediaplayer.getDuration());

    //seekbar color

    updateseekbar.start();
    songseekbar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.MULTIPLY);
    songseekbar.getThumb().setColorFilter(getResources().getColor(R.color.colorPrimary), PorterDuff.Mode.SRC_IN);


    songseekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

            mymediaplayer.seekTo(seekBar.getProgress());

        }
    });

    pause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            songseekbar.setMax(mymediaplayer.getDuration());
            if (mymediaplayer.isPlaying()) {
                pause.setBackgroundResource(R.drawable.icon_play);
                mymediaplayer.pause();
            } else {
                pause.setBackgroundResource(R.drawable.icon_pause);
                mymediaplayer.start();
            }

        }
    });

    btn_next.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            mymediaplayer.stop();
            mymediaplayer.release();
            position = ((position + 1) % mySongs.size());

            Uri u = Uri.parse(mySongs.get(position).toString());

            mymediaplayer = MediaPlayer.create(getApplicationContext(), u);

            sname = mySongs.get(position).getName().toString();
            songTextlabel.setText(sname);

            mymediaplayer.start();
        }
    });

    previous.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            mymediaplayer.stop();
            mymediaplayer.release();
            position = ((position - 1) < 0) ? (mySongs.size() - 1) : (position - 1);

            Uri u = Uri.parse(mySongs.get(position).toString());
            mymediaplayer = MediaPlayer.create(getApplicationContext(), u);

            sname = mySongs.get(position).getName().toString();
            songTextlabel.setText(sname);

            mymediaplayer.start();

        }
    });

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getItemId()== android.R.id.home){
        onBackPressed();
    }

    return super.onOptionsItemSelected(item);
}

}

1 Ответ

0 голосов
/ 03 декабря 2018

Здесь вы передаете жестко закодированный параметр

        startActivity(new Intent(getApplicationContext(), PlayerActivity.class)
                .putExtra("songs", mySongs).putExtra("songname", SongName)
                .putExtra("pos", 1)); // change 1 to i

И в PlayerActivity:

В начале класса вы объявляете переменную position

int position;

К этому времени вы объявили только int position (значение по умолчанию для объявленного int равно 0)

Позже в коде вы делаете это:

sname = mySongs.get (position) .getName (). ToString ();

position все еще 0 на данный момент, потому что он был объявлен только (причина, по которой вы всегда получаете первую песню).

После этого вы меняете значение position к чему бы то ни было передано через намерение

position = bundle.getInt ("pos", 0);

Чтобы получить то, что вы хотели, вы должны сделать

position = bundle.getInt ("pos", 0)

sname = mySongs.get (position) .getName (). ToString ();

И это все!

Справочник по умолчанию values: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

На заметке не передавайте большие объекты через намерения.Вы должны использовать намерения только для передачи таких вещей, как ID, а затем использовать этот ID при получении активности для извлечения всего, что вам нужно.

Редактировать: Попробуйте правильно отформатировать свой код, это должно дать вам большеответы в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...