如何在Android中获取Uri的媒体文件?

时间:2014-12-12 09:46:34

标签: android uri media-player android-mediaplayer

我想在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文件的问题!

3 个答案:

答案 0 :(得分:1)

只需更改您的文件:/ ...到file:///,它就能正常工作

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

或者只是你有一个文件试试

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

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

修改

我已回答了有关如何使用Uri here

初始化MediaPlayer的问题

使用上述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>

答案 1 :(得分:0)

试试这个

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

答案 2 :(得分:0)

我正在提供原始问题的另一个答案,这可能不适用于@roger稍后描述的具体问题。我发现没有必要进一步处理/解析媒体文件路径。只需直接使用它。例如,我在Samsung Galaxy手机上有一个本地存储的媒体文件:“/ storage /emulated/0 / Samsung / Music / Over_the_Horizo​​n.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>