私は店舗に関係するクライアントサーバーAndroidアプリ を構築しています.(ユーザーがデータベースをオンラインで2つまたは3つの店舗に近い場合)、これらの店舗のデータベースの1つに接続できることをアプリに理解させ、それらを画面にリストします。(インターネットに接続したいときに、利用可能なwifiで何が起こっているのか)
どうすればそれを達成できますか?
私が探しているものを明確にしたことを願っています。
私が間違っている場合は修正してください。サーバー/データベースがストアに属しているサーバーからデータにアクセスできるアプリを作成していますか?
あなたの質問に対する私の理解が正しければ、次のことを行ってください。
個人的には、クライアント <-> サーバーからのリクエストに 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 側を表示できません。