package com.android.dayandnightdetector;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import com.google.android.gms.location.*;
import com.lb.twilight_calculator.TwilightCalculator;
import java.util.Calendar;
import java.util.Date;

public class MainActivity extends AppCompatActivity {
    private LocationCallback locationCallback;
    private boolean requestingLocationUpdates = false;
    private FusedLocationProviderClient fusedLocationClient;

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        locationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                if (locationResult == null) {
                    textView.setText("failed to get location for some reason");
                } else {
                    showDayNightInfo(locationResult.getLastLocation());
                    stopLocationUpdates();
                }
            }
        };
    }

    public void showDayNightInfo(Location location) {
        android.text.format.DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(this);
        TwilightCalculator twilightCalculator = TwilightCalculator.getInstance();
        Date date = new Date();
        TwilightCalculator.TwilightResult twilightResult = twilightCalculator.calculateTwilight(date.getTime(), location.getLatitude(), location.getLongitude());
        boolean isDay = twilightResult.isDay();
        String sunRiseText;
        if (twilightResult.getSunrise() != -1L) {
            Calendar sunRiseCal = Calendar.getInstance();
            sunRiseCal.setTimeInMillis(twilightResult.getSunrise());
            sunRiseText = "day starts at " + timeFormat.format(sunRiseCal.getTime());
        } else {
            sunRiseText = "day/night never ends";
        }
        String sunSetText;
        if (twilightResult.getSunset() != -1L) {
            Calendar sunSetCal = Calendar.getInstance();
            sunSetCal.setTimeInMillis(twilightResult.getSunset());
            sunSetText = "night starts at " + timeFormat.format(sunSetCal.getTime());
        } else {
            sunSetText = "day/night never ends";
        }
        String textOfNow = "current time to check:" + formatDateUsingDeviceSettings(this, date) + " " + formatTimeUsingDeviceSettings(this, date);
        textView.setText("got location:" + location + "\n" + sunRiseText + "\n" + sunSetText + "\n" + textOfNow + "\nis it day now? " + isDay);
    }

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onResume() {
        super.onResume();
        switch (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
            case PackageManager.PERMISSION_DENIED:
                textView.setText("need location permission to calculate when is day/night in your area");
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
                break;
            case PackageManager.PERMISSION_GRANTED:
                textView.setText("getting location and then deciding if it is day or night...");
                if (!requestingLocationUpdates)
                    startLocationUpdates();
                break;
        }
    }

    private void startLocationUpdates() {
        if (requestingLocationUpdates || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            return;
        requestingLocationUpdates = true;
        fusedLocationClient.requestLocationUpdates(
                new LocationRequest().setPriority(LocationRequest.PRIORITY_LOW_POWER),
                locationCallback,
                null
        );
    }

    @Override
    protected void onPause() {
        super.onPause();
        stopLocationUpdates();
    }

    private void stopLocationUpdates() {
        requestingLocationUpdates = false;
        fusedLocationClient.removeLocationUpdates(locationCallback);
    }

    public static String formatDateUsingDeviceSettings(Context context, Date date) {
        if (date == null)
            return "";
        android.text.format.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context);
        return dateFormat.format(date);
    }

    public static String formatTimeUsingDeviceSettings(Context context, Date date) {
        if (date == null)
            return "";
        android.text.format.DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(context);
        return timeFormat.format(date);
    }
}
Convert Kotlin to Java Code: Detecting Day and Night with Location

原文地址: https://www.cveoy.top/t/topic/fADN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录