如何解决ExoPlayer开发Android视频播放器时触发NoSuchMethodError导致应用崩溃问题
问题根因
你遇到的java.lang.NoSuchMethodError错误是ExoPlayer版本不兼容导致的,通常是项目依赖的ExoPlayer核心库和UI组件库(exoplayer-ui)版本不一致,或者旧版API写法搭配了新版ExoPlayer导致接口被移除。
解决方案
1. 统一依赖版本
打开项目模块级的build.gradle文件,确保所有exoplayer相关依赖的版本完全一致,示例如下:
// 所有exoplayer依赖版本必须完全相同,此处以2.18.1为例 implementation "com.google.android.exoplayer:exoplayer-core:2.18.1" implementation "com.google.android.exoplayer:exoplayer-ui:2.18.1" implementation "com.google.android.exoplayer:exoplayer-hls:2.18.1"
如果不想修改现有代码,可以将所有ExoPlayer依赖统一降级到2.15.1版本,该版本仍支持你当前使用的ExoPlayerFactory和旧版EventListener接口。
2. 修正新版API写法
如果你使用2.16及以上版本的ExoPlayer,原有ExoPlayerFactory、监听注册等API已经废弃,修正后的iniPlayer代码如下:
@Override protected void onStart() { super.onStart(); iniPlayer(); } private void iniPlayer() { String videoUrl = "https://torrent243454.herokuapp.com/stream/magnet%3A%3Fxt%3Durn%3Abtih%3A65046701a31f23b2bb7e6d38537ca8498970d1ff%26dn%3DMortal.Kombat.Legends.Battle.of.the.Realms.2021.HDRip.XviD.AC3-EVO%26xl%3D1453573916%26tr%3Dudp%253A%252F%252Ftracker.opentrackr.org%3A1337%2Fannounce%26tr%3Dudp%253A%252F%252Ftracker.internetwarriors.net%3A1337%2Fannounce%26tr%3Dudp%253A%252F%252Fopentor.org%3A2710%2Fannounce%26tr%3Dudp%253A%252F%252F9.rarbg.me%3A2980%2Fannounce%26tr%3Dudp%253A%252F%252F9.rarbg.to%3A2940%2Fannounce%26tr%3Dudp%253A%252F%252Ftracker.uw0.xyz%3A6969%2Fannounce%26tr%3Dudp%253A%252F%252Fopen.stealth.si%3A80%2Fannounce%26tr%3Dudp%253A%252F%252Ftracker.torrent.eu.org%3A451%2Fannounce%26tr%3Dudp%253A%252F%252Fipv4.tracker.harry.lu%3A80%2Fannounce%26tr%3Dudp%253A%252F%252Ftracker.openbittorrent.com%3A1337%2Fannounce%26tr%3Dudp%253A%252F%252Fexodus.desync.com%3A6969%2Fannounce%26tr%3Dudp%253A%252F%252Fexplodie.org%3A6969%2Fannounce%26tr%3Dudp%253A%252F%252Ftracker.tiny-vps.com%3A6969%2Fannounce%26tr%3Dudp%253A%252F%252Ftracker.moeking.me%3A6969%2Fannounce%26tr%3Dudp%253A%252F%252Ftracker.cyberia.is%3A6969%2Fannounce?file=Mortal.Kombat.Legends.Battle.of.the.Realms.2021.HDRip.XviD.AC3-EVO%2FMortal.Kombat.Legends.Battle.of.the.Realms.2021.HDRip.XviD.AC3-EVO.avi"; Uri uri = Uri.parse(videoUrl); SimpleExoPlayerView playerView = findViewById(R.id.player_view); // 新版ExoPlayer实例创建方式 TrackSelector trackSelector = new DefaultTrackSelector(this); SimpleExoPlayer simpleExoPlayer1 = new SimpleExoPlayer.Builder(this) .setTrackSelector(trackSelector) .build(); DefaultHttpDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory() .setUserAgent("exoplayer_video"); MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory) .createMediaSource(uri); playerView.setPlayer(simpleExoPlayer1); playerView.setKeepScreenOn(true); simpleExoPlayer1.setMediaSource(mediaSource); simpleExoPlayer1.prepare(); simpleExoPlayer1.setPlayWhenReady(true); // 新版事件监听写法 simpleExoPlayer1.addListener(new Player.Listener() { @Override public void onTimelineChanged(Timeline timeline, int reason) { Player.Listener.super.onTimelineChanged(timeline, reason); } @Override public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) { Player.Listener.super.onTracksChanged(trackGroups, trackSelections); } @Override public void onIsLoadingChanged(boolean isLoading) { Player.Listener.super.onIsLoadingChanged(isLoading); } @Override public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { if (playbackState == Player.STATE_BUFFERING){ // 自定义缓冲逻辑 } } @Override public void onPlayerError(PlaybackException error) { Player.Listener.super.onPlayerError(error); } }); }
3. 清理缓存重构建
修改完成后,依次点击Android Studio菜单的Build -> Clean Project、Rebuild Project,完全卸载测试设备上的旧应用后重新安装运行,避免旧缓存影响。
内容的提问来源于stack exchange,提问作者IMBROS TV
相关产品推荐
相关产品推荐

