2016-08-29 2 views
1

Erklärung: Ich weiß, dass diese Frage meistens wiederholt wird, aber ich habe ein bisschen Verwirrung. Ich arbeite an Live-Bewerbung. In dem, ich lese die JSON-Daten in JSON gibt es einige Längen- und Breitengrade sind da. Ich hole den Vergleich mit der aktuellen Länge und Breite. Ich habe einige Methoden gefunden und ich habe versucht, aber nicht die erwartete Ausgabe bekommen.Wie kann ich die Entfernung zwischen den beiden Längengrad und zwei Breitengrad in Kilometer in Android?

Ich möchte vergleichen, wenn meine aktuelle Länge und Breite unter den fünf Kilometers (km) von der json Breite und Länge ist. Wenn der Benutzer nicht mehr in der Reichweite ist, dann wird der Nachrichtenbenutzer außerhalb der Reichweite angezeigt.

Hier ist mein Code die longtitude und Breitengrad

public class HomeFragment extends Fragment implements ConnectionCallbacks, OnConnectionFailedListener,LocationListener{ 

    public static final String TAG=TransactionFragment.class.getSimpleName(); 
    public static final String KEY_UGC="postData[ugc]"; 
    public static final String KEY_CUSTOMER_ID="postData[customerid]"; 
    public static final String KEY_UGC_ID="postData[ugcid]"; 

    View rootView; 
    PreferenceSetting prefManager; 

    ListView lvTransaction; 
    List<String> items; 
    TextView txtPoints; 
    Button btnUgc,btnMore; 
    List<Trasaction> trasactionList; 
    TextView lblTrasaction,lblStation,lblNoBottle,lblPointsColl,lblPoints; 

    int totalPoints=0; 
    MainActivity activity; 

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000; 
    private GoogleApiClient mGoogleApiClient; 
    private LocationRequest mLocationRequest; 
    private double currentLatitude; 
    private double currentLongitude; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     rootView=inflater.inflate(R.layout.fragment_home,container,false); 

     prefManager=PreferenceSetting.getInstance(getActivity()); 


     mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
       // The next two lines tell the new client that “this” current class will handle connection stuff 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       //fourth line adds the LocationServices API endpoint from GooglePlayServices 
       .addApi(LocationServices.API) 
       .build(); 

     // Create the LocationRequest object 
     mLocationRequest = LocationRequest.create() 
       .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
       .setInterval(10 * 1000)  // 10 seconds, in milliseconds 
       .setFastestInterval(1 * 1000); // 1 second, in milliseconds 

     activity=(MainActivity)getActivity(); 
     lblTrasaction=(TextView)rootView.findViewById(R.id.lbl_trasaction); 
     lblTrasaction.setTypeface(AppController.fntAlice); 

     lblStation=(TextView)rootView.findViewById(R.id.lbl_station); 
     lblStation.setTypeface(AppController.fntVani); 

     lblNoBottle=(TextView)rootView.findViewById(R.id.lbl_no_bottle); 
     lblNoBottle.setTypeface(AppController.fntVani); 

     lblPointsColl=(TextView)rootView.findViewById(R.id.lbl_points_coll); 
     lblPointsColl.setTypeface(AppController.fntVani); 

     lblPoints=(TextView)rootView.findViewById(R.id.lbl_points); 
     lblPoints.setTypeface(AppController.fntVani); 

     btnUgc=(Button)rootView.findViewById(R.id.btn_ugc); 
     btnUgc.setTypeface(AppController.fntVani); 

     btnMore=(Button)rootView.findViewById(R.id.btn_more); 
     btnMore.setTypeface(AppController.fntVani); 

     txtPoints=(TextView)rootView.findViewById(R.id.txt_points); 
     txtPoints.setTypeface(AppController.fntVani); 

     if(prefManager.getPoints()==0){ 
      txtPoints.setText("0"); 
     } 
     else{ 
      txtPoints.setText(""+prefManager.getPoints()); 
     } 
     if(Utils.isNetworkConnected(getActivity())){ 
      RequestParams params=new RequestParams(); 
      params.put(ApiCalls.REQUEST_CASE_LABEL,"customerHistory"); 
      params.put("postData[customerid]",prefManager.getCustomerId()); 
      getTransactionApiCall(params); 
     } 
     else{ 
      Toast.makeText(getActivity(),getString(R.string.internet), Toast.LENGTH_SHORT).show(); 
     } 


     items=new ArrayList<>(); 

     lvTransaction=(ListView)rootView.findViewById(R.id.lv_transaction); 

