Отображать диалоговое окно с предупреждением, если в Firebase нет содержимого - PullRequest
0 голосов
/ 18 октября 2018

У меня есть приложение, которое получает местоположение пользователя и отправляет его в мою базу данных Firebase, в которой находится список мест, ближайших к пользователю.Радиус местоположения был установлен менее 50 км (50000 м).если в этом радиусе нет мест, я хочу, чтобы появилось диалоговое окно с предупреждением о том, что мест нет.Места будут обновляться по мере запуска приложения.Диалог предупреждения должен отображаться каждый раз, когда пользователь пытается получить доступ к местоположениям в пределах установленного радиуса.Может ли кто-нибудь помочь мне с этим?Любая помощь будет принята с благодарностью.

LActivity

public class LActivity extends AppCompatActivity implements
    LocationListener,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {

private static final String TAG = "Location1";
private static final long INTERVAL = 1000 * 10;
private static final long FASTEST_INTERVAL = 1000 * 5;
;
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;

public Location mCurrentLocation;
String mLastUpdateTime;
ViewPager viewPager;

ProgressDialog progressdialog;

protected void createLocationRequest() {
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setInterval(INTERVAL);
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    progressdialog = new ProgressDialog(this);
    progressdialog.setMessage("Pending");

    Runnable progressRunnable = new Runnable() {
        @Override
        public void run() {
            progressdialog.cancel();
        }
    };

    Handler pdcanceller = new Handler();
    pdcanceller.postDelayed(progressRunnable,1500);
    progressdialog.show();



    createLocationRequest();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    setContentView(R.layout.activity_rape_location);

    viewPager = (ViewPager) findViewById(R.id.viewpagerL);
    viewPager.setAdapter(new RapeLocationPageAdapter(getSupportFragmentManager(),
            LActivity.this));


}

public void getLocation(View view) {
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 501);
    } else {
        mGoogleApiClient.connect();
    }

    progressdialog.show();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 501) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            mGoogleApiClient.connect();
        } else {
            Toast.makeText(this, "Location permission denied. Please grant location permission to the app.", Toast.LENGTH_SHORT).show();
        }
    }
}

@Override
public void onStart() {
    super.onStart();
    Log.d(TAG, "onStart fired ..............");
    mGoogleApiClient.connect();
    progressdialog.show();

}

@Override
public void onStop() {
    super.onStop();
    Log.d(TAG, "onStop fired ..............");
    mGoogleApiClient.disconnect();
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    startLocationUpdates();
}

protected void startLocationUpdates() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED)
    {
        final AlertDialog builder = new AlertDialog.Builder(this).create();
        builder.setMessage("Location has not been granted");
        builder.setButton(AlertDialog.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

                builder.dismiss();
            }
        });

        builder.show();
        return;
    }


    PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, this);
    Log.d(TAG, "Location update started ..............: ");
    progressdialog.show();


}



@Override
public void onConnectionSuspended(int i) {


}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    final AlertDialog builder = new AlertDialog.Builder(this).create();
    builder.setMessage("If there are no locations near you, please contact the local police for immediate attention");
    builder.setButton(AlertDialog.BUTTON_POSITIVE, "Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {

            builder.dismiss();
        }
    });

    builder.show();

}

@Override
public void onLocationChanged(Location location) {
    mCurrentLocation = location;


     RapeLocation rapeLocation = (RapeLocation) getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.viewpagerRape + ":" + viewPager.getCurrentItem());
     rapeLocation.update(mCurrentLocation);



        }
}

LActivityMain

