Flutter视频下载插件flutter_youtube_downloader的使用
Flutter视频下载插件flutter_youtube_downloader的使用
flutter_youtube_downloader
是一个用于提取和下载YouTube视频URL的Flutter插件。
使用方法
1. 添加依赖到 pubspec.yaml
文件
首先,需要在项目的 pubspec.yaml
文件中添加插件依赖:
dependencies:
flutter:
sdk: flutter
flutter_youtube_downloader:
然后运行 flutter pub get
来安装依赖。
2. 修改 AndroidManifest.xml
文件
如果你是针对 Android API 29+ 的设备,请确保在 AndroidManifest.xml
文件中添加以下配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
tools:replace="android:label"
android:requestLegacyExternalStorage="true">
<activity>
<!-- Your activity configurations -->
</activity>
</application>
</manifest>
3. 警告
注意不要在视频标题中添加多余的点号 (...
)。例如:
错误示例:
final result = await FlutterYoutubeDownloader.downloadVideo(
youTube_link, "Video Title goes Here...", 18);
正确示例:
final result = await FlutterYoutubeDownloader.downloadVideo(
youTube_link, "Video Title goes Here", 18);
4. 示例代码
以下是完整的示例代码,展示如何使用 flutter_youtube_downloader
插件来提取和下载YouTube视频。
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_youtube_downloader/flutter_youtube_downloader.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? _extractedLink = 'Loading...';
String? youTube_link = "https://www.youtube.com/watch?v=nRhYQlg8fVw";
@override
void initState() {
super.initState();
extractYoutubeLink();
}
// 提取YouTube视频链接
Future<void> extractYoutubeLink() async {
String? link;
try {
link = await FlutterYoutubeDownloader.extractYoutubeLink(youTube_link!, 18);
} on PlatformException {
link = 'Failed to Extract YouTube Video Link.';
}
if (!mounted) return;
setState(() {
_extractedLink = link;
});
}
// 下载YouTube视频
Future<void> downloadVideo() async {
final result = await FlutterYoutubeDownloader.downloadVideo(
youTube_link!, "Video Title goes Here", 18);
print(result);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Flutter Youtube Link Downloader example app'),
),
body: Center(
child: Text('Extracted Link : $_extractedLink\n'),
),
floatingActionButton: FloatingActionButton(
onPressed: downloadVideo,
child: const Icon(Icons.download_rounded),
),
),
);
}
}
开始使用
该项目是一个 Flutter 插件包的起点,包含了平台特定的实现代码(如 Android 和 iOS)。更多关于 Flutter 开发的帮助文档可以查看 Flutter 官方文档。
这个Markdown文档详细介绍了如何在Flutter项目中集成并使用`flutter_youtube_downloader`插件来提取和下载YouTube视频,并提供了完整的示例代码供参考。
更多关于Flutter视频下载插件flutter_youtube_downloader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter视频下载插件flutter_youtube_downloader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,使用flutter_youtube_downloader
插件可以方便地实现YouTube视频的下载功能。以下是一个简单的代码示例,展示了如何使用该插件进行视频下载。
首先,确保你的Flutter项目已经添加了flutter_youtube_downloader
依赖。在pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
flutter_youtube_downloader: ^latest_version # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你需要配置Android和iOS的权限和设置,以允许应用下载文件。
Android配置
在android/app/src/main/AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
并在android/app/build.gradle
文件中配置minSdkVersion
和targetSdkVersion
(如果尚未配置):
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.yourapp"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
...
}
iOS配置
在ios/Runner/Info.plist
中添加以下权限请求:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UIFileSharingEnabled</key>
<true/>
<key>NSPhotoLibraryUsageDescription</key>
<string>App needs access to save files in photo library</string>
Flutter代码示例
在你的Flutter项目中,你可以使用以下代码来下载YouTube视频:
import 'package:flutter/material.dart';
import 'package:flutter_youtube_downloader/flutter_youtube_downloader.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('YouTube Video Downloader'),
),
body: DownloadPage(),
),
);
}
}
class DownloadPage extends StatefulWidget {
@override
_DownloadPageState createState() => _DownloadPageState();
}
class _DownloadPageState extends State<DownloadPage> {
final _controller = TextEditingController();
FlutterYoutubeDownloader? _downloader;
@override
void initState() {
super.initState();
_downloader = FlutterYoutubeDownloader();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
Future<void> _requestPermissions() async {
var status = await Permission.storage.status;
if (!status.isGranted) {
Map<Permission, PermissionStatus> statuses = await [
Permission.storage,
].request();
status = statuses[Permission.storage]!;
}
if (status.isGranted) {
// Permissions granted, proceed with download
_downloadVideo();
} else {
// Permissions denied, show message to user
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Storage permission denied')),
);
}
}
Future<void> _downloadVideo() async {
String videoUrl = _controller.text;
if (videoUrl.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Please enter a valid YouTube video URL')),
);
return;
}
try {
var videoId = YouTubeExtractor.getVideoIdFromUrl(videoUrl);
if (videoId == null) {
throw Exception('Invalid YouTube video URL');
}
var file = await _downloader!.getVideoWithBestQuality(
videoId,
progressListener: (progress) {
print('Download progress: ${progress.progressInPercent}%');
},
);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Download complete: ${file.path}')),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Download failed: ${e.toString()}')),
);
}
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: _controller,
decoration: InputDecoration(
labelText: 'Enter YouTube Video URL',
border: OutlineInputBorder(),
),
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
await _requestPermissions();
},
child: Text('Download Video'),
),
],
),
);
}
}
在这个示例中,我们首先请求存储权限,然后用户输入YouTube视频的URL,点击“Download Video”按钮后,将尝试下载视频并显示下载进度或错误信息。
注意:由于YouTube的服务条款可能限制或禁止视频下载,因此使用此类插件可能涉及法律和版权问题。请确保你的应用使用符合相关法律和YouTube服务条款的方式下载视频。