Отказано в доступе при использовании конструктора файла для video_player - PullRequest
0 голосов
/ 26 апреля 2018

Хорошо, у меня установлена ​​относительно простая программа для создания флаттера для тестирования плагина video_player (https://pub.dartlang.org/documentation/video_player/0.5.1/.)

Плеер работает нормально, когда я использую конструкторы "Network" или "Asset" для контроллера, но когда я пытаюсь использовать конструктор "file", я сталкиваюсь с ошибками, в которых отказано в разрешении. Файл, на который я указываю, является файлом mp4, который находится в папке с документами приложения ...

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

void main() => runApp(new MyApp());

//WILL NOT CHANGE
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

//WILL CHANGE
class _MyAppState extends State<MyApp> {
  String _title = 'App Bar Demo';
  String _myState = 'NO STATE';

  VideoPlayerController _controller;
  bool _isPlaying = false;


  void setControllerDir() async{

  }

  Future<String> appDir() async{
  final directory = await getApplicationDocumentsDirectory();

  return directory.path;
  }


  void _pressed(String message) async {
    //CORRECT
    setState(() {
        _myState = message;
      }
    );
    var testPath = await appDir();
    print(testPath);
    //WRONG
    //_myState = message;
    print(_myState);
  }

  @override
  void initState() {
    super.initState();
    //_controller = new VideoPlayerController.network('http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_20mb.mp4',)

    //_controller = new VideoPlayerController.asset('assets/test.mp4')
    var file = new File('/data/user/0/com.example.videotest/app_flutter/test.mp4');
    //_controller = new VideoPlayerController.asset('assets/test.mp4')
    //final directory = await getApplicationDocumentsDirectory();

    _controller = new VideoPlayerController.file(file)

      ..addListener(() {
        final bool isPlaying = _controller.value.isPlaying;
        if (isPlaying != _isPlaying) {
          setState(() {
            _isPlaying = isPlaying;
          });
        }
      })
      ..initialize();
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: _title,
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(_title),
          actions: <Widget>[
            new Text('text'),
            new IconButton(icon: new Icon(Icons.add_alert), onPressed: () {_pressed('Alert Pressed');}),
            new IconButton(icon: new Icon(Icons.print), onPressed: () {_pressed('Print Pressed');}),
            new IconButton(icon: new Icon(Icons.people), onPressed: () {_pressed('People Pressed');}),
            new RaisedButton(child: new Text('Button'),onPressed: () {_pressed('Button Pressed');}),

          ],
        ),
        body: new Container(
          padding: const EdgeInsets.all(10.0),
          child: new AspectRatio(
            aspectRatio: 1280 / 720,
            child: new VideoPlayer(_controller),
          ),
        ),
        floatingActionButton: new FloatingActionButton(
          onPressed:
              _controller.value.isPlaying ? _controller.pause : _controller.play,
          child: new Icon(
            _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
          ),
        ),       
      ),
    );
  }
}

Я новичок в разработке Android и Flutter. Я попытался добавить разрешения внешнего хранилища в мой манифест, но это не помогло. Во всяком случае, я бегу флаттер бета 2 и доктор флаттер проверяет нормально. Я добавил видеофайл с помощью загрузчика в Device File Explorer в Android Studio, и я могу увидеть его там. Любые подсказки будут оценены. Спасибо :-D

1 Ответ

0 голосов
/ 02 мая 2018

Хорошо, позвольте мне уточнить, что здесь происходит, если кто-то наткнется на эту проблему и нуждается в некотором разъяснении. Итак, у меня есть простой пример приложения video_player, который не работал, когда я пытался получить доступ к видеофайлу, который я загрузил в каталог /data/user/0/com.example.videotest/app_flutter в моем эмуляторе с помощью проводника файлов устройств в Android Студия. Я получаю разрешение отказано в ошибках. Оказывается, мне нужно было открыть терминал и использовать инструмент «adb», чтобы «протолкнуть» видеофайл в этот каталог, чтобы получить правильные разрешения для файла и получить конструктор файла для объекта VideoController для работы с файл. Но сначала я должен был настроить adb deamon для запуска с правами root, чтобы получить разрешение на передачу файла. Так что все сводилось к ...

adb root
adb push test.mp4 /data/user/0/com.example.videotest/app_flutter/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...