使用VideoView从android内部存储器播放视频文件
我正在尝试播放储存在Android内部存储器中的视频。然而,无论我做什么,它总是返回一个-1错误或-38错误。这两种错误似乎都是相当普遍的错误,因此不太容易理解 我想知道是否可以使用VideoView而不是MediaPlayer实例从本地存储播放视频文件 我的应用程序涉及的步骤包括:使用VideoView从android内部存储器播放视频文件,android,media-player,android-videoview,Android,Media Player,Android Videoview,我正在尝试播放储存在Android内部存储器中的视频。然而,无论我做什么,它总是返回一个-1错误或-38错误。这两种错误似乎都是相当普遍的错误,因此不太容易理解 我想知道是否可以使用VideoView而不是MediaPlayer实例从本地存储播放视频文件 我的应用程序涉及的步骤包括: 从远程url下载文件 将文件存储在内部 存储(注:我使用约定来确保其具有全局 读取权限,即 openFileOutput(file_name, Context.MODE_WORLD_READABLE); 稍后从
openFileOutput(file_name, Context.MODE_WORLD_READABLE);
String filePath = "file://" + getFilesDir()+File.separator+file_name;
Uri videoUri = Uri.parse(filePath);
Log.d("Video Player", filePath);
videoPlayer.setVideoURI(videoUri);
String filePath = "file://" + getFilesDir()+File.separator+file_name;
Uri videoUri = Uri.parse(filePath);
Log.d("Video Player", filePath);
videoPlayer.setVideoURI(videoUri);
使用的其他StackOverflow引用
请尝试此操作。我已在此链接上解释了从原始文件夹播放视频的过程:。如果您修改
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/"+R.raw.VideoName);
与
我想这会解决你的问题。记住在清单上给予必要的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
将其复制到外部存储器(临时)
我遇到了与您相同的问题,只是在播放之前将文件临时复制到外部存储,然后删除临时文件
下面是我用来执行此操作的一些示例代码:
try {
// Copy file to temporary file in order to view it.
temporaryFile = generateTemporaryFile(file.getName());
FileUtils.copyFile(file, temporaryFile);
previewVideo(temporaryFile, videoView);
} catch (IOException e) {
e.printStackTrace();
}
# Helpers
protected File generateTemporaryFile(String filename) throws IOException {
String tempFileName = "20130318_010530_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File tempFile = File.createTempFile(
tempFileName, /* prefix "20130318_010530" */
filename, /* filename "video.3gp" */
storageDir /* directory "/data/sdcard/..." */
);
return tempFile;
}
protected void previewVideo(File file, VideoView videoView) {
videoView.setVideoPath(file.getAbsolutePath());
MediaController mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
mediaController.setMediaPlayer(videoView);
videoView.setVisibility(View.VISIBLE);
videoView.start();
}
这里的游戏有点晚了,但是如果你在你的应用程序中添加了一个URI,那么你就可以创建VideoView可以利用的URI 这实际上非常简单,一旦完成,您就可以访问您的文件,如:
Uri video = FileProvider.getUriForFile(context, context.getPackageName(), new File(myAbsoluteVideoPath));
myVideoView.setVideoURI(video);
这可用于播放您在应用程序中生成并保存在设备上的视频。将
targetSdkVersion
更改为27
安卓
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig
{
applicationId "com.naved.playonmp3"
minSdkVersion 18
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
您好,这很好,当我将视频存储在外部存储器上时,如何访问存储在设备内部存储器路径中的视频。注意,我没有将视频存储在应用程序的原始文件夹中。更新:尝试了上述操作,但没有成功。当我尝试访问视频时,该视频仍拒绝播放。我已在中检查了视频权限e轻拍外壳,它们似乎没问题。@baradas你把视频的存储在哪里?它在SD卡上吗?你解决过这个问题吗?还是什么都没有?这仍然是唯一的解决方案possible@NoumanCh添加了一些粗略的代码片段,以帮助您沿着路径前进。如果有帮助,请告诉我。buddy我正在使用内部存储,因为我的文件是supposed希望像youtube下载的视频一样安全。我认为这种方式会破坏我的安全。你说什么?@NoumanCh Yeah buddy。如果你找到更安全的解决方案,请确保让我们其他人知道。当然,兄弟。我会。如果我使用以下路径怎么办:
context?.getExternalFilesDir(Environment.DIRECTORY\u MOVIES)
我仍然可以将其作为myAbsoluteVideoPath
传递,因为它已经有包名了吗?
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig
{
applicationId "com.naved.playonmp3"
minSdkVersion 18
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}