首页 > 解决方案 > 如何从外部存储播放音频文件?

问题描述

我正在尝试从外部存储播放音频文件,但只能从列表视图中单击该项目而无法播放。我是否缺少任何必要的代码。请根据我的代码帮助我。我有一个列表视图,它检索所有歌曲但不播放。为了更清楚:

1. 我有一个列表视图,其中包含从外部存储中检索到的歌曲

2. 我点击了一个项目,但无法播放音频文件。

import android.Manifest;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.net.Uri;

import android.provider.MediaStore;

import android.content.pm.PackageManager;

import android.support.annotation.NonNull;

import android.support.v4.app.ActivityCompat;

import android.support.v7.app.AppCompatActivity;

import android.os.Build;

import android.os.Bundle;

import android.database.Cursor;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

ListView listView;
int index;
Uri uri;
Cursor cursor;
MediaPlayer mediaPlayer;
ArrayList<String> arrayListSong = new ArrayList<>();
public static final int RUNTIME_CODE = 1;
ArrayAdapter<String> adapter;
String[] projection = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA,
        MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.ARTIST_ID, MediaStore.Audio.Media.ARTIST,
        MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.ALBUM};

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

    listView = findViewById(R.id.listViewAudio);
    runtimePermission();
    uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    cursor = getContentResolver().query(uri, projection, null, null, null);
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayListSong);
    try {
        getSongList();
        listView.setAdapter(adapter);
    }catch (Exception e){ e.getMessage(); }
    playOnItemClick();
}

public void runtimePermission() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

            if (shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)) {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, RUNTIME_CODE);
            } else {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, RUNTIME_CODE);
            }
        }
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case RUNTIME_CODE: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getSongList();
                listView.setAdapter(adapter);
            } else {
                finish();
            }
        }
    }
}

public void getSongList() {

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
                arrayListSong.add(cursor.getString(index));
            } while (cursor.moveToNext());
        }
    }
}

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

            try {
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mediaPlayer.setDataSource(getApplicationContext(), uri);
                mediaPlayer.prepare();
                mediaPlayer.start();
            }catch (Exception e) { e.getMessage(); }
        }
    });
}
}

标签: androidlistviewandroid-sdcardandroid-music-player

解决方案


推荐阅读