2013-05-10 20 views
5

Wiem, że jest jeszcze jedno pytanie na ten temat, ale nie sądzę, że dotyczy mnie, ponieważ jestem prawie pewien, że używam GSM (isGSM() zwraca true). W każdym razie getCdmaDbm zwraca -1 dla mnie w każdym razie. Używam Android 4.1.1 oraz HTC One X. Tu jest mój kodu (z których większość nie jest moje):getGSMSignalStrength() Zawsze zwraca 99

główną działalność:

package com.example.receptionlookup; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.telephony.PhoneStateListener; 
import android.telephony.SignalStrength; 
import android.telephony.TelephonyManager; 
import android.view.Menu; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    TelephonyManager  Tel; 
    MyPhoneStateListener MyListener; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     /* Update the listener, and start it */ 
     MyListener = new MyPhoneStateListener(); 
     Tel  = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
     Tel.listen(MyListener ,PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    /* Called when the application is minimized */ 
    @Override 
    protected void onPause() 
    { 
     super.onPause(); 
     Tel.listen(MyListener, PhoneStateListener.LISTEN_NONE); 
    } 

    /* Called when the application resumes */ 
    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     Tel.listen(MyListener,PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 
    } 

    /* —————————– */ 
    /* Start the PhoneState listener */ 
    /* —————————– */ 
    private class MyPhoneStateListener extends PhoneStateListener 
    { 
     /* Get the Signal strength from the provider, each tiome there is an update */ 
     @Override 
     public void onSignalStrengthsChanged(SignalStrength signalStrength) 
     { 
      super.onSignalStrengthsChanged(signalStrength); 
      Toast.makeText(getApplicationContext(), "Go to Firstdroid!!! GSM Cinr = " 
        + String.valueOf(signalStrength.getGsmSignalStrength()), Toast.LENGTH_SHORT).show(); 
     } 

    };/* End of private Class */ 

} 

AndroidManifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.receptionlookup" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.receptionlookup.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
</manifest> 

Does ktoś wie, co to jest problem? Jeśli przejdę do Ustawienia-> Informacje-> Sieć, widzę siłę sygnału. Czy nie ma sposobu, aby po prostu przeczytać tę wartość? Wypróbowałem kilka aplikacji innych firm i żadne z nich nie jest w stanie odczytać siły sygnału. Próbowałem również zastrzeżonej metody getGSMSignalBar(), ale otrzymałem wyjątek NoSuchMethodException.

+0

Więc czy naprawdę nie ma dla mnie sposób, aby spojrzeć na sile sygnału programowo w moim telefonie? –

+0

Czy są jakieś alternatywne metody, których mogłem użyć? –

+0

Czy próbowałeś kodu na innym urządzeniu? A może po prostu HTC One X? – Nate

Odpowiedz

0

Jak można przeczytać w 3GPP 127 007 8.5, implementacja at+csq jest opcjonalna (polecenie, które ma dać siłę sygnału). Wygląda na to, że HTC ukrywa tę wartość przed aplikacjami innych firm i prawdopodobnie mają inny sposób osiągnięcia tej wartości w celu wyświetlania we własnych zastrzeżonych aplikacjach Ustawienia.

Fakt, że inne aplikacje również nie mogą uzyskać tych informacji, uzasadnia moją sprawę.

This issue jest ściśle związany z twoim - powiedział, że HTC jest jednym z producentów OEM, który nie jest warty czasu rozwoju związanego z modemem.

+0

Pytanie brzmi: jak by to zrobili? –

+0

O ile wiem, nie możesz tego zrobić, istnieje prywatna komunikacja między htc a dostawcą modemu zaimplementowana w rodzimej bibliotece o nazwie 'libsec-ril'. To nie jest Google, a nie open source. – Bush

0

Spróbuj tego:

Class signalStrengthClass = signalStrength.getClass(); 
      try { 
       Method method = signalStrengthClass.getMethod(
         "getGsmSignalBar", null); 
       method.setAccessible(true); 
       Integer bars = (Integer) method.invoke(signalStrength, 
         (Object[]) null); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
+0

Otrzymuję wyjątek NoSuchMethodException na ten temat. –

+0

OK, co jeśli zastąpisz 'getMethod (...)' z 'getDeclaredMethod()'? – Bush

+0

Niestety ten sam wynik. Wiem, że ta metoda działa na Galaxy S2. Może to po prostu nie jest metoda dla HTC. –