デバイスセンサーと位置情報を使用するアンドロイドアプリを作成しています。両方の情報源からのデータは、方位に関するいくつかのことを計算するために使用されます。これまでは、2つの非アクティビティクラスを作成しました.1つはセンサー管理用、もう1つはロケーション管理用です。問題は、たとえば、アクティビティやコンテキストが必要なものを使用したい場合です。たとえば、startResolutionForResult()
を呼び出してダイアログを表示し、結果をonActivityResult()
にチェックします。 startResolutionForResult()
ダイアログを表示するにはアクティビティが必要です。 これを解決する最善の方法は何ですか?私は各非活動クラスのフィールドメンバーとしてコンテキストを使用することに決めましたが、それが最良の選択肢かどうかはわかりません。アクティビティ、コンテキストメソッド、および非アクティビティクラスのオブジェクト
更新 ここに私が喜んでいるコードの一部です。私は場所がオンになっているかどうかを確認するためcheckLocationSettings()
メソッドを呼び出すonCreate()
方法で
。 Then onResult()
コールバックが発生し、場所の設定に応じて何をすべきかを判断できます。場所はオフになっているとき、それは すべてが魔法のように動作MainActivity.classの一部であるonActivityResult()
に
status.startResolutionForResult((Activity)getBaseContext(), REQUEST_CHECK_SETTINGS)
ユーザーの決定の結果が利用可能である
によって呼び出されるダイアログを示しているが、私は(活動についてconcerndよ)getBaseContext()特に。
GoogleServiceLocationProvider.class
public class GoogleServiceLocationProvider extends ContextWrapper implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback<LocationSettingsResult> {
private static final int REQUEST_CHECK_SETTINGS = 3;
private static final int UPDATE_INTERVAL = 10 * 1000; // 10 seconds
private static final int DISPLACEMENT = 10; // 10 meters
private GoogleApiClient googleApiClient;
private LocationRequest locationRequest;
private Location lastLocation;
private long lastTime;
LocationFinder.LocationUpdateListener locationUpdateListener;
private boolean isListenerRunning;
private LocationSettingsRequest locationSettingsRequest;
public GoogleServiceLocationProvider(Context base) {
super(base);
buildApiGoogleClient();
createLocationRequest();
buildLocationSettingsRequest();
}
private void buildLocationSettingsRequest() {
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
locationSettingsRequest = builder.build();
}
public void checkLocationSettings() {
if(googleApiClient != null && locationSettingsRequest != null){
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(
googleApiClient,
locationSettingsRequest
);
result.setResultCallback(this);
}
}
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
status.startResolutionForResult((Activity)getBaseContext(), REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
break;
}
}
MainActivity.class
一人ひとりのクラスにコンテキストのを渡す@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
useGoogleLocationServiceAPI();
}
private void useGoogleLocationServiceAPI(){
googleServiceLocationProvider = new GoogleServiceLocationProvider(this);
googleServiceLocationProvider.checkLocationSettings();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case PLAY_SERVICES_RESOLUTION_REQUEST:
switch(resultCode){
case RESULT_OK:
isGoogleLocationService = true;
useGoogleLocationServiceAPI();
break;
case RESULT_CANCELED:
Toast.makeText(this, getString(R.string.google_location_service_missing),
Toast.LENGTH_SHORT).show();
useAndroidLocationAPI();
break;
}
break;
case REQUEST_CHECK_SETTINGS:
switch(resultCode){
case RESULT_OK:
break;
case RESULT_CANCELED:
Toast.makeText(this, getString(R.string.location_off_message),
Toast.LENGTH_SHORT).show();
break;
}
break;
}
}
は、「コンテキスト」を関数のパラメータとして渡します。 –
getApplicationContextを使用します。アプリケーションの有効範囲はgetApplicationContextです。 – AndroidBeginner
@AndroidBeginnerこれはどこでも利用できません。 – AnixPasBesoin