Wo ist PhoneStateIntentReceiver geblieben?

GMoN

GMoN

Dauergast
394
Hmm, das fängt ja gut an und erinnert sehr stark an Nokia/Symbian. Also ich habe etliche Code Schnipsel im Internet gefunden, die u.a. Die GSM Signalstärke anzeigen können. Dazu wird

Code:
import android.telephony.PhoneStateIntentReceiver;
verwendet. Im aktuellen SDK ist dies aber nicht mehr verfügbar. Warum?
 
Zuletzt bearbeitet:
Ach weiß der Teufel warum.

Die haben schon in 1.0 so einiges raus geschmiessen.

API Differences Report 0.9 - 1.0

Die 1.1 hab ich noch nicht mal angeguckt.

Ich habe für mein AppManager paar Methoden gebraucht, die noch brav in der Doku stehen.

Hab paar Tage nach den Gründen gesucht warum ich die doch nicht aufrufen kann und letztendlich im IRC-Channel #android-dev die Antwort bekommen, dass diese Methoden jetzt nun mal "hidden" sind und nur intern genutzt werden können.

Sonst nix. Ist auch klar, die Jungs sind mir keine Rechtfertigung schuldig :D
 
Also ein bischen zur Geschichte. Erst ab 1.0 konnte man sich wirklich auf die APIs verlassen. Alles was davor war stand im Alpha Status und es war klar (und auch so kommuniziert) das sich viel ändern kann zu 1.0 hin. Von 1.0 auf 1.1 hat sich so gut wie nichts geändert. (was jetzt die 1.0 Anwendungen angeht) Die Doku ist leider nicht mehr so wirklich auf dem aktuellen Stand. Mir ist aufgefallen das man aber unter developer.android.com weit aktuelleres findet. Nebenbei sei auch gesagt das jeder zur Doku beitragen kann. Diese ist in JavaDoc direkt im Source Code geschrieben. Was auch nicht wirklich schlecht ist, denn das heisst nun mal Open Source. Jeder sollte sich beteiligen und man bekommt eben kein rund um sorglos Paket wie bei Nokia/Symbian oder andere. (wo es ja auch nicht der Fall ist, man aber den Nachteil hat das man nichts beitragen kann)

Zu den hidden Methoden. Hier wurde das Problem von den Google Devs schon vor längerer Zeit erkannt und jeder neu geschriebene Code basiert nur noch auf den auch allen normalen Entwicklern zur Verfügung stehenden APIs. Das dies im Moment noch anders ist liegt an der Historie von Android. Das ist doch schon etwas älter als das eine Jahr in dem es Entwicklern schon zur Verfügung stand.
 
Das ist ja alles keine Katastrophe, das Android ist halt neu, frisch etc.
jedem dürfte klar sein, dass es da solchen Unzulänglichkeiten geben wird.

Klar nervt das, wenn man vor der Kiste sitzt und nicht weiter kommt. Aber hey, wir reden hier über Embedded Systeme. Da war es nie wirklich einfach und wenns einfach war - war man beschränkt.
 
Hmm, unschön das ganze. Aber heulen hilft jetzt auch nicht weiter;)
Ich möchte ständig die aktuelle Signalstärke (2G/3G) auslesen. Dieses geht jetzt scheinbar nicht mehr auf direktem Weg, also etwa mit .getSignalStrength.

Mit android.telephony.TelephonyManager und android.telephony.PhoneStateListener kann man auf ein onSignalStrengthChanged(int asu) Event lauschen und bekommt dann die Signalstäke. Aber eben nur, wenn sich die Balkenanzeige verändert, bzw reagiert diese auch nur darauf. Das ist mir aber zuwenig.

Ich bin blutiger Java Anfänger und deshalb meine frage, ob ich dieses onSignalStrengthChanged(int asu) auch irgendwie erzwingen kann? Denn wenn ich das Phone kurz in den Standby schicke und wieder aufwache, wird dieses Event scheinbar auch ausgelöst und die Signalstärke wird aktualisiert. Hiermein kleines Testprogramm:

Code:
package de.carknue.skeleton;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.view.View;
import android.widget.Button;
import android.telephony.PhoneStateListener;


public class Skeleton extends Activity implements View.OnClickListener {