public class LActivityMain extends Fragment {

RecyclerView recyclerView;
LocationsAdapter locationsAdapter;
ArrayList<LocationModel> locationModelArrayList = new ArrayList<LocationModel>();
ArrayList<LocationModel> filteredlocationModelArrayList = new ArrayList<LocationModel>();
protected DatabaseReference mDatabase;
LActivityMain locationActivityfin;
Button bnt1;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.activity_locationmain, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    locationActivityfin = (LActivityMain) getActivity();
    mDatabase = FirebaseDatabase.getInstance().getReference();
    recyclerView = view.findViewById(R.id.rvLocations);
    bnt1 = view.findViewById(R.id.locdone);
    bnt1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            getActivity().onBackPressed();




        }
    });




    locationsAdapter = new LocationsAdapter(getActivity(), new OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            LatLng latLng = new LatLng(filteredlocationModelArrayList.get(position).getLatitude(),
                    filteredlocationModelArrayList.get(position).getLongitude());
            String url = "http://maps.google.com/maps?saddr=" + locationActivityfin.mCurrentLocation.getLatitude() + "," + locationActivityfin.mCurrentLocation.getLongitude() + "&daddr=" + latLng.latitude + "," + latLng.longitude + "&mode=driving";
            Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                    Uri.parse(url));
            PackageManager packageManager = getActivity().getPackageManager();
            if (intent.resolveActivity(packageManager) != null) {
                startActivity(intent);
            } else {
                if (getView() != null)
                    Snackbar.make(getView(), "Make sure Google Maps is installed to use this feature", Snackbar.LENGTH_LONG).show();
            }

        }
    }, filteredlocationModelArrayList);
    getDataFromServer();

   //textView.setText(getArguments().getDouble("latitude") + ", " + getArguments().getDouble("longitude"));
}
public void update(Location location) {
    //  Toast.makeText(getActivity(), "updated", Toast.LENGTH_SHORT).show();
    filteredlocationModelArrayList.clear();
    for (LocationModel locationModel : locationModelArrayList) {
        Location location1 = new Location("Loc");
        location1.setLatitude(locationModel.getLatitude());
        location1.setLongitude(locationModel.getLongitude());
        if (location1.distanceTo(location) <= 50000 && filteredlocationModelArrayList.size() < 30) {
            double distance = (double) (location1.distanceTo(location) / 1000);
            try {
                distance = round(distance, 2);
            } catch (Exception e) {


            }



            locationModel.setDistance(distance);
            filteredlocationModelArrayList.add(locationModel);
        }



        locationsAdapter.update(filteredlocationModelArrayList);

    }
}

public double round(double value, int places) {
    if (places <= 0) throw new IllegalArgumentException();

    BigDecimal bd = new BigDecimal(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

void getDataFromServer() {
    mDatabase.child("ali").child("location221").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dataChild : dataSnapshot.getChildren()) {

                LocationModel locationModel = dataChild.getValue(LocationModel.class);
                locationModelArrayList.add(locationModel);
            }
            recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            recyclerView.setAdapter(locationsAdapter);
            if (locationActivityRape.mCurrentLocation != null) {
                update(locationActivityRape.mCurrentLocation);
            }




        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

}

1 Ответ

0 голосов
/ 18 октября 2018

Предполагая, что вы выяснили как сказать, что какой-то ресурс находится на некотором расстоянии от приложения, следующий вопрос: хотите ли вы обновить приложение в течение всего его жизненного цикла или просто при запуске или возобновлении работы?.

В первом случае при инициализации приложения вы запускаете какое-то временное задание.Вы хотите, чтобы этот код был вне потока пользовательского интерфейса, и ему, вероятно, нужно использовать сеть для своей работы.Идея состоит в том, что эта задача периодически просыпается и делает все, что нужно для проверки внешних ресурсов.

Пока она находит какие-либо действительные ресурсы, она просто переходит в спящий режим.Если он не находит допустимых ресурсов, он либо вызывает метод обратного вызова, либо вызывает намерение, которое ваш клиентский код прослушивает, чтобы отобразить диалоговое окно, позвонить в звонок и т. Д. Убедитесь, что вы закрыли эту задачу при очистке приложения и убедитесь, чтоВы можете отменить состояние выполнения и / или оно обрабатывает и использует тайм-ауты.

Если только один раз при запуске просто запустите AsyncTask, который получает некоторые результаты, а затем сообщает через свой обработчик потока пользовательского интерфейса (или связывается свызывающего абонента), поэтому можно отобразить диалоговое окно и, возможно, закрыть приложение (если эти ресурсы имеют решающее значение для жизненного цикла приложения).

Связанные вопросы и ответы: Timertask или Handler , Пример AsyncTask для Android (Но есть много других ресурсов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...