【问题标题】:Play a Sound When Making a Selection in Settings (Android App)在设置中进行选择时播放声音(Android 应用程序)
【发布时间】:2021-05-22 13:01:41
【问题描述】:

我的 Android 应用中有一个设置活动,可以从 res/raw 文件夹中的文件中选择声音。还有其他设置,但 settings_pref.xml 文件的基本部分是

    <PreferenceCategory android:title="Pager Tone">

    <ListPreference
        android:defaultValue="pager1"
        android:entries="@array/pagerName"
        android:entryValues="@array/pagerFile"
        android:key="pagerSound"
        android:title="Select Pager Tone"
        app:useSimpleSummaryProvider="true" />

</PreferenceCategory>

那么SettingsFragment.java就是

import android.os.Bundle;
import androidx.preference.PreferenceFragmentCompat;

public class SettingsFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.settings_pref, rootKey);
    }
}

简单。它有效。现在我想在用户选择它时播放一个简短的声音样本。这就是我要摆脱困境的地方。我一直在尝试我在互联网上找到的各种建议,但我还没有任何工作。

我发现最好看的选项是将 SettingsFragment.java 更改为此

import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;

public class SettingsFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.settings_pref, rootKey);

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
        String pagerTone =  sharedPreferences.getString("pagerSound", "");
        Resources res = this.getResources();
        int soundId = res.getIdentifier(pagerTone, "raw", "cgpagerdev");
        MediaPlayer player = MediaPlayer.create(getContext(), soundId);
        AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

        int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        int Volume = (int) (maxVolume * 0.2);

        mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, Volume,AudioManager.FLAG_SHOW_UI + AudioManager.FLAG_PLAY_SOUND);
        player.start();
    }

}

我不知道它是否真的可以工作,因为 Android Studio 给出了以下错误:

无法解析“SettingsFragment”中的方法“getSystemService”

遵循 Android Studio 的任何建议似乎都会产生其他错误消息。另一个地方的类似代码可以正常工作,所以我看不出这里出了什么问题。我知道我必须添加一些东西才能让声音再次停止(也许是一个计时器将其限制为 1 或 2 秒),但我只想让它首先工作。

【问题讨论】:

    标签: android sharedpreferences android-mediaplayer android-preferences


    【解决方案1】:

    getSystemServiceContext(1)类的方法

    Activity 扩展了Context,因此您可以从活动中调用该方法。 Fragment 不扩展任何内容,因此您需要通过在 Fragment 中调用 getContextrequireContext 来获取上下文,然后调用 getSystemService

    AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
    

    【讨论】:

    • 太棒了。向前迈出了一大步,但这让我遇到了一个新问题。 Android Studio 不再引发问题,但进入设置活动会使应用程序崩溃。通过排除,我发现整数 soundId 存在问题。 int soundId ..... 行很好,但 MediaPlayer 行会导致崩溃。替换应该显示 soundId 值的 Toast 也会使其崩溃,因此我假设它使用了导致问题的 soundId。
    • 那是一个完全不同的问题。刚开始一个关于这个问题的新的。您确定 soundId 是有效的标识符吗?
    • 公平点。最终,我通过大量的杂耍和谷歌搜索得到了一个解决方案,因此无需提出新问题。谢谢。
    • 实际上我在上面的评论中提到的解决方案只是部分起作用。所以我会开始一个新的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多