Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

I'm using the audioplayers plugin version 6.0.0. It performs well on an actual iOS device. However, I encountered an error on Android. #1784

Open
xiaoguaishou1 opened this issue Apr 3, 2024 · 1 comment

Comments

@xiaoguaishou1
Copy link

xiaoguaishou1 commented Apr 3, 2024

E/MediaPlayerNative(13002): error (1, -2147483648)
E/MediaPlayer(13002): Error (1,-2147483648)
E/MediaPlayerNative(13002): error (1, -2147483648)
E/MediaPlayer(13002): Error (1,-2147483648)TimeoutException (TimeoutException after 0:00:30.000000: Future not completed)

// ios18+iphpne 13
// I encountered an error on Android.

dart code
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:audioplayers/audioplayers.dart';

class Song extends StatefulWidget {
  const Song({super.key});

  @override
  State<Song> createState() => _SongState();
}

class _SongState extends State<Song> {
  //播放器实例
  late AudioPlayer player = AudioPlayer();

  @override
  void initState() {
    super.initState();
    player = AudioPlayer();

    player.setReleaseMode(ReleaseMode.stop);

    // Start the player as soon as the app is displayed.
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      // http://downsc.chinaz.net/Files/DownLoad/sound1/201906/11582.mp3'

      // 加载网络音乐资源
      await player.setSource(UrlSource(
          'http://m10.music.126.net/20240403104728/0b83b6d1d2ecd36a43442d3af109ad58/ymusic/5353/0f0f/0358/d99739615f8e5153d77042092f07fd77.mp3'));

      await player.resume();
    });
  }

  @override
  void dispose() {
    player.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Container(
            width: MediaQuery.of(context).size.width - 64,
            padding:
                const EdgeInsets.only(top: 8, left: 8, right: 16, bottom: 8),
            clipBehavior: Clip.antiAlias,
            decoration: ShapeDecoration(
              color: Colors.white,
              shape: RoundedRectangleBorder(
                side: const BorderSide(width: 1, color: Color(0xFFCCD8E5)),
                borderRadius: BorderRadius.circular(12),
              ),
              shadows: const [
                BoxShadow(
                  color: Color(0x14031425),
                  blurRadius: 42,
                  offset: Offset(0, 0),
                  spreadRadius: 0,
                )
              ],
            ),
            child: GestureDetector(
              onTap: () {
                Navigator.pushNamed(context, '/onPlay');
              },
              child: PlayerWidget(player: player),
            )),
      ],
    );
  }
}

class PlayerWidget extends StatefulWidget {
  final AudioPlayer player;

  const PlayerWidget({
    required this.player,
    super.key,
  });

  @override
  State<StatefulWidget> createState() {
    return _PlayerWidgetState();
  }
}

class _PlayerWidgetState extends State<PlayerWidget> {
  PlayerState? _playerState;
  Duration? _duration;
  Duration? _position;

  StreamSubscription? _durationSubscription;
  StreamSubscription? _positionSubscription;
  StreamSubscription? _playerCompleteSubscription;
  StreamSubscription? _playerStateChangeSubscription;

  bool get _isPlaying => _playerState == PlayerState.playing;

  bool get _isPaused => _playerState == PlayerState.paused;

  String get _durationText => _duration?.toString().split('.').first ?? '';

  String get _positionText => _position?.toString().split('.').first ?? '';

  AudioPlayer get player => widget.player;

  @override
  void initState() {
    super.initState();
    // Use initial values from player
    _playerState = player.state;
    player.getDuration().then(
          (value) => setState(() {
            _duration = value;
          }),
        );
    player.getCurrentPosition().then(
          (value) => setState(() {
            _position = value;
          }),
        );
    _initStreams();
  }

  @override
  void setState(VoidCallback fn) {
    if (mounted) {
      super.setState(fn);
    }
  }

