You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关闭前台运行react-native-track-player的App时偶现崩溃问题求助

问题描述

开发基于react-native-track-player的App时,关闭App偶尔会触发Android系统提示「App Name keeps stopping」,设备反馈的崩溃日志如下:

Report Type: Crash
Package name: com.myApp

Package version: 1004
Package version name: 1.0.0
Installed by: com.android.vending
Process name: com.myApp
Time: Monday, 3 April 2023
System app: false
System: 
  Device: a02
  Build type: user
  Model: SM-M022G
Product: a02ins
SDK version: 30
Release: 11
Codename: REL
Crash:
  Exception class name: java.lang.NumberFormatException
  Source file: Integer.java
  Source class: java.lang.Integer
  Source method: parseInt
  Line number: 615
  Stack trace: 
    java.lang.numberformatexception: For input string: "null" 
    at java.lang.Integer.parseInt(Integer.java: 615) 
    at java.lang.Integer.parseInt(Integer.java: 650) 
    at com.doublesymmetry.trackplayer.module.MusicModule$q.m(Unknown Source:64)
    at g8.a.e(Unknown Source:11)
    at w8.u0.run(Unknown Source:129)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:246)
    at android.app.Handler.ActivityThread.main(ActivityThread.java:8633)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
    Suppressed: w8.s0: [b2{Cancelling}@183e27f, Dispatchers.Main]

相关代码如下:

./index.js(PlaybackService注册)

import {AppRegistry} from 'react-native';
import TrackPlayer from 'react-native-track-player';

import {PlaybackService} from './service';
import App from './App';
import {name as appName} from './app.json';

AppRegistry.registerComponent(appName, () => App);
TrackPlayer.registerPlaybackService(() => PlaybackService);

./service.js(PlaybackService实现)

import TrackPlayer, {Event} from 'react-native-track-player';

export const PlaybackService = async function () {
  TrackPlayer.addEventListener(Event.RemotePlay, () => TrackPlayer.play());
  TrackPlayer.addEventListener(Event.RemotePause, () => TrackPlayer.pause());
};

./App.js(TrackPlayer初始化)

const track = {
  id: 0,
  url: 'https://streaming.test.net:12345/auto-dj',
  title: 'ShoutCast Stream',
  artist: 'React Native',
  genre: 'ShoutCast Stream',
  artwork: 'https://d33l68.cloudfront.net/5540b349/ecfc9/img/header_logo.svg',
};

const setUpTrackPlayer = async track => {
  try {
    await TrackPlayer.setupPlayer();
    await TrackPlayer.updateOptions({
      stopWithApp: true,
      android: {
        appKilledPlaybackBehavior:
          AppKilledPlaybackBehavior.StopPlaybackAndRemoveNotification,
      },
      capabilities: [Capability.Play, Capability.Pause],
      compactCapabilities: [Capability.Play, Capability.Pause],
    });
    await TrackPlayer.add([track]);
    TrackPlayer.play();
  } catch (err) {
    console.error(`Could not setup track player. ${err}`);
    TrackPlayer.remove();
  }
};

useEffect(() => {
  setUpTrackPlayer(track);

  return () => {
    TrackPlayer.remove();
  };
}, []);
解决方案

针对崩溃日志中的java.lang.NumberFormatException: For input string: "null"问题,可通过以下步骤修复:

1. 修正Track的ID类型

react-native-track-player推荐Track ID使用字符串类型,避免数字ID在App关闭时被原生层误处理为"null"字符串。修改track定义:

const track = {
  id: '0', // 将数字0改为字符串'0'
  url: 'https://streaming.test.net:12345/auto-dj',
  title: 'ShoutCast Stream',
  artist: 'React Native',
  genre: 'ShoutCast Stream',
  artwork: 'https://d33l68.cloudfront.net/5540b349/ecfc9/img/header_logo.svg',
};

2. 完善组件卸载时的异步清理逻辑

当前清理函数未处理异步操作,可能导致App关闭时播放器资源未正确释放。改为异步清理流程:

useEffect(() => {
  setUpTrackPlayer(track);

  return async () => {
    try {
      await TrackPlayer.pause(); // 先暂停播放
      await TrackPlayer.reset(); // 重置播放器状态
      await TrackPlayer.destroy(); // 销毁播放器实例
    } catch (err) {
      console.error('清理TrackPlayer失败:', err);
    }
  };
}, []);

3. 优化PlaybackService的事件监听管理

添加事件监听器的移除逻辑,避免App关闭时服务仍持有无效引用:

// ./service.js
import TrackPlayer, { Event } from 'react-native-track-player';

export const PlaybackService = async function () {
  // 保存监听器引用
  const playListener = TrackPlayer.addEventListener(Event.RemotePlay, () => TrackPlayer.play());
  const pauseListener = TrackPlayer.addEventListener(Event.RemotePause, () => TrackPlayer.pause());

  // 监听服务销毁事件,移除所有监听器
  const destroyListener = TrackPlayer.addEventListener(Event.ServiceDestroy, () => {
    playListener.remove();
    pauseListener.remove();
    destroyListener.remove();
  });
};

4. 修复配置项的导入缺失

确保AppKilledPlaybackBehavior已正确导入,避免运行时错误:

// 在App.js顶部补充导入
import TrackPlayer, { Capability, AppKilledPlaybackBehavior } from 'react-native-track-player';

额外建议

检查并升级react-native-track-player到最新稳定版,部分旧版本存在原生层解析ID的bug,升级后可避免此类问题。

内容的提问来源于stack exchange,提问作者Manil Malla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:20:04