audio Switch

  • Antworten:8
floatec
  • Forum-Beiträge: 360

17.08.2009, 14:48:29 via Website

Hallo Leute,

angefangen hat alles damit das mein audio adapter nicht ging und die app die das problem lösen würde nichtmehr verfügbar ist. also hab ich angefagen das selbst zu realisieren. doch ihrgendwie tut es nicht so wie es soll. vielleicht hat von euch einer ne idee woran es leigt.

1package floatec.AudioSwitch;
2
3
4import android.app.Activity;
5import android.media.*;
6import android.os.Bundle;
7import android.view.View;
8import android.widget.Button;
9import android.widget.Toast;
10
11
12public class AudioSwitch extends Activity {
13 //Routes
14 private int ROUTE_SPEAKER=2,ROUTE_ALL=-1,ROUTE_HEADSET =8, ROUTE_BLUETOUTH=4;
15 //Modes
16 private int MODE_NORMAL=0;
17 private AudioManager amSwitch;
18 private Button bSpeaker, bHeadset,bBluetouth;
19 /** Called when the activity is first created. */
20 @Override
21 public void onCreate(Bundle savedInstanceState) {
22
23 amSwitch=(AudioManager)getSystemService(AUDIO_SERVICE);
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.main);
26 this.bSpeaker = (Button) this.findViewById(R.id.Speaker);
27 this.bSpeaker.setOnClickListener(new Button.OnClickListener() {
28 public void onClick(View v) {
29 changesound(ROUTE_SPEAKER, "SPeakers");
30 }
31 });
32 this.bHeadset = (Button) this.findViewById(R.id.Headset);
33 this.bHeadset.setOnClickListener(new Button.OnClickListener() {
34 public void onClick(View v) {
35 changesound(ROUTE_HEADSET, "Headset");
36 }
37 });
38 this.bBluetouth = (Button) this.findViewById(R.id.Bluetouth);
39 this.bBluetouth.setOnClickListener(new Button.OnClickListener() {
40 public void onClick(View v) {
41 changesound(ROUTE_BLUETOUTH, "BT");
42 }
43 });
44
45 }
46 private void changesound(int to, String toast) {
47 Toast.makeText(getBaseContext(),toast, Toast.LENGTH_LONG).show();
48 amSwitch.setRouting(amSwitch.getMode(), to, ROUTE_ALL);
49
50 }
51}

hier auch gleich der link zur benutzten methode von AudioManager: http://developer.android.com/reference/android/media/AudioManager.html#setRouting(int,%20int,%20int)

hoffe es kann wer helfen. werde heute abend auch selbst noch weiter nach den fehler suchen.

Gruß
paddy

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

19.08.2009, 00:16:22 via Website

Bist du sicher das die Konstanten stimmen ?

private int ROUTE_SPEAKER=2,ROUTE_ALL=-1,ROUTE_HEADSET =8, ROUTE_BLUETOUTH=4;


Wieso sind die nicht final ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
floatec
  • Forum-Beiträge: 360

19.08.2009, 11:29:50 via Website

Stehen so in der doku

Ist ja nur schnell zusammengeschrieben. Deswegen sinds noch normale ints

Gruß paddy

Antworten
Anton S.
  • Forum-Beiträge: 1.614

19.08.2009, 11:45:55 via Website

private int ROUTE_SPEAKER=2,ROUTE_ALL=-1,ROUTE_HEADSET =8, ROUTE_BLUETOUTH=4;

"ROUTE_BLUETOUTH=4" <-- Bluetooth wird mit doppel "O" geschrieben. Daran wirds wohl aber eher nicht leigen, denk ich mal :grin: :grin:

Neu bei Android, AndroidPIT oder dem App Center? Hier erfährst Du alles Wichtige: http://bit.ly/ccFQvI

Antworten
Gelöschter Account
  • Admin
  • Forum-Beiträge: 3.718

19.08.2009, 11:56:36 via Website

eher nicht leigen

liegen wird mit ie geschrieben und nicht mit ei :P

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

19.08.2009, 18:24:55 via Website

Hi,

schön wäre es ja zu wissen, was "tut nicht so wie es soll" genau heißt. Irgendwie ist diese Aussage so verflucht unpräzise ;)

Ich hab mal folgendes:

Die Final Variablen: MODE_NORMAL(0), MODE_RINGTONE(1), MODE_IN_CALL(2) geben die drei Zustände
an in denen sich das Android befinden kann, welche auf die verschiedenen Ausgabe-Geräte geroutet
werden.
Die Ausgabegeräte sind:
ROUTE_BLUETOOTH_SCO(4) [Bluetooth-Headset]
ROUTE_EARPIECE(1) [Normaler Hörer]
ROUTE_HEADSET(8) [Original Headset]
ROUTE_SPEAKER(2) [Android-Handy Lautsprecher]

