我有权限,但仍然获得java.io.FileNotFoundException:open失败:EACCES(权限被拒绝)

我有权限,但仍然获得java.io.FileNotFoundException:open失败:EACCES(权限被拒绝),java,android,android-studio,android-fragments,android-permissions,Java,Android,Android Studio,Android Fragments,Android Permissions,我的目标是SdkVersion 29,我试图播放位于外部存储SD卡中的歌曲,但它一直显示此错误: W/System.err: java.io.FileNotFoundException: /storage/E0FD-1813/Music/3_INTRO.mp3: open failed: EACCES (Permission denied) V/MediaPlayerNative: isPlaying: no active player I/chatty: uid=10325(com.andr

我的目标是SdkVersion 29,我试图播放位于外部存储SD卡中的歌曲,但它一直显示此错误:

W/System.err: java.io.FileNotFoundException: /storage/E0FD-1813/Music/3_INTRO.mp3: open failed: EACCES (Permission denied)

V/MediaPlayerNative: isPlaying: no active player
I/chatty: uid=10325(com.android.leafter) Thread-6 identical 32 lines
V/MediaPlayerNative: isPlaying: no active player
V/MediaPlayerNative: isPlaying: no active player
I/chatty: uid=10325(com.android.leafter) Thread-6 identical 26 lines

我有一个名为musicfragment的片段,其中包含一个listview,当触发getSongs方法时,它将保存歌曲,但我知道我应该进行置换,所以我添加了读取外部存储

manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.leafter">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
但当我在歌曲上运行应用程序时,不会播放歌曲,并且会出现上面显示的错误


PS:我尝试将.mp3歌曲作为资源放在raw文件夹中,并使用MediaPlayer.create(getApplicationContext(),R.raw.song)进行创建,该功能正常

未找到的文件可能与两个问题有关:

  • 您没有正确的权限
  • 文件夹或文件不存在 如果查看Logcat中的错误,通常可以确定具体细节。此外,使用设备上的文件应用程序,您应该能够查看具有该名称的文件是否确实存在于该文件夹中
您的目标是什么级别的SDK?如果应用程序的build.gradle文件中有targetSdkVersion 30,则需要更新代码以遵守谷歌最近做出的策略更改

虽然谷歌的文档不是很好,但这是我能找到的最好的信息,可以了解更多关于这方面的信息:

(请确保展开本页底部的部分)

(这篇文章更侧重于作用域存储,但仍然很有帮助)

如果不确定该目录是否存在,可以使用以下代码创建该目录:

final File root = new File(String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)));

// Create the directory if it doesn't exist
if (!root.exists()) {
    boolean wasSuccessful = root.mkdirs();

    // Display Toast message if the directory creation wasn't successful
    if (!wasSuccessful) {
        mToast = Toast.makeText(this, R.string.photo_directory_not_created_error, Toast.LENGTH_SHORT);
        mToast.show();
    }
}

我的targetSdkVersion=29我已经在我的手机和logcat中检查了歌曲的路径,它们匹配,但仍然得到permessio拒绝和filenotfound。你能再解释一下我应该更改或检查什么吗?因为我是android新手这是我的第一个项目什么是范围存储?你选择了一个具有挑战性的项目作为你的目标第一个!这是一个很好的Android开发者培训网站,可以开始学习如何管理存储、权限、,访问由你的应用程序或其他程序创建的文件:这是一个学术项目,所以别无选择,我必须这样做:p如果你有任何意见或可能有我感兴趣的修复方法,我尝试将targetSDKversion从29降低到27,如果你正在使用Api29,它会工作,您可能希望清单
中的
AndroidManifest.xml
中的
requestLegacyExternalStorage=true
作为节属性。注意:这是executon的暂时停留,从2021年8月起,Google Play上所有新的/更新的应用程序都需要以Api30为目标-此标志对Api30不再有任何意义。如果这只是一个玩具项目,那么不要担心,只需添加Attribute标志。
public class MusicPlayer_Activity extends AppCompatActivity implements View.OnClickListener {

//    Views delcaration

    TextView tvTime, tvDuration, songTitle, songArtist;
    Button btnPlay;
    SeekBar seekBarTime, seekBarVolume;

    MediaPlayer musicPlayer;
    AudioManager audiomanager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music_player_);
      // Views declaration ...
      
        Song currentSong = (Song) getIntent().getSerializableExtra("currentSong");

        songTitle.setText(currentSong.getTitle());
        songArtist.setText(currentSong.getArtist());

        musicPlayer = new MediaPlayer();        
        try {
            musicPlayer.setDataSource("file://"+currentSong.getPath());
            Toast.makeText(this,"after setDataSource file://"+currentSong.getPath(),Toast.LENGTH_SHORT).show();
            musicPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }

        btnPlay.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btnPlay) {
            if (musicPlayer.isPlaying()) {
                musicPlayer.pause();
                btnPlay.setBackgroundResource(R.drawable.ic_play);
            } else {
                musicPlayer.start();
                btnPlay.setBackgroundResource(R.drawable.ic_pause);
            }
        }
    }
}
final File root = new File(String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)));

// Create the directory if it doesn't exist
if (!root.exists()) {
    boolean wasSuccessful = root.mkdirs();

    // Display Toast message if the directory creation wasn't successful
    if (!wasSuccessful) {
        mToast = Toast.makeText(this, R.string.photo_directory_not_created_error, Toast.LENGTH_SHORT);
        mToast.show();
    }
}