2017-05-09 11 views
0

백그라운드 서비스 및 개장 라이브러리를 사용하지 않아서 새로운 앱을 디버깅하여 오류가 발생하지 않습니다. 서버에 보내기 (백그라운드 서비스) 도움을 주시면 감사하겠습니다. 미리 감사드립니다.업데이트 위치 라이브러리를 사용하여 GPS 위치를 업데이트하고 백그라운드 서비스에있는 서버에 좌표를 전송하십시오.

GPS 서비스

public class LocationUpdaterService extends Service 
{ 
    public static final int TWO_MINUTES = 120000; // 120 seconds 
    public static Boolean isRunning = false; 

    public LocationManager mLocationManager; 
    public LocationUpdaterListener mLocationListener; 
    public Location previousBestLocation = null; 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     mLocationListener = new LocationUpdaterListener(); 
     super.onCreate(); 
    } 

    Handler mHandler = new Handler(); 
    Runnable mHandlerTask = new Runnable(){ 
     @Override 
     public void run() { 
      if (!isRunning) { 
       startListening(); 
      } 
      mHandler.postDelayed(mHandlerTask, TWO_MINUTES); 
     } 
    }; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     mHandlerTask.run(); 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     stopListening(); 
     mHandler.removeCallbacks(mHandlerTask); 
     super.onDestroy(); 
    } 

    private void startListening() { 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
       || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) 
       mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener); 

      if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) 
       mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener); 
     } 
     isRunning = true; 
    } 

    private void stopListening() { 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
       || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      mLocationManager.removeUpdates(mLocationListener); 
     } 
     isRunning = false; 
    } 

    public class LocationUpdaterListener implements LocationListener 
    { 
     @Override 
     public void onLocationChanged(Location location) { 
      if (isBetterLocation(location, previousBestLocation)) { 
       previousBestLocation = location; 
       try { 
        // Script to post location data to server.. 

        Call<Update> loginCall; 
        String deviceKey; 

        deviceKey = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); 

        loginCall = MyApplication.getInstance().getAPI().update(deviceKey,String.valueOf(location.getLatitude()),String.valueOf(location.getLongitude())); 
        loginCall.enqueue(new Callback<Update>() { 
         @Override 
         public void onResponse(Call<Update> call, Response<Update> response) { 
          if(response.getClass() != null) 
          { 

          } 
         } 

         @Override 
         public void onFailure(Call<Update> call, Throwable t) { 

         } 

        }); 

       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
       finally { 
        stopListening(); 
       } 
      } 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      stopListening(); 
     } 

     @Override 
     public void onProviderEnabled(String provider) { } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { } 
    } 

    protected boolean isBetterLocation(Location location, Location currentBestLocation) { 
     if (currentBestLocation == null) { 
      // A new location is always better than no location 
      return true; 
     } 

     // Check whether the new location fix is newer or older 
     long timeDelta = location.getTime() - currentBestLocation.getTime(); 
     boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; 
     boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; 
     boolean isNewer = timeDelta > 0; 

     // If it's been more than two minutes since the current location, use the new location 
     // because the user has likely moved 
     if (isSignificantlyNewer) { 
      return true; 
      // If the new location is more than two minutes older, it must be worse 
     } else if (isSignificantlyOlder) { 
      return false; 
     } 

     // Check whether the new location fix is more or less accurate 
     int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); 
     boolean isLessAccurate = accuracyDelta > 0; 
     boolean isMoreAccurate = accuracyDelta < 0; 
     boolean isSignificantlyLessAccurate = accuracyDelta > 200; 

     // Check if the old and new location are from the same provider 
     boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); 

     // Determine location quality using a combination of timeliness and accuracy 
     if (isMoreAccurate) { 
      return true; 
     } else if (isNewer && !isLessAccurate) { 
      return true; 
     } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { 
      return true; 
     } 
     return false; 
    } 

    /** Checks whether two providers are the same */ 
    private boolean isSameProvider(String provider1, String provider2) { 
     if (provider1 == null) { 
      return provider2 == null; 
     } 
     return provider1.equals(provider2); 
    } 

내 응용 프로그램

import android.app.Application; 
import java.util.concurrent.TimeUnit; 
import okhttp3.OkHttpClient; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class MyApplication extends Application { 
    private API api; 
    private OkHttpClient client; 
    private static MyApplication sInstance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     sInstance = this; 
     configureAPI(); 

    } 

    private void configureAPI() { 
     client = new OkHttpClient.Builder() 
       .connectTimeout(80, TimeUnit.SECONDS) 
       .writeTimeout(300, TimeUnit.SECONDS) 
       .readTimeout(80, TimeUnit.SECONDS) 
       .build(); 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Server.API_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(client) 
       .build(); 
     api = retrofit.create(API.class); 
    } 

    public API getAPI() { 
     return api; 
    } 

    public static MyApplication getInstance() { 
     return sInstance; 
    } 
} 

API

public interface API { 
    @FormUrlEncoded 
    @POST("updateLocation") 
    Call<Update> update(@Query("token") String token, @Query("lat") String latitude, @Field("long") String longitude); 

} 

서버

public class Server { 
    public static final String API_URL = "http://192.168.146.2:8090/"; 
    public static final String REG_API_URL = "http://192.168.120.2:8090/"; 
    public static final String SndMsg_API_URL = "http://192.168.120.2:8090/"; 

} 

MainActivity

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Intent serviceIntent = new Intent(getApplicationContext(), LocationUpdaterService.class); 
     startService(serviceIntent); 

    } 
} 

답변

1

에 코드를 꽤 좋아 보인다. 문제를 유발할 수있는 몇 가지 사항이 있습니다. 그것들을 확인하십시오.

먼저 컴파일러가 "OnLocationChanged()"메서드 내부에 있는지 확인하십시오.

두 번째 사항은 웹 서비스 호출 방법이 "업데이트"유형인지 확인하십시오. 당신이 "업데이트"를 사용하기 때문입니다. 그것은 "게시"일 수 있습니다.

세 번째 것은 "OnFailure()"메소드에서 응답을 인쇄하는 것입니다. 아마도 실패 할 것입니다.

이 시나리오를 확인하여 문제를 발견하시기 바랍니다.

+0

나는 코드를 디버깅했습니다! 그는 (새로운 콜백 () 공공 무효 onFailure (전화 호출의 Throwable t) { { 공공 무효 onResponse이 ( 호출, 응답 응답) { } 전화} 내부 loginCall.enqueue을하지 않을 } }); –

+1

아마도 문제는 "업데이트"메서드로 메서드를 선언했다는 것입니다. 하지만 "게시"일 수 있습니다. 저것을 또한 검사하십시오. –

+0

없음의 포스트 그리고 난 후 –