1

クライアントが「ping」を送信し、サーバーが「pong」で応答するクライアントサーバーアプリケーションがあります。「pong」を受信すると、クライアントはその位置の更新情報 (GPS データ) をサーバーに送信します。位置の更新を受信すると、サーバーは「ポン」を送信し、これがしばらく続きます。ソケット (メッセージの送受信用) は、クライアントとサーバーによって別々のスレッドで作成されます。メインスレッドに LocationListener を登録します。問題は、GPS からの更新が得られないことです。観測された衛星の数と最初の修正にかかった時間を表示する別のアプリを実行して、GPS をチェックしました。最初の修正には約 90 秒かかりました。

私が抱えている問題は、ここここで言及されているものと非常によく似ています。こちらも。

私のコードは以下のとおりです。

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.getBestProvider(criteria, true);
    isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

    if (!isGPSEnabled) {
        Log.i(TAG,"PING: GPS not enabled");
    } else {
        Log.i(TAG,"PING: GPS enabled");
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
        Log.i(TAG,"PING: adding GPS status listener");
        locationManager.addGpsStatusListener(PingActivity.this);
    }

/*The server and client threads are started after this.*/

LocationListener は次のとおりです。

LocationListener locListener = new LocationListener()
{
    @Override
    public void onLocationChanged(Location location) {
        Log.i(TAG, "PING: onLocationChanged");
        Log.i(TAG, "PING: location is " + location.getLatitude() + ", " + location.getLongitude());
}

ご覧のとおり、LocationListener には 2 つのログ ステートメントしかなく、これら 2 つのログ ステートメントはまったく出力されません。更新を常にリッスンしているスレッドがあり、LocationListener が呼び出されないためですか? また、クライアント サーバー スレッドを開始する前に、GPS 用に別のアクティビティを作成して登録することも試みました。

これらは、マニフェスト ファイル内のアクセス許可です。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>

LogCat に表示されるメッセージは次のとおりです。

duplicate add listener for uid

誰かがこれに光を当てることができますか? ありがとう。

4

1 に答える 1

-1

コードのエラーが発生します(Android ソースからの抜粋)

 private void handleAddListener(int uid) {
     synchronized(mListeners) {
         if (mClientUids.indexOfKey(uid) >= 0) {
             // Shouldn't be here -- already have this uid.
            Log.w(TAG, "Duplicate add listener for uid " + uid);
            return;
        }   
        mClientUids.put(uid, 0);
        if (mNavigating) {
            try {
                mBatteryStats.noteStartGps(uid);
            } catch (RemoteException e) {
                Log.w(TAG, "RemoteException in addListener");
            }
        }
    }
}

mClientUidsとして宣言されています

private final SparseIntArray mClientUids = new SparseIntArray();

そして、あなたのコードでは、

   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
    locationManager.addGpsStatusListener(PingActivity.this);

ここでは、2 つの異なるリスナーを追加していますが、それが Android の不満です。

于 2013-10-06T01:09:25.883 に答える