Musik während Telefonat pausieren / stoppen

P

PerfectChaos

Neues Mitglied
0
Hallo,


Ich habe nun eine App soweit fertig also so wie ich sie haben möchte!

Sendeplan, Teamliste, etc. was eben zu eier Radio-App dazu gehört!

Nun bin ich am Stream angelangt und bei diesem habe ich festgestellt das ich während des Anrufs die Musik vom Shoutcast-Stream weiterläuft!

Wie kann ich es unterbinden?

ich führe mal hier den Aktuiellen Code ein!

stream.xml
Code:
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/back1">

    <Button
        android:text="@string/stream_mini_btn"
        android:id="@+id/stream_mini_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/stream_close_btn"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:text="@string/stream_close_btn"
        android:id="@+id/stream_close_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />


</RelativeLayout>

stream.java
Code:
package de.perfect_chaos.radio_chaostruppe;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class stream extends Activity implements OnPreparedListener  {

    MediaPlayer mp;
    private Button stream_close_click;
    private Button stream_mini_click;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stream);
        try {
            mp = new MediaPlayer();
            String url="http://rbserv.de:8200/;";
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.setDataSource(url);
            mp.prepareAsync();
            mp.setOnPreparedListener(this);
        } catch (Exception e) {
            Log.i("ExceptionOnCreate:",e.getMessage());
        }

        stream_mini_click = (Button) findViewById(R.id.stream_mini_btn);
        stream_mini_click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        stream_close_click = (Button) findViewById(R.id.stream_close_btn);
        stream_close_click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.exit(0);
            }
        });


    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();

    }
}
 
hallo hab 3 Vorschläge von denen ich denke das diese Klappen müssten oder eine Kombination davon :

1. Pausiere den MediaPlayer in onPause und starte ihn in onResume, führe eine Boolean ein um zu prüfen ob der MediaPlayer schon mal im Prepared Status war:

PHP:
public void onPause()
{
    super.onPause();
    mp.pause();
}


public void onResume()
{
    super.onResume();
    while(!mpWasAllreadyPrepared);
    mp.start();
}

public void onPrepared(MediaPlayer mp) {
        mpWasAllreadyPrepared=true;

    }

Ich denke/hoffe, dass das den call zum dem Listener nciht blockt da er aus einem "Nicht-UI-Thread"-Thread aus aufgerufen wird...


2. Das sit speziell für deinen Fall. Einen TelephonyManager benutzen um auf Anrufe zu reagieren. Es reicht den Mediaplayer zu stoppen wenn es klingelt und wieder zu starten wenn aufgelegt wird

PHP:
...

public void onCreate()
{
    TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    TelephonyMgr.listen(new TeleListener(),
    PhoneStateListener.LISTEN_CALL_STATE);

...

class TeleListener extends PhoneStateListener {
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);
        if(state==TelephonyManager.CALL_STATE_RINGING)
            mp.pause();
        if (state==TelephonyManager.CALL_STATE_IDLE)
            mp.start(); 

...
  }

Im Manifest brauchst du diese Permission:

PHP:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>


3. (Sorry keine Lust mehr code zu schreiben XP) Deine Logik zum starten und stoppen des Mediaplayers in eine View Klasse verschieben die der Content deiner MainActivity ist(Du kannst deine XML daten für die View dort per Hand reinladen und nur den Code für den MediaPlayer hinzufügen)
Dort hörst du mit dem onFocusChangedListener ob der Focus der View verloren oder zurückgewonnen wurde. Obwohl ich mir nciht sicher bin ob es bei System Window Overlays klappt.


Viel Erfolg und sag Bescheid ob es dir geholfen hat :)

Der ursprüngliche Beitrag von 03:39 Uhr wurde um 03:50 Uhr ergänzt:

Vergiss 3. das klappt nciht :)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: PerfectChaos
Dafür gibt es den AudioManager:
Managing Audio Focus | Android Developers

Falls du dich für Jaiels 2. Lösung entscheidest, vergiss nicht den Listener wieder zu deregistrieren wenn die Activity gekillt wird (ondestroy)
 