     btnMore.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Message message=new Message(); 
       Bundle bundle=new Bundle(); 
       bundle.putString("more","1"); 
       message.setData(bundle); 
       activity.uiHandler.sendMessage(message); 
      } 
     }); 
     btnUgc.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       showDialog(); 
      } 
     }); 
     return rootView; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     Log.v(this.getClass().getSimpleName(), "onPause()"); 

     //Disconnect from API onPause() 
     if (mGoogleApiClient.isConnected()) { 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
      mGoogleApiClient.disconnect(); 
     } 
    } 
    @Override 
    public void onConnected(Bundle bundle) { 
     if (Build.VERSION.SDK_INT >= 21 && 
       ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
       ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return ; 
     } 
     else { 
      Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 

      if (location == null) { 
       LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

      } else { 
       currentLatitude = location.getLatitude(); 
       currentLongitude = location.getLongitude(); 
      } 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) {} 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     if (connectionResult.hasResolution()) { 
      try { 
       connectionResult.startResolutionForResult(getActivity(), CONNECTION_FAILURE_RESOLUTION_REQUEST); 

      } catch (IntentSender.SendIntentException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      Log.e("Error", "Location services connection failed with code " + connectionResult.getErrorCode()); 
     } 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     currentLatitude = location.getLatitude(); 
     currentLongitude = location.getLongitude(); 
    } 

    public void getUcgCallApi(final RequestParams params){ 
     AsyncHttpClient client=new AsyncHttpClient(); 
     client.setTimeout(AsyncHttpClient.DEFAULT_SOCKET_TIMEOUT); 
     client.post(ApiCalls.API_CALL, params, new AsyncHttpResponseHandler() { 

      @Override 
      public void onStart() { 
       super.onStart(); 
       Log.i(TAG,"GET UGC PARAMS:->>>"+params.toString()); 
      } 

      @Override 
      public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
       try{ 
        String str=new String(responseBody); 
        JSONObject mainObj=new JSONObject(str); 
        Log.e(TAG,"SUCCESS RESPONSE:=>>"+mainObj.toString()); 

        if(mainObj.has("status") && !mainObj.isNull("status")){ 
         if(mainObj.getString("status").equalsIgnoreCase("Success")){ 
          JSONArray data=mainObj.getJSONArray("data"); 

          JSONObject dataObj=data.getJSONObject(0); 

          prefManager.setPkUgcId(dataObj.getString("PK_UGC_ID")); 
          prefManager.setUgcCode(dataObj.getString("UGC_CODE")); 

          if(!prefManager.getPkUgcId().equals(PreferenceSetting.DEFAULT)){ 
           Log.e(TAG,"UGC ID STORED::"+prefManager.getPkUgcId()+"\nUGC CODE::->"+prefManager.getUgcCode()); 

           Date timeDate=Utils.getDate(Long.parseLong(dataObj.getString("EXPIRED_TIME"))); 

           Log.e(TAG,"DATE UTIL:->"+timeDate); 
           Date currentDate=new Date(); 

           double LOCATION_LATITUDE=Double.parseDouble(dataObj.getString("LOCATION_LATITUDE")); 
           double LOCATION_LONGITUDE=Double.parseDouble(dataObj.getString("LOCATION_LONGITUDE")); 

           Log.e(TAG,"GETCURRENT TIME:->"+currentDate.toString()); 

           if(timeDate.after(currentDate)){ 
            Log.e(TAG,"FIRST DISTANCE:->"+distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE)); 
            if((distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE)/1000) <= 5) { 
             Log.e(TAG,"AFTER DISTANCE:->"+distance(currentLatitude,currentLongitude,LOCATION_LATITUDE,LOCATION_LONGITUDE)); 
             RequestParams reqParams = new RequestParams(); 
             reqParams.put(ApiCalls.REQUEST_CASE_LABEL, "UGCReading"); 
             reqParams.put(KEY_UGC, prefManager.getUgcCode()); 
             reqParams.put(KEY_CUSTOMER_ID, prefManager.getCustomerId()); 
             reqParams.put(KEY_UGC_ID, prefManager.getPkUgcId()); 
//          readUgcCodeApiCall(reqParams); 
            } 
            else{ 
             Toast.makeText(getActivity(), "“You are out of range for redeem", Toast.LENGTH_SHORT).show(); 
            } 
           } 
           if(timeDate.before(currentDate)){ 
            Toast.makeText(getActivity(), "UGC Code Expired", Toast.LENGTH_SHORT).show(); 
           } 
          } 
         } 
         else{ 
          Toast.makeText(getContext(), mainObj.getString("status"), Toast.LENGTH_SHORT).show(); 
         } 
        } 

       } 
       catch (Exception e){ 
        Log.e(TAG,"on Success()==>"+Log.getStackTraceString(e)); 
       } 
      } 

      @Override 
      public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 
       try{ 
        String str=new String(responseBody); 
        JSONObject mainObj=new JSONObject(str); 

        Log.e(TAG,"FAILURE RESPONSE:=>>"+mainObj.toString()); 
       } 
       catch (Exception e){ 
        Log.e(TAG,"on Failure()==>"+Log.getStackTraceString(e)); 
       } 
      } 
     }); 
    } 

    public void readUgcCodeApiCall(final RequestParams params){ 
     AsyncHttpClient client=new AsyncHttpClient(); 
     client.setTimeout(AsyncHttpClient.DEFAULT_SOCKET_TIMEOUT); 
     client.post(ApiCalls.API_CALL, params, new AsyncHttpResponseHandler() { 

      @Override 
      public void onStart() { 
       super.onStart(); 
       Log.e(TAG,"PARAMS:->>>"+params.toString()); 
      } 

      @Override 
      public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
       try { 
        String str=new String(responseBody); 
        JSONObject mainObj=new JSONObject(str); 
        Log.e(TAG,"SUCCESS RESPONSE readUgcCodeApiCall :=>>"+mainObj.toString()); 

        if(mainObj.has("status") && !mainObj.isNull("status")){ 
         if(mainObj.getString("status").equalsIgnoreCase("Success")){ 
          Toast.makeText(getActivity(),getString(R.string.success), Toast.LENGTH_SHORT).show(); 

          RequestParams params=new RequestParams(); 
          params.put(ApiCalls.REQUEST_CASE_LABEL,"customerHistory"); 
          params.put("postData[customerid]",prefManager.getCustomerId()); 
          getTransactionApiCall(params); 
         } 
         else{ 
          Toast.makeText(getActivity(),getString(R.string.unsuccess), Toast.LENGTH_SHORT).show(); 
         } 
        } 

       } catch (Exception e) { 
        Log.e(TAG,"on Success()==>"+Log.getStackTraceString(e)); 
       } 
      } 

      @Override 
      public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { 
       try { 
        String str=new String(responseBody); 
        JSONObject mainObj=new JSONObject(str); 
        Log.e(TAG,"FAILURE RESPONSE:=>>"+mainObj.toString()); 

       } catch (Exception e) { 
        Log.e(TAG,"on Failure()==>"+Log.getStackTraceString(e)); 
       } 
      } 
     }); 
    } 
    private double distance(double lat1, double lon1, double lat2, double lon2) { 
     double theta = lon1 - lon2; 
     double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); 
     dist = Math.acos(dist); 
     dist = rad2deg(dist); 
     dist = dist * 60 * 1.1515; 
     return (dist); 
    } 

    private double deg2rad(double deg) { 
     return (deg * Math.PI/180.0); 
    } 
    private double rad2deg(double rad) { 
     return (rad * 180.0/Math.PI); 
    } 
    public void showDialog(){ 

     final Dialog dialog=new Dialog(getContext()); 
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     dialog.setContentView(R.layout.claim_dialog); 
     dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
     dialog.setCanceledOnTouchOutside(true); 
     dialog.setCancelable(true); 

     final EditText editClaim=(EditText)dialog.findViewById(R.id.edit_claim); 
//  editClaim.setTypeface(AppController.fntVani); 
     Button btnClaim=(Button)dialog.findViewById(R.id.btn_claim); 
     btnClaim.setTypeface(AppController.fntVani); 

     btnClaim.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       if(!editClaim.getText().toString().trim().equals("")) { 

        if (Utils.isNetworkConnected(getActivity())) { 
         RequestParams params=new RequestParams(); 
         params.put(ApiCalls.REQUEST_CASE_LABEL,"getUGCDetails"); 
         params.put(KEY_UGC,editClaim.getText().toString().trim()); 
         getUcgCallApi(params); 
         if(dialog.isShowing()){ 
          dialog.dismiss(); 
         } 

        } else { 
         Toast.makeText(getContext(), getString(R.string.internet), Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 
     }); 
     dialog.show(); 
    } 
} 

