我有权限,但仍然获得java.io.FileNotFoundException:open失败:EACCES(权限被拒绝)
我的目标是SdkVersion 29,我试图播放位于外部存储SD卡中的歌曲,但它一直显示此错误:我有权限,但仍然获得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
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中的错误,通常可以确定具体细节。此外,使用设备上的文件应用程序,您应该能够查看具有该名称的文件是否确实存在于该文件夹中
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();
}
}