このServiceで、やりたいことはできるのですが、先輩にこれじゃ、改善しないと使えないって言われました。コードが汚いってことだと思うんですが、どこが問題でしょうか?
java
1import android.app.Service; 2import android.content.Intent; 3import android.location.Criteria; 4import android.location.LocationManager; 5import android.os.Binder; 6import android.os.IBinder; 7import android.location.LocationListener; 8import android.content.pm.PackageManager; 9import android.location.Location; 10import android.support.v4.app.ActivityCompat; 11import android.os.Bundle; 12import android.util.Log; 13import com.google.firebase.database.DatabaseReference; 14import com.google.firebase.database.FirebaseDatabase; 15import com.google.firebase.auth.FirebaseAuth; 16 17public class GpsService extends Service implements LocationListener{ 18 19 private final String TAG ="GpsService"; 20 final FirebaseDatabase database = FirebaseDatabase.getInstance(); 21 22 23 public class GpsServiceBinder extends Binder { 24 public GpsService getService() { 25 return GpsService.this; 26 } 27 } 28 29 @Override 30 public void onCreate() { 31 super.onCreate(); 32 } 33 34 public GpsService() { 35 } 36 37 //removeupdatesは必要 38 // @Override 39 // protected void onPause(){ 40 // super.onPause(); 41 // locationManager.removeUpdates(this); 42 // mLocationManager.removeUpdates(listener); 43 // } 44 45 protected void initLocationService() { 46 47 if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 48 return; 49 } 50 if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 51 ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 52 return; 53 } 54 55 Criteria criteria = new Criteria(); 56 criteria.setAccuracy(Criteria.ACCURACY_FINE); //setAccuracyは内部では、https://stackoverflow.com/a/17874592/1709287の用にHorizontalAccuracyの設定に変換されている 57 criteria.setPowerRequirement(Criteria.POWER_HIGH); 58 criteria.setAltitudeRequired(false); 59 criteria.setSpeedRequired(true); 60 criteria.setCostAllowed(true); 61 criteria.setBearingRequired(false); 62 criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH); 63 criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH); 64 65 66 LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 67 String bestProvider = locationManager.getBestProvider(criteria, true); 68 locationManager.requestLocationUpdates(bestProvider, 6000, 1, this); 69 } 70 71 @Override 72 public void onLocationChanged(Location location) { 73 Log.d(TAG,"onLocationChanged"); 74 refreshGeoLocation(location); 75 } 76 77 @Override 78 public void onStatusChanged(String provider, int status, Bundle extras) { 79 } 80 81 @Override 82 public void onProviderEnabled(String provider) { 83 } 84 85 @Override 86 public void onProviderDisabled(String provider) { 87 } 88 89 Double forlatitude; 90 Double forlongitude; 91 boolean run=false; 92 Double pchecklatitude = 0.0; 93 Double mchecklatitude = 0.0; 94 Double pchecklongitude = 0.0; 95 Double mchecklongitude = 0.0; 96 Integer count=0; 97 98 protected void refreshGeoLocation(Location location) { 99 Log.v(TAG,"refreshGeoLocation"); 100 String user = FirebaseAuth.getInstance().getCurrentUser().getUid(); 101 DatabaseReference ref = database.getReference().child("users").child(user); 102 DatabaseReference latitudeRef = ref.child("latitude"); 103 DatabaseReference longitudeRef = ref.child("longitude"); 104 105 106 count++; 107 if (count == 1) { 108 forlatitude = location.getLatitude(); 109 forlongitude = location.getLongitude(); 110 } 111 if (run == false) { 112 pchecklatitude = forlatitude + 0.00025094944; 113 mchecklatitude = forlatitude - 0.00025094944; 114 pchecklongitude = forlongitude + 0.00025094944; 115 mchecklongitude = forlongitude - 0.00025094944; 116 117 Log.v(TAG,"LocationChange():"+count.toString()); 118 Log.v(TAG,"getLatitude():"+location.getLatitude()+"pchecklatitude"+pchecklatitude.toString()); 119 Log.v(TAG,"getLatitude():"+location.getLatitude()+"mchecklatitude"+mchecklatitude.toString()); 120 121 if (location.getLatitude() > pchecklatitude || location.getLatitude() < mchecklatitude && 122 location.getLongitude() > pchecklongitude || location.getLongitude() < mchecklongitude) { 123 124 latitudeRef.setValue(location.getLatitude()); 125 longitudeRef.setValue(location.getLongitude()); 126 run = true; 127 128 Log.v(TAG,"移動検知:"+count.toString()); 129 Log.v(TAG,"getLatitude():"+location.getLatitude()+"pchecklatitude"+pchecklatitude.toString()); 130 Log.v(TAG,"getLatitude(:)"+location.getLatitude()+"mchecklatitude"+mchecklatitude.toString()); 131 132 //ここで保存用に追加 133 forlatitude = location.getLatitude(); 134 forlongitude = location.getLongitude(); 135 } 136 } else if (run == true) { 137 latitudeRef.setValue(location.getLatitude()); 138 longitudeRef.setValue(location.getLongitude()); 139 Log.v(TAG,"追跡中:"+count.toString()); 140 Log.v(TAG,"getLatitude():"+location.getLatitude()+"pchecklatitude"+pchecklatitude.toString()); 141 Log.v(TAG,"getLatitude():"+location.getLatitude()+"mchecklatitude"+mchecklatitude.toString()); 142 } 143 } 144 145 @Override 146 public IBinder onBind(Intent intent) { 147 throw new UnsupportedOperationException("Not yet implemented"); 148 } 149 150 private void startLocation() { 151 initLocationService(); 152 } 153 154 private void stopLocation() { 155 //firebase.auth().signOut();これでログアウトはできるが、ログアウトはしない 156 database.goOffline(); 157 } 158 159 @Override 160 public int onStartCommand(Intent intent, int flags, int startId) { 161 162 String check =intent.getStringExtra("start/stop"); 163 if(check.equals("start")){ 164 startLocation(); 165 }else if(check.equals("stop")){ 166 stopLocation(); 167 } 168 169 return super.onStartCommand(intent, flags, startId); 170 } 171 172 @Override 173 public void onDestroy() { 174 super.onDestroy(); 175 } 176 177} 178
回答4件
あなたの回答
tips
プレビュー