JSON RESPONSE

enter image description here

In obigen Code gibt es eine Eins-Methode nämlich getUcgCallApi() in dieser i versuchte zu bekommen vergleiche alte und aktuelle Längen- und Breitengrade.

Bitte helfen Sie mir, dieses Problem zu lösen.

Vielen Dank im Voraus.

Antwort

3

dies testen Abstand zwischen zwei lat bekommen - lang:

float[] distance = new float[1]; 



    Location.distanceBetween(mLocation.latitude, mLocation.longitude, locations.latitude, locations.longitude, distance); 

Der berechnete Abstand wird in Abstand [0] gespeichert. Wenn die Entfernung die Länge 2 oder größer hat, wird die anfängliche Peilung in der Entfernung gespeichert [1]. Wenn die Entfernung 3 oder mehr beträgt, wird das endgültige Lager in der Entfernung gespeichert [2].

+0

Was muss ich im Abstandsparameter dieser Methode übergeben? –

+1

überprüfen aktualisierte antwort –

+0

die float-werte ist in meter oder kilometer? –

0

Check diesen Link es für Sie sein wird hilfreich:

Calculate distance in meters when you know longitude and latitude in java

public static float distFrom(float lat1, float lng1, float lat2, float lng2) { 
    double earthRadius = 6371000; //meters 
    double dLat = Math.toRadians(lat2-lat1); 
    double dLng = Math.toRadians(lng2-lng1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
       Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
       Math.sin(dLng/2) * Math.sin(dLng/2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    float dist = (float) (earthRadius * c); 

    return dist; 
    } 

Rufen Sie diese Methode:

float meter= distFrom(LOCATION_LATITUDE1,LOCATION_LONGITUDE2,LOCATION_LATITUDE2,LOCATION_LONGITUDE2); 


final float kilometer=meter/1000; 

Sie Meter Entfernung zum Kilometer umwandeln kann.

Verwandte Themen