ゲームにゲーム内のサウンドトラックが含まれているため、ユーザーがAndroidやiOSのメディアアプリから自分の音楽を再生している場合に音楽を一時停止します。ユーザーが他のアプリから音楽を再生しているかどうかを検出する
これを行う方法は、update()関数で実行するのに十分効率的ですか?
ありがとうございます!
ゲームにゲーム内のサウンドトラックが含まれているため、ユーザーがAndroidやiOSのメディアアプリから自分の音楽を再生している場合に音楽を一時停止します。ユーザーが他のアプリから音楽を再生しているかどうかを検出する
これを行う方法は、update()関数で実行するのに十分効率的ですか?
ありがとうございます!
他のアプリがオーディオフォーカスを取得または放棄したときにアプリケーションが受け取るコールバックonAudioFocusChange()を実装する必要があります。
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC,
// Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// Start playback
}
とコールバック自体:
AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
// Permanent loss of audio focus
// Pause playback immediately
} else if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT) {
// Pause playback
} else if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
// Lower the volume, keep playing
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Your app has been granted audio focus again
// Raise volume to normal, restart playback if necessary
}
}
この公式ガイド上を見てみましょう:Handling Changes in Audio Output
thisポストから説明するように音楽が再生されているかどうかをチェックすることができます。
AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
if(manager.isMusicActive())
{
// do something - or do it not
}
その後、AndroidJavaClass
APIの助けを借りてのC#から呼び出すJavaでクラスのまわりでそれをラップします。
しかし、これにはJavaが必要です。あなたはそのコードを取って、Javaを使わずにC#に変換することができます。 UnityPlayerPlayer、アクティビティ、コンテキストを取得します。残りはAndroidJavaClass
で処理できます。
ここには、Javaプラグインを必要としない移植されたC#のバージョンがあります。
bool isMusicPlaying()
{
const string AUDIO_SERVICE = "audio";
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");
bool mIsPlaying;
using (AndroidJavaObject audioManager = unityContext.Call<AndroidJavaObject>("getSystemService", AUDIO_SERVICE))
{
mIsPlaying = audioManager.Call<bool>("isMusicActive");
}
return mIsPlaying;
}
何らかの理由で再トライニングが正しく行われますか? – Tiaan
こんにちは、そのコードが動作するはずです。私はこれについて少し研究し、これがUnityのバグだと分かりました。 [this](https://answers.unity3d.com/questions/984710/detect-if-music-is-playing-in-other-apps-on-androi.html)と[this](https:// issuetracker.unity3d.com/issues/android-native-android-method-audiomanager-dot-ismusicactive-always-returns-true)。バグ報告のファイル。 – Programmer