【问题标题】:How can I get Uri of a media file in android?如何在android中获取媒体文件的Uri?
【发布时间】:2014-12-12 09:46:33
【问题描述】:

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

【问题讨论】:

    标签: android uri media-player android-mediaplayer


    【解决方案1】:

    只需将您的 file:/... 更改为 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>
    

    【讨论】:

    • :) 我目前正在构建一个音乐/视频播放器应用程序,MRL 以上肯定可以工作
    • 我正在做一个像你这样的项目,但我在 android TV 工作。我说的是我项目中的Uri.parse(String.valueOf(Uri.fromFile(myFile)));
    • 实际上媒体播放器不喜欢 uri 之类的 file:/storage/emulated/0/Movies/test.mp4,而是使用 uri 之类的 file:///storage/emulated/0/ Movies/test.mp4 ,这个 file:// 后跟 /storage... 被称为 MRL
    • 我已经看到你的回答了,你好像播放的是网络上的视频,但我想播放的是本地视频。我试过Uri.parse("file:///storage/emulated/0/Movies/test.mp4")Uri.parse("/storage/emulated/0/Movies/test.mp4"),他们也无法成功播放视频。
    • 我已经更新了我的答案 :) 它工作正常.. 告诉我你还需要什么
    【解决方案2】:

    试试这个

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

    【讨论】:

    • 正如我提到的Uri.parse("file:///storage/emulated/0/Movies/test.mp4") 无法工作。当然Uri.parse("/storage/emulated/0/Movies/test.mp4")我也试过了,不行!
    【解决方案3】:

    我正在为原始问题提供另一个答案,这可能不适用于@roger 稍后描述的特定问题。我发现不需要进一步处理/解析媒体文件路径。直接用就行了。例如,我的三星 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多