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