FileNotFoundException 使用媒体播放器
FileNotFoundException using mediaplayer
我已经尝试解决这个问题好几个小时了,但找不到合适的解决方案:
我正在尝试播放媒体文件 (Mp3/Ogg),但总是出现 FileNotFoundException(而且我确定它在那里 ;))
这是我的尝试:
检查SD卡是否可用。
检查是否授予 reading/writing 权限。
Load/Play 歌曲.
if(isExternalStorageReadable() && isExternalStorageWritable())
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v("Permission","Readingpermission is granted");
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v("Permission","Writingpermission is granted");
}
playSong(getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString() + "/t1.mp3");
这部分代码目前有效。
但是一旦谈到 playSong(String) :
try {
MediaPlayer mediaplayer = new MediaPlayer();
mediaplayer.setDataSource(path);
mediaplayer.prepare();
mediaplayer.start();
} catch (Exception e){
Log.e("Mediaplayer", e.toString());
}
程序在尝试设置数据源时崩溃并出现此异常:
E/Mediaplayer: java.io.FileNotFoundException: /storage/emulated/0/Android/data/OMSclient.omsgui/files/Music/t1.mp3
我错过了什么?我一头雾水
提前致谢。
编辑:
好的,我发现了以下问题:
如果我简单地执行
playSong("storage/17E5-1C14/Android/data/OMSclient.omsgui/files/Music/t1.ogg");
它工作正常,但如果我使用:
playSong("/storage/emulated/0/Android/data/OMSclient.omsgui/files/Music/t1.mp3");
或
播放歌曲("storage/emulated/0/Android/data/OMSclient.omsgui/files/Music/t1.mp3");
没有..
为什么? ...
使用此代码,
String filePath = "xx/xx/file.mp3";
File file = new File(filePath);
FileInputStream inputStream = new FileInputStream(file);
mediaPlayer.setDataSource(inputStream.getFD());
inputStream.close();
希望对您有所帮助!
我使用您提供的代码和以下属性创建了一个项目:
compileSdkVersion 26
minSdkVersion 19
targetSdkVersion 19
而且我发现 getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString()
returns 不同的值取决于模拟器的 Android 级别。
19 级奇巧 4.4
/storage/sdcard/Android/data/com.test.mediaplayerproblem/files/Music/test1.mp3
25 级牛轧糖 7.1.1
/storage/emulated/0/Android/data/com.test.mediaplayerproblem/files/Music/test1.mp3
这是我的有效代码,但请记住,我从原始资源中保存文件并在相同的地方播放它 activity 所以它总是在正确的位置。
MainActivity.java:
public class MainActivity extends AppCompatActivity
{
private MediaPlayer mediaplayer;
private String musicDirPath;
private String filename = "/test1.mp3";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
musicDirPath = getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString();
TextView tv1 = findViewById(R.id.textView1);
tv1.setText(musicDirPath + filename);
Log.v("Mediaplayer", musicDirPath + filename);
}
public void playFile(View view) {
if(isExternalStorageReadable() && isExternalStorageWritable())
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v("Permission","Readingpermission is granted");
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v("Permission","Writingpermission is granted");
}
playSong(getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString() + "/test1.mp3");
}
public void playSong(String path) {
try {
mediaplayer = new MediaPlayer();
mediaplayer.setDataSource(path);
mediaplayer.prepare();
mediaplayer.start();
} catch (Exception e){
Log.e("Mediaplayer", e.toString());
}
}
public void stopFile(View view) {
if (mediaplayer != null) {
try {
mediaplayer.stop();
mediaplayer.release();
mediaplayer = null;
} catch(Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
}
public void saveFile(View view) {
byte[] buffer = null;
InputStream fis = getResources().openRawResource(R.raw.finn1);
int size = 0;
try
{
size = fis.available();
buffer = new byte[size];
fis.read(buffer);
fis.close();
boolean exists = (new File(musicDirPath + filename)).exists();
if (exists)
{
Toast.makeText(this, "File exists!", Toast.LENGTH_SHORT).show();
}
else
{
FileOutputStream save = new FileOutputStream(musicDirPath + filename);
save.write(buffer);
save.flush();
save.close();
Toast.makeText(this, "File saved!", Toast.LENGTH_SHORT).show();
}
}
catch (IOException e)
{
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.test.mediaplayerproblem.MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView1"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/saveFile"
android:text="Save"
android:onClick="saveFile"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/playButton"
android:text="Play"
android:onClick="playFile"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/stopButton"
android:text="Stop"
android:onClick="stopFile"/>
</LinearLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
好的。因为 getExternalFilesDir 似乎不起作用,所以我使用了以下解决方法:
public String getExternalPath(){
String removableStoragePath = "";
File fileList[] = new File("/storage/").listFiles();
for (File file : fileList)
{ if(!file.getAbsolutePath().equalsIgnoreCase(Environment.getExternalStorageDirectory().getAbsolutePath()) && file.isDirectory() && file.canRead())
removableStoragePath = file.getAbsolutePath(); }
return removableStoragePath;
}
这段代码在我测试过的每个模拟器上都运行良好。
如果有人遇到同样的问题,希望这会有所帮助。
我已经尝试解决这个问题好几个小时了,但找不到合适的解决方案: 我正在尝试播放媒体文件 (Mp3/Ogg),但总是出现 FileNotFoundException(而且我确定它在那里 ;))
这是我的尝试:
检查SD卡是否可用。
检查是否授予 reading/writing 权限。
Load/Play 歌曲.
if(isExternalStorageReadable() && isExternalStorageWritable())
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v("Permission","Readingpermission is granted");
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v("Permission","Writingpermission is granted");
}
playSong(getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString() + "/t1.mp3");
这部分代码目前有效。
但是一旦谈到 playSong(String) :
try {
MediaPlayer mediaplayer = new MediaPlayer();
mediaplayer.setDataSource(path);
mediaplayer.prepare();
mediaplayer.start();
} catch (Exception e){
Log.e("Mediaplayer", e.toString());
}
程序在尝试设置数据源时崩溃并出现此异常:
E/Mediaplayer: java.io.FileNotFoundException: /storage/emulated/0/Android/data/OMSclient.omsgui/files/Music/t1.mp3
我错过了什么?我一头雾水
提前致谢。
编辑:
好的,我发现了以下问题:
如果我简单地执行
playSong("storage/17E5-1C14/Android/data/OMSclient.omsgui/files/Music/t1.ogg");
它工作正常,但如果我使用:
playSong("/storage/emulated/0/Android/data/OMSclient.omsgui/files/Music/t1.mp3");
或
播放歌曲("storage/emulated/0/Android/data/OMSclient.omsgui/files/Music/t1.mp3");
没有..
为什么? ...
使用此代码,
String filePath = "xx/xx/file.mp3";
File file = new File(filePath);
FileInputStream inputStream = new FileInputStream(file);
mediaPlayer.setDataSource(inputStream.getFD());
inputStream.close();
希望对您有所帮助!
我使用您提供的代码和以下属性创建了一个项目:
compileSdkVersion 26
minSdkVersion 19
targetSdkVersion 19
而且我发现 getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString()
returns 不同的值取决于模拟器的 Android 级别。
19 级奇巧 4.4 /storage/sdcard/Android/data/com.test.mediaplayerproblem/files/Music/test1.mp3
25 级牛轧糖 7.1.1 /storage/emulated/0/Android/data/com.test.mediaplayerproblem/files/Music/test1.mp3
这是我的有效代码,但请记住,我从原始资源中保存文件并在相同的地方播放它 activity 所以它总是在正确的位置。
MainActivity.java:
public class MainActivity extends AppCompatActivity
{
private MediaPlayer mediaplayer;
private String musicDirPath;
private String filename = "/test1.mp3";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
musicDirPath = getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString();
TextView tv1 = findViewById(R.id.textView1);
tv1.setText(musicDirPath + filename);
Log.v("Mediaplayer", musicDirPath + filename);
}
public void playFile(View view) {
if(isExternalStorageReadable() && isExternalStorageWritable())
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v("Permission","Readingpermission is granted");
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v("Permission","Writingpermission is granted");
}
playSong(getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString() + "/test1.mp3");
}
public void playSong(String path) {
try {
mediaplayer = new MediaPlayer();
mediaplayer.setDataSource(path);
mediaplayer.prepare();
mediaplayer.start();
} catch (Exception e){
Log.e("Mediaplayer", e.toString());
}
}
public void stopFile(View view) {
if (mediaplayer != null) {
try {
mediaplayer.stop();
mediaplayer.release();
mediaplayer = null;
} catch(Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
}
public void saveFile(View view) {
byte[] buffer = null;
InputStream fis = getResources().openRawResource(R.raw.finn1);
int size = 0;
try
{
size = fis.available();
buffer = new byte[size];
fis.read(buffer);
fis.close();
boolean exists = (new File(musicDirPath + filename)).exists();
if (exists)
{
Toast.makeText(this, "File exists!", Toast.LENGTH_SHORT).show();
}
else
{
FileOutputStream save = new FileOutputStream(musicDirPath + filename);
save.write(buffer);
save.flush();
save.close();
Toast.makeText(this, "File saved!", Toast.LENGTH_SHORT).show();
}
}
catch (IOException e)
{
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.test.mediaplayerproblem.MainActivity">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView1"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/saveFile"
android:text="Save"
android:onClick="saveFile"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/playButton"
android:text="Play"
android:onClick="playFile"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/stopButton"
android:text="Stop"
android:onClick="stopFile"/>
</LinearLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
好的。因为 getExternalFilesDir 似乎不起作用,所以我使用了以下解决方法:
public String getExternalPath(){
String removableStoragePath = "";
File fileList[] = new File("/storage/").listFiles();
for (File file : fileList)
{ if(!file.getAbsolutePath().equalsIgnoreCase(Environment.getExternalStorageDirectory().getAbsolutePath()) && file.isDirectory() && file.canRead())
removableStoragePath = file.getAbsolutePath(); }
return removableStoragePath;
}
这段代码在我测试过的每个模拟器上都运行良好。 如果有人遇到同样的问题,希望这会有所帮助。