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

Android Studio模拟器可播放音频,LG ARISTO 2 PLUS真机无法播放

解决LG ARISTO 2 PLUS真机上MediaPlayer无法播放音频的问题

我看了你的代码,模拟器正常但真机没声音,大概率是MediaPlayer资源管理不当或者设备兼容性的问题,下面给你一步步排查和修复的方案:

一、先排查设备基础问题

  • 检查LG手机的音量设置:确保媒体音量没有调到0,也没有开启侧边的静音开关,部分机型会单独区分媒体音量和铃声音量。
  • 验证音频文件兼容性:把alarm.mp3换成一个编码更通用的MP3文件(比如比特率128kbps、采样率44.1kHz的标准格式),低端设备对高比特率或特殊编码的MP3支持度可能较差。

二、修复MediaPlayer的生命周期管理

你的代码里存在几个资源管理的漏洞,这在真机上很容易导致播放失败:

  1. 每次点击select都重新创建MediaPlayer,但之前的实例没有释放,会造成资源泄漏。
  2. 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)这类错误码,可以精准定位问题(比如音频解码失败、资源加载异常等)。

四、测试验证

  1. 替换成标准MP3文件后重新打包APK安装到真机。
  2. 按照修改后的代码重新运行,测试倒计时结束后的播放功能。
  3. 检查LogCat是否有MediaPlayer相关的报错信息,进一步定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:31:48