0

私は店舗に関係するクライアントサーバーAndroidアプリ を構築しています.(ユーザーがデータベースをオンラインで2つまたは3つの店舗に近い場合)、これらの店舗のデータベースの1つに接続できることをアプリに理解させ、それらを画面にリストします。(インターネットに接続したいときに、利用可能なwifiで何が起こっているのか)

どうすればそれを達成できますか?
私が探しているものを明確にしたことを願っています。

4

1 に答える 1

0

私が間違っている場合は修正してください。サーバー/データベースがストアに属しているサーバーからデータにアクセスできるアプリを作成していますか?

あなたの質問に対する私の理解が正しければ、次のことを行ってください。

  • 接続の変更をリッスンする接続ブロードキャストを作成する
  • 現在の位置と店舗の位置に基づいた位置を比較する GPS マネージャーを作成する
  • 1 つ以上のストアの範囲内にあり、かつ接続が利用可能な場合は、サーバー側で restfull リクエストを介してサーバーにクエリを実行し、クエリを起動して、結果が得られるかどうかを確認します (特定のクエリが存在するかどうかはわかりませんサーバー側コードからデータベースへのデータベース接続を確認します) 結果が得られた場合、データベースは利用可能であり、サーバーからクライアントに結果を送り返し、データベース/ストアを利用可能として一覧表示します。

個人的には、クライアント <-> サーバーからのリクエストに JSON を使用します。軽くて使いやすいので。

ブロードキャスターの作成用: BraodcastReciever

例:

private Context _context;
private State _state;
private boolean _listening;
private String _reason;
private boolean _isFailOver;

private NetworkInfo _networkInfo;

private NetworkInfo _otherNetworkInfo;
private ConnectivityBroadcastReceiver _receiver;
/**
 * The broadcast that listens to connectivity changes(wifi, mobile network etc)
 * */
private class ConnectivityBroadcastReceiver extends BroadcastReceiver {
    /**
     * Called when connectivity state changes
     * 
     * @param Context the context
     * @param Intent the intent containing the information about the change
     * */
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if(!action.equals(ConnectivityManager.CONNECTIVITY_ACTION) || _listening == false) {
            Log.w(TAG, "onReceived() called with " + _state.toString() + " and " + intent);
            return;
        }

        boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

        //Set the state according to current connectivity.
        if(noConnectivity) {
            _state = State.NOT_CONNECTED;
        } else {
            _state = State.CONNECTED;
        }

        //If current state is CONNECTED. Start background services, otherwise stop services.
        switch(_state) {
        case CONNECTED:
            //Do stuff when connected
            break;
        case NOT_CONNECTED:
            //Do stuff if not connected
            break;
        }

        _networkInfo = (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        _otherNetworkInfo = (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);

        _reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
        _isFailOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);

        Log.d(TAG, "onRecieve(): _networkInfo= " + _networkInfo + " _otherNetworkInfo= " + (_otherNetworkInfo == null ? "[none]" : _otherNetworkInfo + 
                " noConn= " + noConnectivity) + " _state= " + _state.toString());
    }
};

コード全体を投稿しているわけではありません。ConnectivityBroadcastReceiver のラッパーを作成しました。しかし、指定されたコードを使用すると、十分に遠くまで到達できるはずです。コードの状態は、CONNECTED、NOT_CONNECTED、UNKNOWN の 3 つの値を含む列挙型であることに注意してください。

GPSマネージャーに関して:

    /**
 * <h1>GPSManager</h1>
 * 
 * <p>
 * Manager for GPS tracking.
 * Able to enable and disable GPS tracking for the application.
 * </p>
 * */
public class GPSManager {
    public static final String TAG = "LocationFinder";
    private double _lat;
    private double _lon;
    private float _accuracy;
    private Context _context;
    private LocationManager _locManager;
    private LocationListener _locListener;

    private static GPSManager _instance;

    /**
     * Constructor.
     * 
     * @param context The context of the caller.
     * */
    private GPSManager(Context context) {
        this._context = context;
        this._locListener = new LocationTracker();
    }

    /**
     * GPSManager is singleton. Retrieve the shared instance.
     * 
     * @param context The context of the caller.
     * @return GPSManager An instance of the GPSManager class.
     * */
    public static synchronized GPSManager getInstance(Context context) {
        if(_instance == null) {
            _instance = new GPSManager(context);
        }
        return _instance;
    }

