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
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.
Was muss ich im Abstandsparameter dieser Methode übergeben? –
überprüfen aktualisierte antwort –
die float-werte ist in meter oder kilometer? –