我想在 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>