    /**
     * Start tracking GPS locations.
     * */
    public void startGpsTracking() {
        _locManager = (LocationManager)_context.getSystemService(Context.LOCATION_SERVICE);
        _locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
                0, 0, _locListener);
    }

    /**
     * Stop tracking GPS locations.
     * */
    public void stopGpsTracking() {
        _locManager.removeUpdates(_locListener);
        _locManager = null;
    }

    /**
     * Retrieve the latitude from the GPSManager.
     * 
     * @return double The latitude.
     * */
    public double getLatitude() {
        return _lat;
    }

    /**
     * Retrieve the longitude from the GPSManager.
     * 
     * @return double The longitude.
     * */
    public double getLongitude() {
        return _lon;
    }

    /**
     * Check if the GPSManager has a fix on a location.
     * 
     * @return boolean True if GPSManager has a fix, otherwise false.
     * */
    public boolean hasFix() {
        if(_lat != 0 && _lon != 0)
            return true;
        else
            return false;
    }

    /**
     * Retrieve the accuracy of the fix.
     * 
     * @return float The accuracy.
     * */
    public float getAccuracy() {
        return _accuracy;
    }

    /**
     * Retrieve the last known location.
     * 
     * @return Location The last known location.
     * */
    public Location getLastLocation() {
        return _locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    }

    /**
     * <h1>LocationTracker</h1>
     * 
     * <p>Tracks the location for the GPSManager.</p>
     * */
    private class LocationTracker implements LocationListener {
        /** (non-Javadoc)
         * @see android.location.LocationListener#onLocationChanged(android.location.Location)
         */
        @Override
        public void onLocationChanged(Location location) {      
            _lat = location.getLatitude();
            _lon = location.getLongitude();
            _accuracy = location.getAccuracy();
        }

        /** (non-Javadoc)
         * @see android.location.LocationListener#onProviderDisabled(java.lang.String)
         */
        @Override
        public void onProviderDisabled(String provider) {
            Log.d(TAG, "Gps Disabled");     
        }

        /** (non-Javadoc)
         * @see android.location.LocationListener#onProviderEnabled(java.lang.String)
         */
        @Override
        public void onProviderEnabled(String provider) {
            Log.d(TAG, "Gps Enabled");  
        }

        /** (non-Javadoc)
         * @see android.location.LocationListener#onStatusChanged(java.lang.String, int, android.os.Bundle)
         */
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {};
    };
}

必要に応じてこれを拡張してください。gps マネージャーのほとんどのコードは自明です。

そして、残りのものについては、非常に多くの異なるアプローチがあるため、自分で調べる必要があります.

あなたのコメントへの回答として、webrequest の実装を紹介します。私は個人的に apache-mime4j-0.6.jar と httpmime-4.0.1.jar を使用しています。

WebService _service = new WebService();
    @Override
    protected String doInBackground(String... arg0) {
        try {
            MultipartEntity multipart = new MultipartEntity();
            multipart.addPart("username", new StringBody(_inputName));
            multipart.addPart("password", new StringBody(_inputPass));

            _service.post(QfConfig.RESTFUL_LOGIN_URL, multipart);

            long response = _service.getLongResponse();

            if(response != 0) {
                _pgUserId = response;
                _onlineValidated = true;
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

あなたがPOSTしたいのかGETしたいのかわかりません。上記の例では POST を使用しています。MultipartEntity を作成し、それに 2 つのパーツを追加します。マルチパートは、POST 値の名前がユーザー名であるフォームとしてサーバーに送信され、名前がユーザー名である投稿の値は new StringBody(_inputName) です。

私の WebService クラスの投稿セクションの場合:

public void post(String url, MultipartEntity postData) {
    HttpClient client = null;
    HttpPost post = null;
    HttpResponse httpResponse = null;
    HttpEntity entity = null;
    InputStream _inStream = null;

    try {
        client = new DefaultHttpClient();
        post = new HttpPost();
        URI uri = URI.create(url);
        post.setURI(uri);
        post.setEntity(postData);
        //Execute the HttpPost request and store the response in httpResponse.
        httpResponse = client.execute(post);
        //Set the response code from the request's responst.
        setResponseCode(httpResponse.getStatusLine().getStatusCode());
        //Retrieve the entity from the response.
        entity = httpResponse.getEntity();

        if(entity != null) {
            //Retrieve the content from the entity.
            _inStream = entity.getContent();
            //Convert the InputStream to String and set the String response to the returned value.
            setStringResponse(IOUtility.convertStreamToString(_inStream));
            //Close the InputStream.
            Log.d(TAG, getStringResponse());
        }   

        //try to create a numeric value of the response result and store it if so
        if(GeneralUtil.isNumeric(getStringResponse())) {
            setLongResponse(Long.parseLong(getStringResponse()));
        }

        Log.d(TAG, httpResponse.getStatusLine().getReasonPhrase());
    } catch(Exception e) {
        e.printStackTrace();
        setResponseCode(0);
        setLongResponse(0);
        setStringResponse("");
    } finally {
        try {
            _inStream.close();
        } catch (Exception ignore) {}
    }
}

私はより複雑なhttpsを介して作業しているため、それらを省略しました. ここでは、新しい httpClient と HttpPost を作成し、投稿の場合は URI を設定し、マルチパート データを post.setEntity() に追加してから、リクエストを実行し、レスポンスを HttpResponse オブジェクトに保存します。

次に、エンティティを取得して HttpEntity として保存し、応答コンテンツをどこから取得するかについて説明します。これは、基本的に必要なものは何でも、JSON 文字列、数値にすることができます。次に、getter と setter によって結果を簡単に取得できるメソッドをいくつか設定します。

HttpGet をさらに簡単にするには、 url を渡すだけで済みます。 HttpGet オブジェクトを作成する HttpPost オブジェクトの代わりに、url _client.execute([HttpGet object]) を渡し、同じ方法で結果を取得します。

PHP スクリプトでは、文字通り $_POST['username'] を使用できます。これにより、上記のコードで StringBody に設定したユーザー名の値が得られます。

get を使用する場合は、URL を (パラメーターの有無にかかわらず) 送信し、その結果として JSON 文字列を get 要求に送り返すことをお勧めします。

さらにサポートが必要な場合はお知らせください。行ける範囲はここまでだと思いますが。自己設計のフレームワークを使用しているため、php 側を表示できません。

于 2012-05-18T09:56:46.107 に答える