2017-06-03 4 views
1

Mein Spiel hat einen Soundtrack im Spiel und ich möchte die Musik pausieren, wenn der Benutzer eigene Musik aus einer Medien-App auf Android oder iOS spielt.Erkennen, ob Benutzer Musik von einer anderen App aus spielt

Gibt es eine Möglichkeit, dies zu tun, die effizient genug ist, um in einer update() - Funktion zu laufen?

Vielen Dank im Voraus!

Antwort

1

Sie müssen den Callback onAudioFocusChange() implementieren, den Ihre App erhält, wenn eine andere App den Audiofokus aktiviert oder deaktiviert.

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 
} 

Und der Rückruf selbst:

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 
    } 
} 

Werfen Sie einen Blick auf dieser offiziellen Führer: Handling Changes in Audio Output

4

können Sie überprüfen, ob Musik von this Post wie beschrieben abgespielt wird.

AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 
if(manager.isMusicActive()) 
{ 
    // do something - or do it not 
} 

es in Java um eine Klasse Wickeln Sie es dann mit Hilfe der AndroidJavaClass API von C# aufrufen.


Aber das erfordert Java. Sie können diesen Code verwenden und ihn ohne Java in C# konvertieren. Ruft UnityPlayerPlayer, Aktivität und dann den Kontext auf. Der Rest kann von AndroidJavaClass gehandhabt werden.

Hier ist die portierte C# -Version, die kein Java-Plugin benötigt.

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; 
} 
+0

Aus irgendeinem Grund bleibt Retruning wahr? – Tiaan

+1

Hallo, dieser Code soll funktionieren. Ich habe ein bisschen darüber recherchiert und herausgefunden, dass dies ein Fehler von Unity ist. Siehe [this] (https://answers.unity3d.com/questions/984710/detect-if-music-is-play-in-other-apps-on-androi.html) und [dies] (https: // ittetracker.unity3d.com/issues/android-native-android-method-audiomanager-dot-ismicactive-always-returns-true). Datei für einen Fehlerbericht. – Programmer

Verwandte Themen