Search code examples
androidurimedia-playerandroid-mediaplayer

How can I get Uri of a media file in android?


I want to play a video with MediaPlayer in android, code is something like this:

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

I have a local file: /storage/emulated/0/Movies/test.mp4, how can I get the mUri of this file?

In fact, android.net.Uri have a method fromFile(File file), it returns a Uri like this: file:///storage/emulated/0/Movies/test.mp4. But this does work in setDataSource() method.

UPDATED: I don't want to misleading someone in this problem.

In fact, Uri.parse("/storage/emulated/0/Movies/test.mp4") and Uri.parse("file:///storage/emulated/0/Movies/test.mp4") should be ok in my situation. But it is just my mp4 file's problem!


Solution

  • just change your file:/... to file:/// and it will work

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

    or simply if you have a file try

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

    Actually the thing is that the media player requires MRL followed by your path to file

    EDIT

    I have answered a question on how to initialise MediaPlayer using Uri here

    Use the above MRL and initialise your player as suggested and enjoy your video :)

    UPDATE:

    I thought I should share part of my implementation so that it may help you out:

    1st Add below line to your manifest

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

    2nd

    Make your activity look like

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

    and for testing your xml can be like

    <?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>