0

私のアプリの 1 つで、SMS を送信する前に Android フォンのサービス状態を確認したかったのです。私はそれを行うために次のコードを使用しました

                //check service
    ServiceState pstate = new ServiceState();
    if(pstate.getState() != ServiceState.STATE_IN_SERVICE)
        {
        Log.v(TAG,"service state" +pstate.getState());
        Toast.makeText(Myactivity.this, "error string", 2000).show();
        return;
        }

ただし、コードは常に OUT_OF_SERVICE (+pstate.getState の値 1) で戻ります。

電話が STATE_IN_SERVICE かどうかを確認する信頼できる方法を教えてください。

このコードはFROYO版でチェック済みです。

4

1 に答える 1

0

本当に満足のいく答えではありませんが、私は彼と同じ問題を抱えて時間を無駄にしていましたが、私のFROYOバージョンでもうまくいきませんでした.

しかし、TelephonyManagerPhoneStateListenerを使用すると、これは完全にうまくいきました。あなたの場合、 ServiceState を直接インスタンス化するのではなく、ラッパーを使用することをお勧めします。

    //declare current state
    ServiceState myServiceState = new ServiceState();
    PhoneStateListener listener = null; // not sure if this is needed really..


    // nifty getter
    public ServiceState getServiceState(){ return myServiceState; }


    //setup listener (eg. in onCreate)
    TelephonyManager tm = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
    listener = new PhoneStateListener() {
        @Override
        public void onServiceStateChanged(ServiceState serviceState){
            myServiceState = serviceState;
        }
    };
    tm.listen(listener,PhoneStateListener.LISTEN_SERVICE_STATE);


    // to be called when destroying your context
    public void unregisterListener(){
        // something like..
        tm.listen(listener,PhoneStateListener.LISTEN_NONE);
    }


    //check service
    ServiceState pstate = getServiceState();
    if(pstate.getState() != ServiceState.STATE_IN_SERVICE)
    {
        Log.v(TAG,"service state" +pstate.getState());
        Toast.makeText(Myactivity.this, "error string", 2000).show();
        return;
    }

怠惰な解決策は、リスナーセットアップをゲッターに移動し、実際に呼び出された場合にのみ登録し、サービスが利用可能な場合にのみ保存することです。すなわち

    //declaration
    boolean isAvailable = false;
    PhoneStateListener listener = null;


    // more nifty getter
    public boolean isServiceAvailable(){
        if (listener == null){
            //setup listener if not yet done
            TelephonyManager tm = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
            listener = new PhoneStateListener() {
                @Override
                public void onServiceStateChanged(ServiceState serviceState){
                    isAvailable = serviceState.getState() == ServiceState.STATE_IN_SERVICE;
                }
            };
            tm.listen(listener,PhoneStateListener.LISTEN_SERVICE_STATE);
        }
        return isAvailable;
    }

    // to be called when destroying your context
    public void unregisterListener(){
        // something like..
        if (lister != null){
            tm.listen(listener,PhoneStateListener.LISTEN_NONE);
        }
    }



    //check service
    if(! isServiceAvailable())
    {
        Log.v(TAG,"service state" +pstate.getState());
        Toast.makeText(Myactivity.this, "error string", 2000).show();
        return;
    }

ただし、登録時にすぐにリスナーを呼び出す必要があることに注意してください。そうしないと、任意の結果になってしまうので、必ず確認してください。

于 2013-01-16T01:29:15.437 に答える