ListView项目未在所选索引处播放音频

时间:2017-11-09 04:56:51

标签: android listview

当我点击每个单独的单元格时,它会在索引0处播放当前歌曲。 如何将当前字符串提取到ListView项目上的当前位置,然后播放它?

为了使它更清楚,这是一个代码的例子: enter image description here

感谢任何建议和帮助。

代码:

//
private static  final int my_permission = 1;
    ArrayList<String> arrayList;
    ListView listView;
    ArrayAdapter<String> adapter;
    MediaPlayer mediaPlayer = new MediaPlayer();
    Uri songUri;

    int songLocation;
    int songArtist;
    int songTitle;
    ////
    String currentLocation;
    String currentArtist;
    String currentTitle;
    //
    Cursor songCursor;

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

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED){
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                    Manifest.permission.READ_EXTERNAL_STORAGE))
            {
                 ActivityCompat.requestPermissions(MainActivity.this,
                         new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, my_permission);
            }
            else
            {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, my_permission);
            }
        }
        else
        {
            doStuff();
        }
    }

    public void doStuff() {
        listView = (ListView) findViewById(R.id.listView);
        arrayList = new ArrayList<>();
        getMusic();
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {

                Toast.makeText(getApplicationContext(), currentLocation.toString() + " ", Toast.LENGTH_SHORT).show();

                    mediaPlayer = MediaPlayer.create(MainActivity.this, Uri.parse(currentLocation.toString()));
                    mediaPlayer.start();
            }
        });
    }

    public void getMusic()
    {
        ContentResolver contentResolver = getContentResolver();
        songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        songCursor = contentResolver.query(songUri, null, null, null, null);

        if (songCursor != null && songCursor.moveToFirst())
        {
            songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
            songArtist = songCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
            songLocation = songCursor.getColumnIndex(MediaStore.Audio.Media.DATA);

            do {
                currentTitle = songCursor.getString(songTitle); //
                currentArtist = songCursor.getString(songArtist); //
                currentLocation = songCursor.getString(songLocation);
                arrayList.add("Title: " + currentTitle + "\n" + "Artist: " + currentArtist + "\n" + "Location: " + currentLocation);
            }
            while (songCursor.moveToNext());
            {

            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode){
            case my_permission:{

                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    if (ContextCompat.checkSelfPermission(MainActivity.this,
                            Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
                    {
                        Toast.makeText(this, "permission granted", Toast.LENGTH_LONG).show();
                        doStuff();
                    }
                }
                else
                {
                    Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();
                    finish();
                }
                return;
            }
        }
    }
}

} //

2 个答案:

答案 0 :(得分:0)

试试这个

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {

                String musicPath = listView.getItemAtPosition(position);

                Toast.makeText(getApplicationContext(), musicPath  + " ", Toast.LENGTH_SHORT).show();

                    mediaPlayer = MediaPlayer.create(MainActivity.this, Uri.parse(musicPath ));
                    mediaPlayer.start();
            }
        });

答案 1 :(得分:0)

您正在从ContntResolverCursor获取音乐路径,因此如果您的Cursor仅引用一行,您可以在读取数据之前调用moveToFirst()以确保您使用的是有效索引。当第一次创建Cursor并且索引为-1时,moveToFirst()和moveToNext()都具有相同的效果。

所以只需改变这个

 if (songCursor != null && songCursor.moveToFirst())
    {
        songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
        songArtist = songCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
        songLocation = songCursor.getColumnIndex(MediaStore.Audio.Media.DATA);


        while (songCursor.moveToNext());
        {

            currentTitle = songCursor.getString(songTitle); //
            currentArtist = songCursor.getString(songArtist); //
            currentLocation = songCursor.getString(songLocation);
            arrayList.add("Title: " + currentTitle + "\n" + "Artist: " + 
            currentArtist + "\n" + "Location: " + currentLocation);
        }
    }

快乐的编码!!

相关问题