    Button btn, btn2, btn3;
    GsmCellLocation location;
    int cellID, lac, rxl;
    String t;
    TelephonyManager tm;
    @Override
    public void onCreate(Bundle icicle) {
     super.onCreate(icicle);
     setContentView(R.layout.main);
     tm  = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     location = (GsmCellLocation) tm.getCellLocation();
     cellID = location.getCid();
     lac = location.getLac();
     t=String.valueOf(cellID);
     tm.listen(new CallStateListener(), PhoneStateListener.LISTEN_CELL_LOCATION
                | PhoneStateListener.LISTEN_SIGNAL_STRENGTH
                | PhoneStateListener.LISTEN_SERVICE_STATE);
     btn=(Button)findViewById(R.id.button);
     btn2=(Button)findViewById(R.id.button2);
     btn3=(Button)findViewById(R.id.button3);
     }
     
     
     private class CallStateListener extends PhoneStateListener
     { 
         public void onSignalStrengthChanged(int asu) {
                rxl = -113 + 2*asu;
                t=String.valueOf(rxl);
                btn3.setText(t);
                location = (GsmCellLocation) tm.getCellLocation();
                 cellID = location.getCid();
                 t=String.valueOf(cellID);
                 btn.setText(t);
                 lac = location.getLac();
                 t=String.valueOf(lac);
                 btn2.setText(t);
              }
        
     }
}
Also kann man dieses onSignalStrengthChanged(int asu) irgendwie erzwingen?
 
Programmatisch erzwingen wird nicht klappen. Doku sagt:
Callback invoked when device service state changes.
Das ist bei Events so üblich.
 
  • Danke
Reaktionen: plauzeee
Tja, schade. Ich hatte gehofft, dass man das irgendwie triggern könnte.

Kann man alte SDK Versionen noch irgendwo runterladen? Damit müßte es ja noch gehen. Oder kann man sich da vieleicht nur die fehlende Methode einzeln rausziehen und ansonsten die aktuelle SDK nutzen?
 
Ok, ich habe die android-sdk_m5-rc15_windows gefunden aber dafür muss ich auch die ADT downgraden aber das ADT-0.4.0.zip läßt sich in Eclipse 3.4 nicht als Archiv installieren. No repository found at jar file. Hmm, Mist! 0.7.1 und 0.8.0 funktionieren aber damit gibt es einen SDK <-> ADT missmatch. Läuft das vielleicht nur mit Eclipse 3.3 oder 3.2?
 
Das einzige was mir spontan um diese Uhrzeit einfällt:

du könnest auch ohne ADT auskommen, nur mit SDK Tools halt.

Ich muss aber auch sagen, ich würde nicht das SDK downgraden.
Das ist kein guter Ansatz und führt zwangsläufig zu Problemen in der Zukunft.
Es wird einfach nach irgendeinem Update nicht mehr laufen.

Zum probieren ist es ja ok, wenn du aber eine App mit "Plänen" entwickelst,
würde ich von dieser Vorgehensweise abraten.

Update:

Ach ja, was "onSignalStrengthChanged(int asu) irgendwie erzwingen" angeht.
Ich weiß ja nicht deine Vorkenntnisse, hab da eine Sache nicht erwähnt:

Du kannst AndroidOS nicht dazu bringen, das Event zu feuern, aber
du kannst natürlich diese Funktion selbst mir Fake-Daten aufrufen, über ein Timer oder so.
Falls das hilft.
 
Zuletzt bearbeitet:
zx128 schrieb:
Ach ja, was "onSignalStrengthChanged(int asu) irgendwie erzwingen" angeht.
Ich weiß ja nicht deine Vorkenntnisse, hab da eine Sache nicht erwähnt:

Du kannst AndroidOS nicht dazu bringen, das Event zu feuern, aber
du kannst natürlich diese Funktion selbst mir Fake-Daten aufrufen, über ein Timer oder so.
Falls das hilft.

Meine Java Vorkenntnisse sind leider fast Null. Habe vorher Delphi und Python for Symbian gemacht. Habe mich aber schon mit entsprechender Literatur eingedeckt.

Ich würde die gerne per Timer aufrufen, wie geht das mit den Fake-Daten? Hoffe nur, dass dann wirklich aktualisierte Werte rauskommen und nicht immer die gleichen. Aber das wird man sehen.
 
Die Fake-Daten muss du dann schon selbst aufbereiten.

Aber du weiß ja wie die echten Daten aussehen, die Methode wird ja zwischendurch vom System aufgerufen, wenn ich dich richtig verstanden habe.

Ich würde die in ein Array packen und dann der Methode nach und nach als Parameter übergeben.

Weiß jetzt nicht ob Android ne Timer-Klasse hat, ich hab das letztens so gemacht.

sind nur Schnipsel, liest ein bisschen Doku ;)

Code:
private Handler handler = new Handler() {
        public void handleMessage(Message msg) {

// hier aus dem array wert nehmen und dann Funktion aufrufen

			}
        }
    };

Das hier irgendwo ein mal aufrufen

Code:
new Runnable(){
	public void run() {
          // hier was machen
// hier müsste ein sleep(xxx) rein
handler.sendEmptyMessage(0);
	}
    }.run();

Worum geht dir da überhaupt? Verstehe ich das richtig, dass du die Methode aufgerufen haben willst, damit du die Ausgabe anpasst usw.?
 

Ähnliche Themen

U
  • unerfahrenerAppEntwickler
Antworten
3
Aufrufe
703
swa00
swa00
S
Antworten
17
Aufrufe
5.816
SchwarzerKater
S
Zurück
Oben Unten