【问题标题】:Play video file from internal storage android using VideoView使用 VideoView 从内部存储 android 播放视频文件
【发布时间】:2012-05-15 11:55:47
【问题描述】:

我正在尝试播放存储在 Android 内部存储器中的视频。但是,无论我做什么,它都会返回 -1 错误或 -38 错误。两者似乎都是相当普遍的错误,因此不太容易理解。

我想知道是否可以使用 VideoView 而不是 MediaPlayer 实例来播放本地存储中的视频文件。

我的应用程序涉及的步骤包括,

  1. 从远程 url 下载文件
  2. 将文件存储在内部 存储(注意我使用约定来确保它具有全局 读取权限。即

    openFileOutput(file_name, Context.MODE_WORLD_READABLE);
    
  3. 稍后从该位置读回媒体文件,并在 videoView 中播放。

    String filePath = "file://" + getFilesDir()+File.separator+file_name;
    Uri videoUri = Uri.parse(filePath);
    Log.d("Video Player", filePath);
    videoPlayer.setVideoURI(videoUri);
    

我还浏览了 StackOverflow 中的其他链接,这些链接指出我需要实现一个 CustomContentProvider 才能读取这些文件。有没有一种直接的方法可以访问文件 uri 并将其设置为 videoView,而无需求助于创建自定义内容提供程序并使用 mediaPlayer 而不是 videoView。

使用的其他 StackOverflow 参考

  1. Android - Load video from private folder of app
  2. Can a videoview play a video stored on internal storage?

【问题讨论】:

  • 你解决过这个问题吗?
  • 还是什么都没有?

标签: android media-player android-videoview


【解决方案1】:

将其复制到外部存储(临时)

我遇到了和你一样的问题,只是在播放之前将文件临时复制到外部存储,然后再删除临时文件。

这是我用来执行此操作的一些示例代码:

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

【讨论】:

  • 这仍然是唯一可能的解决方案
  • @NoumanCh 添加了一些粗略的代码 sn-ps 以帮助您顺利完成。让我知道这是否有帮助。
  • 伙计,我正在使用内部存储,因为我的文件应该像 youtube 下载的视频一样安全。我认为这种方式会破坏我的安全。你说什么?
  • @NoumanCh 是的,伙计。如果您找到更安全的解决方案,请务必告知我们其他人。
  • 当然,兄弟。我会的。
【解决方案2】:

请试试这个。我已经在此链接上解释了从原始文件夹播放视频的过程:Video player not workig!。在那,如果你修改

Uri uri = Uri.parse("android.resource://" + getPackageName() + "/"+R.raw.VideoName);

Uri uri = Uri.parse(Environment.getExternalStorageDirectory()+"<path to your video>");

例如:

Uri uri = Uri.parse(Environment.getExternalStorageDirectory()+"/dcim/camera/2012-05-15_17-50-39_319.3gp");

我认为会解决您的问题。请记住在清单上授予必要的权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【讨论】:

  • 嗨,这很好,当我将视频存储在外部存储上时,如何访问存储在设备内部存储路径中的视频。 注意我没有将视频存储在应用程序的原始文件夹中。
  • 更新:尝试了上述方法,但没有运气。当我尝试访问该视频时,它仍然拒绝播放。我已经检查了 dab shell 中的视频权限,它们似乎没问题。
  • @baradas 您实际上将视频存储在哪里?是在 SD 卡上吗?
【解决方案3】:

这里有点晚了,但是如果您将 FileProvider 添加到您的应用程序中,您就可以创建 VideoView 可以使用的 URI。

这实际上非常简单,完成后,您可以访问您的文件,例如:

Uri video = FileProvider.getUriForFile(context, context.getPackageName(), new File(myAbsoluteVideoPath));

myVideoView.setVideoURI(video);

这可用于播放您在应用中生成并保存在设备上的视频。

【讨论】:

  • 如果我使用这个路径怎么办:context?.getExternalFilesDir(Environment.DIRECTORY_MOVIES) 我仍然可以将它作为myAbsoluteVideoPath 传递,因为它已经有包名了吗?
【解决方案4】:

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"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多