Jaiel schrieb:
hallo hab 3 Vorschläge von denen ich denke das diese Klappen müssten oder eine Kombination davon :

2. Das ist speziell für deinen Fall. Einen TelephonyManager benutzen um auf Anrufe zu reagieren. Es reicht den Mediaplayer zu stoppen wenn es klingelt und wieder zu starten wenn aufgelegt wird

PHP:
...

public void onCreate()
{
    TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    TelephonyMgr.listen(new TeleListener(),
    PhoneStateListener.LISTEN_CALL_STATE);

...

class TeleListener extends PhoneStateListener {
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);
        if(state==TelephonyManager.CALL_STATE_RINGING)
            mp.pause();
        if (state==TelephonyManager.CALL_STATE_IDLE)
            mp.start(); 

...
  }
Im Manifest brauchst du diese Permission:

PHP:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>



Viel Erfolg und sag Bescheid ob es dir geholfen hat :)

Der ursprüngliche Beitrag von 03:39 Uhr wurde um 03:50 Uhr ergänzt:

Vergiss 3. das klappt nciht :)


2. :thumbsup: und läuft :thumbup: danke erstmal dafür !

deek schrieb:
vergiss nicht den Listener wieder zu deregistrieren wenn die Activity gekillt wird (ondestroy)

wie deregistriere ich den Listener? bin so gesehen ein Anfänger aber soweit schon ganz gut :razz:

Danke im Vorraus

MfG Rene
 
Hi freut mich dass es kalppt... zu deiner Frage:

In den Docs steht dazu :"To unregister a listener, pass the listener object and set the events argument to LISTEN_NONE (0)."

http://developer.android.com/refere...en(android.telephony.PhoneStateListener, int)


also so:
PHP:
...

TeleListener myTeleListener=new TeleListener();

...

TelephonyMgr.listen(myTeleListener,0);

...

In onDestroy ist dafür der beste Platz
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: PerfectChaos und deek
Huhu Jaiel und deek,

Danke für eure Hilfe in der Vergangenheit!

Ich habe nun meine App etwas länger nicht weiter programmiert und nun vor paar Tagen wieder bekonnen!

Nun ist mir aufgefallen das wenn ich den Stream starte und die Seite Minimiere und später wieder zurückkehre öffnet er den Stream erneut so das man doppelt die Musik hat von paar ms verzögerung

package de.perfect_chaos.mff;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity {

private Button sendezeiten_click;
private Button events_click;
private Button team_click;
private Button vorschau_click;
private Button wunschbox_click;
private Button facebook_click;
private Button impress_click;
private Button appstream_click;
private Button info_click;
private Button telefonstream_click;

private Button app_minimieren_click;
private Button app_schliessen_click;

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

sendezeiten_click = (Button) findViewById(R.id.sendezeiten_btn);
events_click = (Button) findViewById(R.id.events_btn);
team_click = (Button) findViewById(R.id.team_btn);
vorschau_click = (Button) findViewById(R.id.vorschau_btn);
wunschbox_click = (Button) findViewById(R.id.wunschbox_btn);
facebook_click = (Button) findViewById(R.id.facebook_btn);
impress_click = (Button) findViewById(R.id.impress_btn);
appstream_click = (Button) findViewById(R.id.stream_btn);
info_click = (Button) findViewById(R.id.info_btn);
telefonstream_click = (Button) findViewById(R.id.telefonstream_btn);
app_minimieren_click = (Button) findViewById(R.id.app_minimieren_btn);
app_schliessen_click = (Button) findViewById(R.id.app_close_btn);


// SENDEZEITEN ÖFFNEN
sendezeiten_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, sendezeiten.class);
startActivity(intentActivity);
finish();
}
});


// EVENTS ÖFFNEN
events_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, events.class);
startActivity(intentActivity);
finish();
}
});


// TEAMLISTE ÖFFNEN
team_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, team.class);
startActivity(intentActivity);
finish();
}
});


// VORSCHAU ÖFFNEN
vorschau_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, vorschau.class);
startActivity(intentActivity);
finish();
}
});


// WUNSCHBOX ÖFFNEN
wunschbox_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, wunschbox.class);
startActivity(intentActivity);
finish();
}
});


