簡體   English   中英

android Mediaplayer NPE 在存儲文件中但不在系統文件中

[英]android Mediaplayer NPE on files in storage but not in system files

我做了一個簡單的媒體播放器 android 應用程序,但我有一個錯誤:

uri = Uri.parse(/data/hw_init/hw_product/media/Pre-loaded/Music/Beijing_Bass.mp3);

MediaPlayer.create(getApplicationContext(), uri).start();

工作正常

uri = Uri.parse(/storage/emulated/0/Download/Beijing_Bass.mp3);

MediaPlayer.create(getApplicationContext(), uri).start();

不工作! (空指針異常)

在我的 MainActivity 上,這是我請求權限的方式:

//ask for permission for read and write external storage
private void permission(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        } else {
            Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
            musicFiles = getAllAudioFromDevice(this);
        }
    }
}

// on permission granted find all music files and add them to the list
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            permission();
        } else {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }
    }
}

在我的清單中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

你能幫我理解我的錯誤嗎?

非常感謝

編輯:這就是我得到我的uri的方式:

public static ArrayList<MusicFiles> getAllAudioFromDevice(final MainActivity mainActivity) {
    ArrayList<MusicFiles> tempAudioList = new ArrayList<>();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {
            MediaStore.Audio.Media.ALBUM,
            MediaStore.Audio.Media.ARTIST,
            MediaStore.Audio.Media.DURATION,
            MediaStore.Audio.Media.DATA, // for path
            MediaStore.Audio.Media.DISPLAY_NAME,
            MediaStore.Audio.Media.TITLE,
            MediaStore.Audio.Media._ID
    };
    Cursor cursor = mainActivity.getContentResolver().query(uri, projection, null, null, null);
    if (cursor != null) {
        while (cursor.moveToNext()) {
            String album = cursor.getString(0);
            String artist = cursor.getString(1);
            String duration = cursor.getString(2);
            String path = cursor.getString(3);
            String displayName = cursor.getString(4);
            String title = cursor.getString(5);
            String id = cursor.getString(6);

            MusicFiles musicFilesTemp = new MusicFiles(path, title, artist, album, duration, displayName, id);
            Log.e("Music","Path : " + path +" Album : " + album );
            tempAudioList.add(musicFilesTemp);
        }
        cursor.close();
    }
    Log.e("Music","search complete");
    return tempAudioList;
}

然后這就是我真正啟動媒體播放器的方式:

private void getIntentMethod() {
        position = getIntent().getIntExtra("position", -1);
        listSongs = musicFiles;
        if (listSongs != null) {
            playPauseBtn.setImageResource(R.drawable.ic_pause);
            uri = Uri.parse(listSongs.get(position).getPath());
        }
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
            Log.e("Music","Media Player released");
        }

        mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
        Log.e("Music",uri.toString());

        if (mediaPlayer != null) {
            mediaPlayer.start();
            seekBar.setMax(mediaPlayer.getDuration() / 1000);
            duration_total.setText(formattedTime(mediaPlayer.getDuration() / 1000));
            song_name.setText(listSongs.get(position).getTitle());
            artist_name.setText(listSongs.get(position).getArtist());
            metaData(uri);
        } else {
            Log.e("Media Player", "Media Player is null");
        }

多虧了 logcat,我檢測到我的 NPE 問題僅在我的 uri 以“/storage/...”開頭時發生,並且當它以“/data/...”開頭時它工作正常

使用來自https://developer.android.com/guide/topics/media/mediaplayer#java的代碼進行調試

long id = /* retrieve it from somewhere */;
Uri contentUri = ContentUris.withAppendedId(
        android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);

mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), contentUri);

// ...prepare and start...

非常感謝 blackapps

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM