Flutter iOS项目中MEGA.nz API登录异常问题求助
解决MEGA.nz登录判断错误的问题
你的代码仅通过HTTP状态码200判定登录成功,但MEGA的API即使登录失败也会返回200状态码,实际错误信息藏在响应体的JSON结构里。另外你的代码存在语法错误(301判断分支缺失闭合括号),修正后的代码如下:
TextEditingController emailController = TextEditingController(); TextEditingController passwordController = TextEditingController(); void login(String email, String password) async { try { final response = await http.post( Uri.parse('https://g.api.mega.co.nz/cs'), headers: { 'Content-Type': 'application/json', }, body: jsonEncode({ 'a': 'us', 'user': email, 'password': password }), ); if (response.statusCode == 200) { var data = jsonDecode(response.body); // MEGA API响应为数组,第一个元素是错误码:0=成功,负数=失败 if (data is List && data.isNotEmpty) { if (data[0] == 0) { print('Login successfully: $data'); // 保存会话sid,后续请求必须携带该参数 String sessionId = data[1]['sid']; } else { print('Login failed: ${data[1]}'); } } else { print('Unexpected response format'); } } else if(response.statusCode == 301) { print('Redirected to: ${response.headers['Location']}'); } else { print('Failed login: ${response.statusCode} ${response.body}'); } } catch (e) { print('Error: $e'); } }
获取账号下的视频文件夹
登录成功后,携带会话ID调用f接口获取全量文件/文件夹列表,再筛选出视频相关文件夹:
Future<void> getVideoFolders(String sessionId) async { try { final response = await http.post( Uri.parse('https://g.api.mega.co.nz/cs'), headers: { 'Content-Type': 'application/json', }, body: jsonEncode({ 'a': 'f', 'c': 1, // 标识获取所有文件/文件夹 'sid': sessionId, }), ); if (response.statusCode == 200) { var data = jsonDecode(response.body); if (data is List && data[0] == 0) { List<dynamic> files = data[1]; List<dynamic> videoFolders = []; for (var file in files) { // t=1代表是文件夹,后续可调用接口查询文件夹内文件,筛选.avi后缀的内容 if (file['t'] == 1) { videoFolders.add(file); } } print('Video folders: $videoFolders'); } else { print('Failed to get files: ${data[1]}'); } } } catch (e) { print('Error: $e'); } }
支持AVI格式的Flutter视频播放器
iOS原生播放器对AVI支持有限,推荐使用基于VLC的flutter_vlc_player库,它能兼容绝大多数视频格式:
- 在
pubspec.yaml添加依赖:
dependencies: flutter_vlc_player: ^7.0.0 # 请使用最新版本
- iOS配置:修改
ios/Podfile的最低版本要求:
platform :ios, '12.0'
执行pod install完成配置
- 基础使用示例:
import 'package:flutter_vlc_player/flutter_vlc_player.dart'; class VideoPlayerScreen extends StatefulWidget { final String videoUrl; // 传入MEGA接口获取的解密后临时下载链接 const VideoPlayerScreen({super.key, required this.videoUrl}); @override State<VideoPlayerScreen> createState() => _VideoPlayerScreenState(); } class _VideoPlayerScreenState extends State<VideoPlayerScreen> { late VlcPlayerController _controller; @override void initState() { super.initState(); _controller = VlcPlayerController.network( widget.videoUrl, options: VlcPlayerOptions(), ); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: VlcPlayer( controller: _controller, aspectRatio: 16/9, placeholder: const Center(child: CircularProgressIndicator()), ), ); } }
注意:MEGA的视频文件需先调用g接口获取解密后的临时下载链接,不能直接使用文件ID访问。
内容的提问来源于stack exchange,提问作者Mario Dragon Ball789
相关产品推荐
相关产品推荐

