Android Studio模拟器可播放音频,LG ARISTO 2 PLUS真机无法播放
解决LG ARISTO 2 PLUS真机上MediaPlayer无法播放音频的问题
我看了你的代码,模拟器正常但真机没声音,大概率是MediaPlayer资源管理不当或者设备兼容性的问题,下面给你一步步排查和修复的方案:
一、先排查设备基础问题
- 检查LG手机的音量设置:确保媒体音量没有调到0,也没有开启侧边的静音开关,部分机型会单独区分媒体音量和铃声音量。
- 验证音频文件兼容性:把
alarm.mp3换成一个编码更通用的MP3文件(比如比特率128kbps、采样率44.1kHz的标准格式),低端设备对高比特率或特殊编码的MP3支持度可能较差。
二、修复MediaPlayer的生命周期管理
你的代码里存在几个资源管理的漏洞,这在真机上很容易导致播放失败:
- 每次点击
select都重新创建MediaPlayer,但之前的实例没有释放,会造成资源泄漏。 stop方法调用后没有释放MediaPlayer,下次播放可能无法正常初始化。
修改后的优化代码:
import android.media.MediaPlayer; import android.os.CountDownTimer; import android.view.View; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { TextView plainText; TextView textView; MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 提前初始化控件引用,避免每次点击都重复查找 plainText = findViewById(R.id.editText); textView = findViewById(R.id.textView); } public void select(View view) { // 先释放之前的MediaPlayer实例(如果存在),避免资源泄漏 if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } try { int time = Integer.parseInt(plainText.getText().toString()); int milliSecond = time * 1000; // 初始化MediaPlayer并设置播放完成监听,自动释放资源 mediaPlayer = MediaPlayer.create(this, R.raw.alarm); mediaPlayer.setOnCompletionListener(mp -> { if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } }); new CountDownTimer(milliSecond, 1000) { @Override public void onTick(long millisUnitFinished) { textView.setText("0.0" + String.valueOf(millisUnitFinished / 1000)); } public void onFinish() { textView.setText("Times Up!"); // 播放前检查MediaPlayer状态,避免空指针或重复播放 if (mediaPlayer != null && !mediaPlayer.isPlaying()) { mediaPlayer.start(); } } }.start(); } catch (NumberFormatException e) { Toast.makeText(this, "Enter Value in integer Only", Toast.LENGTH_LONG).show(); } } public void stop(View view) { if (mediaPlayer != null) { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); } // 停止播放后必须释放资源,否则下次初始化会失败 mediaPlayer.release(); mediaPlayer = null; textView.setText("Stopped"); } } // Activity销毁时强制释放MediaPlayer,彻底避免资源泄漏 @Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } } }
三、额外排查点
- 检查应用权限:虽然播放raw目录下的本地资源不需要存储权限,但部分定制系统可能有特殊限制,你可以在
AndroidManifest.xml里添加(非必需,但可以尝试):<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> - 调试真机日志:连接真机到Android Studio,查看LogCat中
MediaPlayer相关的错误日志,比如Error (-38,0)这类错误码,可以精准定位问题(比如音频解码失败、资源加载异常等)。
四、测试验证
- 替换成标准MP3文件后重新打包APK安装到真机。
- 按照修改后的代码重新运行,测试倒计时结束后的播放功能。
- 检查LogCat是否有MediaPlayer相关的报错信息,进一步定位问题。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