  @override
  void dispose() {
    _durationSubscription?.cancel();
    _positionSubscription?.cancel();
    _playerCompleteSubscription?.cancel();
    _playerStateChangeSubscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final color = Theme.of(context).primaryColor;
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        SizedBox(
          width: double.infinity,
          child: Row(
            mainAxisSize: MainAxisSize.min,
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Container(
                width: 48,
                height: 48,
                decoration: ShapeDecoration(
                  image: const DecorationImage(
                    image: AssetImage('assets/images/song1.png'),
                    fit: BoxFit.fill,
                  ),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(8)),
                ),
              ),
              const SizedBox(width: 8),
              Expanded(
                child: Container(
                  padding: const EdgeInsets.symmetric(vertical: 4),
                  child: const Column(
                    mainAxisSize: MainAxisSize.min,
                    mainAxisAlignment: MainAxisAlignment.start,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      SizedBox(
                        width: double.infinity,
                        child: Text(
                          'Hidup seperti ini',
                          style: TextStyle(
                            color: Color(0xFF112022),
                            fontSize: 14,
                            fontFamily: 'Poppins',
                            fontWeight: FontWeight.w500,
                            letterSpacing: -0.28,
                          ),
                        ),
                      ),
                      SizedBox(height: 4),
                      SizedBox(
                        width: double.infinity,
                        child: Text(
                          'James adam',
                          style: TextStyle(
                            color: Color(0xFF93989D),
                            fontSize: 12,
                            fontFamily: 'Poppins',
                            fontWeight: FontWeight.w400,
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ),
              const SizedBox(width: 8),
              Row(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  !_isPlaying
                      ? IconButton(
                          key: const Key('play_button'),
                          onPressed: _isPlaying ? null : _play,
                          iconSize: 30,
                          icon: const Icon(Icons.play_arrow),
                          color: color,
                        )
                      : IconButton(
                          key: const Key('pause_button'),
                          onPressed: _isPlaying ? _pause : null,
                          iconSize: 30,
                          icon: const Icon(Icons.pause),
                          color: color,
                        ),
                ],
              ),
              const SizedBox(width: 8),
              const SizedBox(
                width: 24,
                height: 24,
                child: Row(
                  mainAxisSize: MainAxisSize.min,
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    SizedBox(
                      width: 24,
                      height: 24,
                      child: Stack(children: [
                        //icon 喇叭
                        Icon(
                          Icons.volume_up_rounded,
                          color: Color.fromARGB(255, 7, 7, 7),
                          size: 24,
                        )
                      ]),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
        Row(
          children: [
            SizedBox(
              width: 180,
              child: Slider(
                onChanged: (value) {
                  final duration = _duration;
                  if (duration == null) {
                    return;
                  }
                  final position = value * duration.inMilliseconds;
                  player.seek(Duration(milliseconds: position.round()));
                },
                value: (_position != null &&
                        _duration != null &&
                        _position!.inMilliseconds > 0 &&
                        _position!.inMilliseconds < _duration!.inMilliseconds)
                    ? _position!.inMilliseconds / _duration!.inMilliseconds
                    : 0.0,
              ),
            ),
            Text(
              _position != null
                  ? '$_positionText / $_durationText'
                  : _duration != null
                      ? _durationText
                      : '00:00:00/00:00:00',
              style: const TextStyle(fontSize: 13.0),
            ),
          ],
        ),
      ],
    );
  }

  void _initStreams() {
    _durationSubscription = player.onDurationChanged.listen((duration) {
      setState(() => _duration = duration);
    });

    _positionSubscription = player.onPositionChanged.listen(
      (p) => setState(() => _position = p),
    );

    _playerCompleteSubscription = player.onPlayerComplete.listen((event) {
      setState(() {
        _playerState = PlayerState.stopped;
        _position = Duration.zero;
      });
    });

    _playerStateChangeSubscription =
        player.onPlayerStateChanged.listen((state) {
      setState(() {
        _playerState = state;
      });
    });
  }

  Future<void> _play() async {
    //加载音乐资源
    await player.resume();
    print('resume');
    setState(() => _playerState = PlayerState.playing);
  }

  Future<void> _pause() async {
    await player.pause();
    print('pause');
    setState(() => _playerState = PlayerState.paused);
  }

  Future<void> _stop() async {
    await player.stop();
    setState(() {
      _playerState = PlayerState.stopped;
      _position = Duration.zero;
    });
  }
}
@mishra-gunu
Copy link

have you found any solution >?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants