Stumm-Schalten via Code

  • Antworten:11
Florian B.
  • Forum-Beiträge: 284

17.04.2010, 13:48:56 via Website

Hallo zusammen,

ich habe ein kleines Problem mit dem Stummschalten des Handys via Code. Ich verwende folgenden Code dazu.

1AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
2am.setRingerMode(AudioManager.RINGER_MODE_SILENT);

Wenn nun ein Anruf ankommt, und der obere Code ausgeführt wird, dann hört das Handy zwar auf zu klingeln, allerdings vibriert es weiter hin. Laut Dokumentation von AudioManager.RINGER_MODE_SILENT sollte es aber auch aufhören zu vibrieren. Auch das zusätzliche manuelle Ausschalten mittels

1am.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF );


unterbindet nicht das Vibrieren.

Was mach ich falsch? Any ideas?

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

17.04.2010, 15:30:25 via Website

Hallo Florian,

prinzipiell machst Du alles richtig. Man muss zwangsläufig den Vibrate Type Ringer zusätzlich setzen, da hier scheinbar die Doku daneben liegt was RINGER_MODE_SILENT und das ausschalten der Vibration angeht.

In meiner App funktioniert das auf diese Art und Weise zuverlässig. Allerdings musst Du darauf achten, im Code sehr schnell auf das Event onCallStateChanged zu reagieren, da ansonsten der Event sofort weitergeleitet wird. Wenn Du da vorher langwierige Operationen durchführst wird das nix.

lg Voss

Antworten
Florian B.
  • Forum-Beiträge: 284

17.04.2010, 16:03:06 via Website

Also den eingehenden Anruf fange ich über einen Broadcast Receiver ab, der daraufhin einen Service startet, der dass Stummschalten übernimmt. Und für das Klingeln funktioniert die ganze Sache ja. Von daher denke ich nicht, das ich den Event zu spät weiterleite.

Antworten
Florian B.
  • Forum-Beiträge: 284

17.04.2010, 19:02:20 via Website

Ich habe heute einen weiteren Versuch unternommen die Vibration zu stoppen indem ich ein Vibrator Objekt erstellt habe und darauf die Methode cancel() aufgerufen habe.

1Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
2vib.cancel();

Auch dies führte leider nicht zum gewünschten Ergebnis. Langsam gehen mir echt die Ideen aus.

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

17.04.2010, 19:22:34 via Website

Folgender Vorschlag, installiere Dir mal meine App Nostalk

https://www.nextpit.de/de/android/market/apps/app/com.voss.nostalk/NoStalk

Und dann ruf Dich selber mal mit unterdrückter Rufnummer von einem anderen Handy aus an. Wenn das funktioniert, dann ist zumindest mal sichergestellt, dass es kein Bug im Android 2.1 ist, sondern das bei Deinem Code irgendwas schiefläuft. Ich steuere die Funktionen ganz genau so wie Du es eingangs beschrieben hast.

lg Voss

Antworten
Florian B.
  • Forum-Beiträge: 284

18.04.2010, 14:05:26 via Website

Hallo,

also ich hab jetzt mal deine App installiert und getestet und kam dabei zu folgendem Ergebnis auf meinem Nexus One erzielt.

Mit deiner App wird das Vibrieren nur beim ersten Mal unterdrückt. Wenn ich ein weiteres Mal mit unterdrückter Rufnummer anrufe ohne am Handy irgendwas zu machen, dann vibriert das Handy wieder. Wenn ich dann allerdings das Handy wieder mit den Lautstärkereglern zunächst kurz laut und dann gleich wieder auf Vibration stelle, dann wird das Vibrieren beim nächsten Anruf wieder unterdrückt.

Zudem ist mir noch aufgefallen, dass deine App das Vibrieren nie unterdrückt wenn es explizit in den Einstellungen aktiviert wurde (unter Einstellungen für Sound & Display >> Vibration).

Langsam bin ich wirklich verwirrt. Ich werde jetzt mal meine App gegen das SDK 2.1 kompilieren, obwohl das ja eigentlich keinen Unterschied machen sollte.

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

18.04.2010, 14:14:05 via Website

Wenn meine App das auf Deinem Nexus nicht macht ... dann weiß ich auch nicht. Die App ist gegen 1.6 compiliert und funktioniert einwandfrei beispielsweise auf meinem G1. Dort wird die Vibration einwandfrei unterdrückt. In allen Variationen. Auch bei mir ist bspw. Vibration explizit enabled.

Ich vermute da eher eine gegenüber der Dokumentation fehlerhafte Behandlung der Vibrate Settings unter 2.1.

Wie gesagt, ich mache exakt das gleich wie Du, was die Unterdrückung der Vibrate Settings angeht. Ich speichere lediglich die voreingestellten Settings, und stelle diese nach Beendigung des Calls wieder her. (Preferences)

Die Tatsache, dass bei Dir bei einem zweiten Anruf das Handy wieder vibriert lässt darauf schließen, dass die Vibrate Settings sich wohl trotz gegenteiliger Aussage der Dokumentation, irgendwie verändert haben dürften.

Ich stelle genau das was vor dem Call eingestellt war, mit der App nach dem Call wieder her. Du kannst das im Logcat verfolgen .. ich schreibe da entsprechende Einträge ins log hinein. Vielleicht entdeckst Du ja bei den Ausgaben einen Hinweis darauf was da unter 2.1 schiefläuft.

lg Voss

Antworten
Florian B.
  • Forum-Beiträge: 284

18.04.2010, 14:17:04 via Website

Auch das ganze mit dem SDK 2.1 zu bauen hat nix geholfen. Dann werde ich mir mal die Logs anschauen müssen.

Aber trotzdem schon mal vielen Dank für deine Hilfe!!! Das erste Forum in dem überhaupt jemand auf mein Problem eingegangen ist.

— geändert am 18.04.2010, 14:38:46

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

18.04.2010, 14:29:52 via Website

Der Ablauf sieht im Logcat etwa so aus .. (zusammengerafft und anderes rausgestrippt.)

I/ActivityManager( 77): Start proc com.voss.nostalk for activity com.voss.nostalk/.NoStalk: pid=20644 uid=10003 gids={1015}
I/dalvikvm(20644): Debugger thread not active, ignoring DDM send (t=0x41504e4d l=38)
I/dalvikvm(20644): Debugger thread not active, ignoring DDM send (t=0x41504e4d l=36)
I/NotificationService( 77): enqueueToast pkg=com.voss.nostalk callback=android.app.ITransientNotification$Stub$Proxy@432899b0 duration=1
D/Nostalk Alerter valueOnStart: (20644): true

#### Hier werden erstmal die bestehenden Einstellungen gespeichert für Ringer Mode und Vibration ####
D/Nostalk CallListener: RingerMode-saved: (20644): 2
D/Nostalk CallListener: VibrateMode-saved: (20644): 1
D/Nostalk CallListener:(20644): Service startet, Broadcast-Receiver for Ringermode Changes registered
D/Nostalk RingerModeRec: savePrefs(20644): saved changed RingerMode value: 2

#### Hier kommt ein Call mit unterdrückter Nummer rein ####

I/NotificationService( 77): enqueueToast pkg=com.voss.nostalk callback=android.app.ITransientNotification$Stub$Proxy@4355a5d8 duration=1
I/ActivityManager( 77): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10840000 cmp=com.android.phone/.InCallScreen }
I/ActivityManager( 77): moveTaskToBack: 5
I/ActivityManager( 77): moveTaskToBack: 5
I/NotificationService( 77): enqueueToast pkg=com.voss.nostalk callback=android.app.ITransientNotification$Stub$Proxy@433dd820 duration=1
D/Nostalk CallListener: RingerMode-loaded: (20644): 2
D/Nostalk CallListener: VibrateMode-loaded: (20644): 1

#### Hier wurden soeben RingerMode und VibrationMode wieder hergestellt aus den iben geladenen Einstellungen ####

lg Voss

Antworten
Florian B.
  • Forum-Beiträge: 284

18.04.2010, 14:39:01 via Website

Ich hab jetzt mal im Android Market ein bisschen gesucht und mir 2 Apps gezogen die in etwas das gleich machen wie meine App. Und in beiden fällen können sie das bereits begonnen Vibrieren nicht abstellen. Und ich glaub inzwischen auch zu wissen warum. Ich hab mir nochmal die Doku zur Vibrator-Klasse angeschaut und dort bei der Class Overview folgendes gelesen.

If your process exits, any vibration you started with will stop.

Das hört sich für mich so an, als wäre die Vibration an einen Prozess gebunden und könnte auch nur von diesem aus gestoppt werden. Im Falle meiner App klingelt und vibriert das Handy aber schon, bevor meine App eingreift. Somit wurde das Vibrieren bereits aus einem anderen Prozess heraus gestartet und kann dann vermutlich auch nur von diesem Prozess aus gestoppt werden.

Dein App dagegen deaktiviert die Vibration, wie von dir weiter oben bereits angemerkt, bevor der Event überhaupt den Prozess startet, der das Handy klingeln und vibrieren lässt.

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

18.04.2010, 14:47:07 via Website

Ich schrieb Dir ja schon mal, dass Du extrem schnell reagieren musst ... ;)

Ich lasse im wesentlichen die Calldetection von einem permanent im Hintergrund laufenden Service überwachen der auch den Broadcast Listener auf CallStateChanged registriert. Da befindet sich also alles was es braucht bereits im Speicher und kann sofort reagieren.
Die eigentliche, Interaktion in meiner App findet in einer losggelösten, vom Service unabhängigen Activity statt.

Keine Ahnung wie Du das löst.

lg Voss

Antworten
Florian B.
  • Forum-Beiträge: 284

18.04.2010, 15:03:22 via Website

Jörg V.
Keine Ahnung wie Du das löst.

Ja da muss ich mir mal was überlegen, wobei ich denke, dass es sich vermutlich gar nicht lösen lässt. Also nochmal Danke für die Tipps! ;)

Antworten