Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VideoView从android内部存储器播放视频文件_Android_Media Player_Android Videoview - Fatal编程技术网

使用VideoView从android内部存储器播放视频文件

使用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); 稍后从

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

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

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

  • 从远程url下载文件
  • 将文件存储在内部 存储(注:我使用约定来确保其具有全局 读取权限,即

    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);
    
  • 我还浏览了StackOverflow中的其他链接,其中指出我需要实现一个CustomContentProvider来读取这些文件。是否有一种直接的方法可以访问文件uri并将其设置为videoView,而无需创建自定义内容提供程序并使用mediaPlayer而不是videoView

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