【问题标题】:FileNotFoundException using mediaplayerFileNotFoundException 使用媒体播放器
【发布时间】:2018-03-15 15:35:16
【问题描述】:

我正在尝试解决这个问题几个小时,但找不到合适的解决方案: 我正在尝试播放媒体文件(Mp3/Ogg),但总是得到 FileNotFoundException(我确定它在那里;))

这是我尝试的:

检查 SD 卡是否可用。

检查是否授予读/写权限。

加载/播放歌曲。

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());
    }

程序在尝试 setDataSource 时崩溃并出现此异常:

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");

playSong("storage/emulated/0/Android/data/OMSclient.omsgui/files/Music/t1.mp3");

它没有..

为什么? ...

【问题讨论】:

  • 你的 targetSdkVersion 是什么?
  • 现在是 19 岁,我至少需要 15 个字符才能发表评论
  • 我还在考虑运行时权限。你的模拟器是什么级别的?试试 22 或更少的模拟器。
  • 但是如果你看一下我的编辑,它可以从外部 SD 卡播放歌曲....而且它也不能在我的手机上工作...授予外部写入和读取权限
  • 只是为了清楚。 “授予读取权限”和“授予写入权限”正在打印到日志?

标签: java android file exception android-mediaplayer


【解决方案1】:

使用此代码,

 String filePath = "xx/xx/file.mp3";
 File file = new File(filePath);
 FileInputStream inputStream = new FileInputStream(file);
 mediaPlayer.setDataSource(inputStream.getFD());
 inputStream.close();

希望对你有帮助!

【讨论】:

  • 你是如何得到你的路径的?
  • getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString()
【解决方案2】:

我使用您提供的代码和以下属性创建了一个项目:

compileSdkVersion 26
minSdkVersion 19
targetSdkVersion 19

我发现 getExternalFilesDir(Environment.DIRECTORY_MUSIC).toString() 根据模拟器的 Android 级别返回不同的值。

19 级 KitKat 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

这是我的代码,但请记住,我从原始资源中保存文件并在同一个活动中播放它,因此它总是在正确的位置。

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(Environment.DIRECTORY_MUSIC).toString() 返回 /storage/emulated/0/Android/data/OMSclient.omsgui/files/Music 但 SD 卡无法从 /storage/emulated/0/ 访问
  • 我在另一个问题中找到了解决方法,如果您没有任何进一步的想法为什么代码无法按预期工作,我将发布并关闭此问题(解决方法获取直接路径到 SD 卡(在我的情况下为storage/17E5-1C14/
【解决方案3】:

好的。因为 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;
}

这段代码在我测试过的每个模拟器上都运行良好。 如果有人遇到同样的问题,希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多