Ошибка при получении пути к загруженному файлу с помощью path_provider к video_player

#dart #flutter

#dart #флаттер

Вопрос:

Мое приложение будет загружать видео, на первом экране можно будет загружать видео, я использую dio и получаю папку приложения с помощью path_provider, на втором экране я хочу показать и воспроизвести загруженное видео.

Загрузка в порядке, сохраняется по правильному пути, но я не могу получить тот же путь к video_player, я получаю «файл не найден».

путь, по которому был загружен файл: /data/user/0/APP_NAME/app_flutter/ATW — Вокруг света.mp4

путь, на котором отображается ошибка: flutter_assets//data/user/0/APP_NAME/app_flutter/ATW — Вокруг света.mp4

Похоже, что они не совпадают.

 Dio dio = Dio();

      try {

        var dir = await getApplicationDocumentsDirectory();

        for (int i = 0; i < urls.length; i  ){

          path = "${dir.path}/${tricks[i]}.mp4";

          await dio.download(urls[i], path, onReceiveProgress: (rec, total){

            setState(() {

              progress = ((rec / total) * 100).toStringAsFixed(0)   "%";

            });

          });

          print(path);

        }


      } catch (e){
        print(e);
      }

===============


import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:video_player/video_player.dart';

class VideoScreen extends StatefulWidget {

  String trickName;


  VideoScreen(this.trickName);

  @override
  _VideoScreenState createState() => _VideoScreenState(trickName);
}

class _VideoScreenState extends State<VideoScreen> {

  String trickName;
  VideoPlayerController _controller;
  dynamic videoPath;

  _VideoScreenState(this.trickName);

  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    _getVideoPath();

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Trick"),
         centerTitle: true,
      ),
      body: FutureBuilder(
        future: _getVideoPath(),
          builder: (context, snapshot){
          if(snapshot.connectionState == ConnectionState.done){
            return Center(
              child: _controller.value.initialized ? AspectRatio(
                aspectRatio: _controller.value.aspectRatio,
                child: VideoPlayer(_controller),
              )
              : Center(
                child: CircularProgressIndicator(),
              ),
            );
            }

          }
      ),


    );
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    _controller.dispose();
  }

  Future<void> _getVideoPath() async{

    try{

      var dir = await getApplicationDocumentsDirectory();

      videoPath = "${dir.path}/$trickName.mp4";

      print(videoPath);


      _controller = VideoPlayerController.asset(videoPath)..initialize()
          .then((_){
        setState(() {

        });
      });

    }catch (e){
      print(e);
    }

  }


}
  

I/ExoPlayerImpl(20059): Инициализация 5dd991d [ExoPlayerLib/2.9.6] [m253,
LG-K430, LGE, 23]
I/ ExoPlayerImpl(20059): Инициализация 8355563 [ExoPlayerLib/2.9.6] [m253, LG-K430, LGE, 23]
E / ExoPlayerImplInternal(20059): ошибка источника.
E/ ExoPlayerImplInternal(20059): com.google.android.exoplayer2.upstream.AssetDataSource$Исключение AssetDataSourceException:
java.io.FileNotFoundException:
flutter_assets//data/user/0/APP_NAME/app_flutter/ATW — Вокруг
Мир.mp4
E/ ExoPlayerImplInternal(20059): на com.google.android.exoplayer2.upstream.AssetDataSource.open (AssetDataSource.java:98)
E/ ExoPlayerImplInternal(20059): на com.google.android.exoplayer2.upstream.DefaultDataSource.open (DefaultDataSource.java: 250)
E/ ExoPlayerImplInternal(20059): на com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
E/ ExoPlayerImplInternal(20059): на com.google.android.exoplayer2.source.Extractor Mediaperiod$ExtractingLoadable.load(Extractor Mediaperiod.java:885)
E/ ExoPlayerImplInternal(20059): на com.google.android.exoplayer2.upstream.Загрузчик$LoadTask.run(Loader.java:381)
E/ExoPlayerImplInternal(20059): на java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
E/ExoPlayerImplInternal(20059): на java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
E/ ExoPlayerImplInternal(20059): на java.lang.Thread.run(Thread.java:818)
E / ExoPlayerImplInternal(20059): Вызвано: java.io.FileNotFoundException:
flutter_assets//data/user/0/APP_NAME/app_flutter/ATW — Вокруг
Мир.mp4
E/ ExoPlayerImplInternal(20059): в android.content.res.AssetManager.openAsset(собственный метод)
E/ ExoPlayerImplInternal(20059): на android.content.res.AssetManager.open(AssetManager.java:313)
E/ ExoPlayerImplInternal(20059): на com.google.android.exoplayer2.upstream.AssetDataSource.open(AssetDataSource.java:79)
E/ExoPlayerImplInternal(20059): … еще 7

Ответ №1:

у video_player есть функция для файлов: VideoPlayerController.file(Файл)

Моя Android Studio не показывала функцию, поэтому я подумал, что она не была реализована.

Теперь я могу загружать видео из папки приложения.