使用 Flutter 从 Android 平板电脑中的相机中选取视频

问题描述 投票:0回答:1
  • 我正在使用 image_picker 从相机中挑选视频。
  • 它可以在移动设备上运行。
  • 在 Android 平板电脑上。
  • 当我从应用程序创建视频并选择时。文件大小为 0。
  • 图像路径正在本地缓存中打印,但是当我保存此视频时,视频会保存为 0 字节的文件。 代码示例
    最终结果 = wait picker.pickVideo(source: image_picker.ImageSource.camera); Uint8List datList=await result.readAsBytes();
    log("文件长度${datList.length}");如果我打印 result.path 则打印 0
    结果打印
    /storage/emulated/0/Movies/123 (2).mp4 到 content://media/external_primary/video/media/1000000226
    当我保存此文件时,文件保存为 0 字节。
android flutter dart tablet
1个回答
0
投票

添加到AndroidManifest.xml

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

使用正确的文件路径

有时,选择器返回的路径在平板电脑上可能会有所不同。确保您正确处理文件路径。

确保文件正确保存

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:typed_data';
import 'dart:io';
import 'package:path_provider/path_provider.dart';

class VideoPicker extends StatefulWidget {
  @override
  _VideoPickerState createState() => _VideoPickerState();
}

class _VideoPickerState extends State<VideoPicker> {
  final ImagePicker _picker = ImagePicker();

  Future<void> pickVideo() async {
    try {
      final XFile? result = await _picker.pickVideo(source: ImageSource.camera);

      if (result != null) {
        Uint8List dataList = await result.readAsBytes();
        print("File length: ${dataList.length}");

        // Get the temporary directory
        Directory tempDir = await getTemporaryDirectory();
        String tempPath = tempDir.path;
        
        // Create a file to save the video
        File videoFile = File('$tempPath/${result.name}');
        
        // Write the video bytes to the file
        await videoFile.writeAsBytes(dataList);
        
        print("Video saved at: ${videoFile.path}");
      } else {
        print("No video selected");
      }
    } catch (e) {
      print("Error picking video: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Video Picker"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: pickVideo,
          child: Text("Pick Video from Camera"),
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: VideoPicker(),
));
© www.soinside.com 2019 - 2024. All rights reserved.