package com.example.cosmosclient.services; import android.Manifest; import android.app.IntentService; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Color; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.RequiresApi; import android.support.v4.app.ActivityCompat; import android.util.Log; import android.widget.Toast; import com.example.cosmosclient.R; import com.example.cosmosclient.app.Cosmos; import com.example.cosmosclient.entities.AreaInformation; import com.example.cosmosclient.entities.Feature; import com.example.cosmosclient.entities.SignupResponse; import com.example.cosmosclient.resources.LocationRest; import com.example.cosmosclient.views.GroupListActivity; import com.example.cosmosclient.views.SignupActivity; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.jackson.JacksonConverterFactory; public class CosomosBackgroundService extends IntentService implements LocationListener { private Context context; private LocationManager locationManager; private Location LOC; private static final int MinTime = 1000;/*最小時間間隔*/ private static final float MinDistance = 1;/*最小距離間隔*/ public CosomosBackgroundService() { super("CosomosBackgroundService"); } @Override public void onCreate() { super.onCreate(); // Log.d("debug", "onCreate"); context = getApplicationContext(); // LocationManager インスタンス生成 locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); } @RequiresApi(api = Build.VERSION_CODES.O) @Override public int onStartCommand(Intent intent, int flags, int startId) { // Log.d("debug", "onStartCommand"); int requestCode = 0; String channelId = "default"; String title = context.getString(R.string.app_name); PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); // ForegroundにするためNotificationが必要、Contextを設定 NotificationManager notificationManager = (NotificationManager) context. getSystemService(Context.NOTIFICATION_SERVICE); // Notification Channel 設定 NotificationChannel channel = new NotificationChannel( channelId, title, NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription("Silent Notification"); // 通知音を消さないと毎回通知音が出てしまう // この辺りの設定はcleanにしてから変更 channel.setSound(null, null); // 通知ランプを消す channel.enableLights(false); channel.setLightColor(Color.BLUE); // 通知バイブレーション無し channel.enableVibration(false); if (notificationManager != null) { notificationManager.createNotificationChannel(channel); Notification notification = new Notification.Builder(context, channelId) .setContentTitle(title) // 本来なら衛星のアイコンですがandroid標準アイコンを設定 .setSmallIcon(android.R.drawable.btn_star) .setContentText("GPS") .setAutoCancel(true) .setContentIntent(pendingIntent) .setWhen(System.currentTimeMillis()) .build(); // startForeground startForeground(1, notification); } startGPS(); return START_NOT_STICKY; } @RequiresApi(api = Build.VERSION_CODES.O) @Override protected void onHandleIntent(Intent intent) { // Log.d("debug", "onHandleIntent"); } protected void startGPS() { // Log.d("debug", "startGPS"); final boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (!gpsEnabled) { // GPSを設定するように促す enableLocationSettings(); } if (locationManager != null) { try { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } // Log.d("debug", "requestLocationUpdates:"); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MinTime, MinDistance, this); } catch (Exception e) { // Log.d("debug", "Exception:"); e.printStackTrace(); } } else { } } @Override public void onDestroy() { // Log.d("debug", "onDestroy"); super.onDestroy(); } @Override public void onLocationChanged(Location location) { // Log.d("debug", "onLocationChanged"); Log.d("debug", "lat:" + location.getLatitude()); Log.d("debug", "lon:" + location.getLongitude()); LOC.setLatitude(location.getLatitude()); LOC.setLongitude(location.getLongitude()); if(LOC.hashCode() == 0){ //retrofitの処理 final Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/cosmos/rest/") .addConverterFactory(JacksonConverterFactory.create()) .build(); //interfaceから実装を取得 final LocationRest LocationService = retrofit.create(LocationRest.class); //API呼び出しのための値入力 Call<AreaInformation> call = LocationService.LocationService(LOC.getLatitude(),LOC.getLongitude()); //サーバからデータ受け取り call.enqueue(new Callback<AreaInformation>() { //成功時 @Override public void onResponse(Call<AreaInformation> call, Response<AreaInformation> response) { if (response.isSuccessful()) { AreaInformation result = response.body(); //app/Cosmosに情報保存 Cosmos app = (Cosmos) getApplication(); } else { //onFailureでキャッチできないエラー用 } } //失敗時 @Override public void onFailure(Call<AreaInformation> call, Throwable t) { t.printStackTrace(); } }); } } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } private void enableLocationSettings() { Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(settingsIntent); } }