我正试图通过最大音量的警报通道通过扬声器发出警报声.为此,我正在使用AudioManager和MediaPlayer.如果我插入耳机,仍然会通过扬声器播放闹钟,但是通过扬声器播放的闹钟音量会急剧下降,因此无法满足我的需要.
有没有办法防止音量下降?
我正在使用的代码是这样的:
public void startAlarmSound() {
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setSpeakerphoneOn(false);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), 0);
if (!alreadyPlaying)
playAlarmSound();
alreadyPlaying = true;
}
private void playAlarmSound() {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
try {
mediaPlayer.setDataSource(this, Uri.parse("android.resource://com.mystuff.mine/" + R.raw.alarm_sound));
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
为了确保音量没有降低,我每隔5秒调用一次以下音量.
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), 0);
Run Code Online (Sandbox Code Playgroud)
我位于欧盟内部,所以它可能是由插入耳机时处理最大音量的规则引起的.由于我只关心扬声器输出,我需要一个解决方法,即使是这种情况.
编辑:
我的应用程序以及系统应用程序(如闹钟)以及Nexus 5和6都会出现此问题.因为我还从其他手机制造商那里阅读了该问题的报告,所以我不认为问题是nexus系列手机所独有的.我需要一个解决方法.
我刚检查了getStreamMaxVolume(AudioManager.STREAM_ALARM)和getStreamVolume(AudioManager.STREAM_ALARM)的结果.两者都显示7,无论耳机是否插入.
我注意到插入耳机时,音量指示器设置为最大,如果我减小并快速再次增加,它将增加到没有耳机时的音量.然而,由于这需要用户交互,这不是我正在寻找的解决方案.
android volume alarm android-mediaplayer android-audiomanager
我的代码可以编译并且可以在调试模式下正常运行,但是一旦我使用了带有minifyEnabled true的构建配置,就会收到以下警告,它们会阻止编译:
警告:有100个未解决的对类或接口的引用。
警告:有2个未解决的对程序类成员的引用。
出于可读性考虑,我将在底部包括完整的输出。有两个导致这些警告的库,springframework和jackson。这些库通过gradle包含在我的项目中,如下所示:
compile 'com.fasterxml.jackson.core:jackson-annotations:2.8.5'
compile 'com.fasterxml.jackson.core:jackson-core:2.8.5'
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.5'
apt "org.androidannotations:rest-spring:$AAVersion"
compile "org.androidannotations:rest-spring-api:$AAVersion"
compile 'org.springframework.android:spring-android-rest-template:2.0.0.M3'
Run Code Online (Sandbox Code Playgroud)
如果我对这两个库都使用-dontwarn,就像许多人对这类问题的建议那样,则该应用程序可以编译,但在启动过程中会由于混淆的崩溃日志而崩溃-我尝试使用映射文件对其进行跟踪,但这都不起作用-我为了合理地确定应用程序在初始化杰克逊映射类时由于自动生成的(通过android注释)类RestClient_而崩溃,例外情况如下:
java.lang.NoSuchFieldError:没有类型为Lcom / myapp / app / mv $ a的静态字段PUBLIC_ONLY;在Lcom / myapp / app / mv $ a类中;或其超类(在/data/app/com.myapp.app-1/base.apk中显示“ com.myapp.app.mv $ a”的声明)
尽管在其他电话上,该异常没有消息。很明显,这是proguard的结果。
我的完整proguard文件可以在这里找到https://gist.github.com/Syzygy2048/02a44032611d40720bad36b5e3b37db6
这是我已经尝试过的几件事(我尝试了更多,但过一会儿才开始写下来)。尝试着重于首先固定弹簧框架。(必须将其概括为要点,因为stackoverflow不会让我发帖)
https://gist.github.com/Syzygy2048/f1bdabc9f2ea091aa8faec67c62dd8bb
完整的错误日志:
simpleframework.xml.Serializer警告:有100个未解决的对类或接口的引用。警告:有2个未解决的对程序类成员的引用。警告:处理任务java.io.IOException时发生异常:请首先更正以上警告。错误:任务':myappApp:transformClassesAndResourcesWithProguardForMyappPublicRelease'的执行失败。作业失败,请参阅日志以获取详细信息信息:构建失败信息:总时间:23.68秒信息:1错误信息:59警告信息:请参阅控制台中的完整输出 请首先更正以上警告。错误:任务':myappApp:transformClassesAndResourcesWithProguardForMyappPublicRelease'的执行失败。作业失败,请参阅日志以获取详细信息信息:构建失败信息:总时间:23.68秒信息:1错误信息:59警告信息:请参阅控制台中的完整输出 请首先更正以上警告。错误:任务':myappApp:transformClassesAndResourcesWithProguardForMyappPublicRelease'的执行失败。作业失败,请参阅日志以获取详细信息信息:构建失败信息:总时间:23.68秒信息:1错误信息:59警告信息:请参阅控制台中的完整输出