如何在安卓中获取媒体文件的 Uri



我想在 android 中播放带有 MediaPlayer 的视频,代码是这样的:

MediaPlayer mMediaPlayer = new MediaPlayer() mMediaPlayer.setDataSource(this.getContext, mUri, mHeaders)

我有一个本地文件:/storage/emulated/0/Movies/test.mp4,如何获取此文件的mUri

实际上,android.net.Uri有一个方法fromFile(File file),它返回一个像这样的Uri:file:///storage/emulated/0/Movies/test.mp4。但这确实适用于setDataSource()方法。

更新:我不想在这个问题上误导某人。

事实上,在我的情况下,Uri.parse("/storage/emulated/0/Movies/test.mp4")Uri.parse("file:///storage/emulated/0/Movies/test.mp4")应该没问题。但这只是我的mp4文件的问题!

只需更改您的文件:/...file:///,它会起作用

Uri.parse(uri.toString().replace("file:/", "file:///"));

或者只是如果您有文件尝试

Uri.parse(String.valueOf(Uri.fromFile(myFile)));

实际上,问题是媒体播放器需要MRL,然后是您的文件路径

编辑

我已经回答了一个关于如何使用 Uri 初始化媒体播放器的问题

这里

使用上述MRL并按照建议初始化播放器,并享受您的视频:)

更新:

我想我应该分享我的部分实现,以便它可以帮助您:

第一将以下行添加到清单

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

第二

使您的活动看起来像

public class MyActivity extends Activity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener {
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;
    private MediaPlayer mMediaPlayer;
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getWindow().setFormat(PixelFormat.UNKNOWN);
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        String stringPath = "/storage/emulated/0/Movies/Lesson%201/30%20-%20Create%20Some%20Fake%20Data.mp4";
        stringPath = android.net.Uri.parse("file://" + stringPath).getPath();
        try {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.setOnErrorListener(this);
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setDataSource(stringPath);
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        return false;
    }
}

为了测试你的XML可以像

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <SurfaceView
            android:id="@+id/surfaceview"
            android:layout_width="300dp"
            android:layout_height="169dp"
            />
</LinearLayout>

试试这个

String filePath = "file:///storage/emulated/0/Movies/test.mp4"
filePath.replace("file:///", "/"));
MediaPlayer player = MediaPlayer.create(this, Uri.parse(filePath));
    player.setOnPreparedListener(new OnPreparedListener() { 
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

我为原始问题提供了另一个答案,这可能不适用于稍后@roger描述的特定问题。我发现没有必要进一步处理/解析媒体文件路径。直接使用即可。例如,我的三星Galaxy手机上有一个本地存储的媒体文件:"/storage/emulated/0/Samsung/Music/Over_the_Horizon.mp3".以下简单代码适用于播放文件:

String url = "/storage/emulated/0/Samsung/Music/Over_the_Horizon.mp3";
MediaPlayer mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(url);
mPlayer.prepare();
mPlayer.start();

(我省略了 try-catch 块和其他非基本代码)。如果在运行代码时发出 SecurityException 或 IOException,则很可能需要在文件内的正确位置添加用户权限AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    <application
    </application>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

最新更新