Um nun zu erfahren wie das Routing erfolgt, gibt es die Funktion getRouting(int mode) der Klasse
AudioManager. Das (int Mode) als Aufrufparameter bezieht sich dabei auf die zuvor genannten
möglichen Zustände des Android-Handys.
Ein Aufruf von AudioManager.getRouting(AudioManager.MODE_RINGTONE) liefert also das Routing
für den Fall, dass das Telefon klingelt.
Ein Aufruf von AudioManager.getRouting(AudioManager.MODE_IN_CALL) liefert also das Routing
für den Fall, dass gerade ein Telefonat geführt wird.
Ein Aufruf von AudioManager.getRouting(AudioManager.MODE_NORMAL) liefert also das Routing
für den Normalbetrieb des Handys ohne Klingeln oder gerade aktiven Anruf.
(Wecker, Tastentöne, Musik usw.)

Mehr Auskunft bekommen wir vom Android in diesem Zusammenhang nicht.

Unschlüssig ist beispielsweise auch die Tatsache, dass ein angeschlossenes und einwandfrei
funktionierendes Headset beim Aufruf der Funktion AudioManager.isBluetoothScoOn() immer
ein boolean(false) zurückliefert, damit in zusammenhang auch das entsprechende Routing
in der jeweiligen Ausgabe der funktion getRouting(int mode) in keinster Weise berücksichtig
bzw. korrekt ausgegeben wird. Dabei wird grundsätzlich ein ROUTE_SPEAKER(2) zurückgeliefert.

Ergebnisse:
Routing MODE_RINGTONE mit Original G1 Headset = ROUTE_HEADSET (8)
Routing MODE_IN_CALL mit Original G1 Headset = ROUTE_HEADSET (8)
Routing MODE_RINGTONE mit Original G1 Headset = ROUTE_SPEAKER,ROUTE_HEADSET (10)

Nebenbei solltest Du einfach bereits definierte Konstanten nicht noch einmal definieren und damit unter anderem Gefahr laufen, mit einem Update plötzlich falsche Werte zu verwenden.
Darüber hinaus ist "ROUTE_BLUETOUTH" deprecated und heisst nun "ROUTE_BLUETOUTH_SCO"

Um nun zu einem nicht original Kabelheadset zu routen müsstest Du also für alle 3 Modes die entsprechenden SetRouting Befehl absetzen. mit den oben zu lesenden Werten. ;)

Damit sollte es dann funktionieren.

Witzig finde ich allerdings insgesamt, dass man nicht entsprechende Sourcen :
The audio stream for alarms
Constant Value: 4 (0x00000004)
public static final int STREAM_MUSIC

The audio stream for music playback
Constant Value: 3 (0x00000003)
public static final int STREAM_NOTIFICATION

The audio stream for notifications
Constant Value: 5 (0x00000005)
public static final int STREAM_RING

The audio stream for the phone ring
Constant Value: 2 (0x00000002)
public static final int STREAM_SYSTEM

The audio stream for system sounds
Constant Value: 1 (0x00000001)

auf die entsprechenden Ausgabemedien routen / mappen kann. Irgendwie geht das meiner Meinung nach am Ziel vorbei. Was meint Ihr dazu ?

lg
Voss

lg Voss

Antworten
floatec
  • Forum-Beiträge: 360

19.08.2009, 20:04:57 via Website

Hi,

Zum thema mode. Den holle ich mir über get mode. So setz ich nur den aktuellen.

Ja die konstanten kann man ersätzen.

Nicht tun in dem sinne das er die route nicht änderd.

Bin leider noch nicht dazu gekommen weiter zu machen.

Ja das mit den streams hat mich auch gewundert.

Gruß
Paddy

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

20.08.2009, 01:27:53 via Website

Mac Systems
Bist du sicher das die Konstanten stimmen ?

private int ROUTE_SPEAKER=2,ROUTE_ALL=-1,ROUTE_HEADSET =8, ROUTE_BLUETOUTH=4;


Wieso sind die nicht final ?


Na ja, Ich wollte nicht unbedingt auf die Konstanten in der API hinaus, aber es geht immer um maintainable Code daher wäre final das mindeste was diese Konstanten hätten sein sollen. Selbst wenn diese nicht in der API definiert wären sollte dort dann eher ein ENUM benutzt werden als das ints durch den Code "geistern".

Back on Topic, please ;)

— geändert am 20.08.2009, 01:28:24

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
floatec
  • Forum-Beiträge: 360

01.09.2009, 18:14:33 via Website

so erste funktions fehähige version ist fertig.

werde sobald ich zeit finde mal schua das man es als widget einbindne kann. das wäre doch praktischer.

gruß
paddy

Antworten