// FACEBOOK ÖFFNEN
facebook_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, facebook.class);
startActivity(intentActivity);
finish();
}
});


// IMPRESSUM ÖFFNEN
impress_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
Intent intentActivity = new Intent(MainActivity.this, impressum.class);
startActivity(intentActivity);
finish();
}
});


// App Info ÖFFNEN
info_click.setOnClickListener(new View.OnClickListener() {

@override
public void onClick(View view) {
String url = "Musik For Friends – Android-Apps auf Google Play";

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));

startActivity(intent);
finish();
}
});



// Telefon anrufen
telefonstream_click.setOnClickListener(new View.OnClickListener() {

@override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:+49345483411301"));
startActivity(intent);
finish();
}
});


// STREAM ÖFFNEN
appstream_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
Intent istream = new Intent(MainActivity.this, stream.class);
startActivity(istream);
finish();
}
});


// APP MINIMIEREN
app_minimieren_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
finish();
}
});


// APP SCHLIESSEN
app_schliessen_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
android.os.Process.killProcess(android.os.Process. myPid());
}
});


}


}

package de.perfect_chaos.mff;

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

public class stream extends Activity implements OnPreparedListener {

MediaPlayer mp;
private Button stream_close_click, stream_mini_click;
private WebView wv_volumen;

@override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stream);
try {
mp = new MediaPlayer();
String url = "http://stream06.adm24.de:51200/;";
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setDataSource(url);
mp.prepareAsync();
mp.setOnPreparedListener(this);
} catch (Exception e) {
Log.i("ExceptionOnCreate:", e.getMessage());
}

stream_mini_click = (Button) findViewById(R.id.stream_mini_btn);
stream_mini_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v) {
finish();
}
});

stream_close_click = (Button) findViewById(R.id.stream_close_btn);
stream_close_click.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v) {
System.exit(0);
}
});

TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
TelephonyMgr.listen(new TeleListener(),
PhoneStateListener.LISTEN_CALL_STATE);


wv_volumen = (WebView) findViewById(R.id.wv_volumen);
wv_volumen.getSettings().setJavaScriptEnabled(true);
wv_volumen.setWebViewClient(new WebViewClient());
wv_volumen.setBackgroundColor(0x00000000);
wv_volumen.loadUrl("LINK ZUM WEB");

}

@override
public void onPrepared(MediaPlayer mp) {
mp.start();
}



class TeleListener extends PhoneStateListener {
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (state == TelephonyManager.CALL_STATE_RINGING)
mp.pause();
if (state == TelephonyManager.CALL_STATE_IDLE)
mp.start();
}
}

}

Wie kann ich die App zu verstehen geben das sie es nur einmal öffnet und / Oder die App abfragen lasse ob schon eine activity davon geöffnet ist?

Danke im Vorraus! ich fahre morgen in Urlaub und schaue später wieder rein ich wollte die Frage mal los werden weil es mir im Kopf rum schwirrte!

MFG PerfectChaos alias Rene
 
Hallo,

man beendet keine App mit System.exit(0). Das kann Böse ins Auge gehen (z.B. könne gespeicherte Daten beschädigt werden).
Beende einfach alle Actvities mit finish(). Dann wird die App automatisch beendet.

Jede Activity hat ein Lebenszyklus. Und Methoden, die an bestimmten Zeitpunkte aufgerufen werden (Activity wird gestartet, wird zerstört, geht in den Hindergrund usw). Jail benutzt in seinen ersten Beispiel zwei dieser Methoden (onPause und onResume).

Du muss alle Threads (in deinen Fall der Mediaplayer) beenden, bevor du die Activity beendest (zerstörst).

Genauere Erklärungen:
Activities | Android Developers
Managing the Activity Lifecycle | Android Developers


PS: Klassen fangen in Java mit Großbuchstaben an. Code Style for Contributors | Android Open Source Project
 

Ähnliche Themen

H
  • heikoj10.1
Antworten
4
Aufrufe
716
heikoj10.1
H
H
Antworten
5
Aufrufe
1.130
heikoj10.1
H
A
Antworten
6
Aufrufe
1.052
androidpeppi
A
Zurück
Oben Unten