【发布时间】:2021-02-12 17:50:54
【问题描述】:
我尝试制作一个祈祷时间表应用程序,但是当系统想要获取纬度和经度值时遇到问题,在初始程序中我已在主要活动中放置了启用 GPS 的清单权限
@Override
public void onClick(View view) {
if (ActivityCompat.checkSelfPermission(UtamaActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(UtamaActivity.this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},44);
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},44);
} else {
Intent jadwalSholat = new Intent(MainActivity.this, TimePrayActivity.class);
startActivity(jadwalSholat);
}
}
});
我已经在manifest中添加了ACCESS_FINE和ACCESS_COARSE权限,但是在进行活动时间祈祷时,GPS不会自动启动,用户必须手动启动GPS ,即使开启了 GPS 和 Internet 连接,程序仍然无法获取纬度和经度值。
时间祈祷活动:
public class JadwalSholatActivity extends AppCompatActivity {
...
FusedLocationProviderClient providerClient;
private double latitude, longitude;
private static final int ACCESS_LOCATION = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jadwal_sholat);
...
providerClient = LocationServices.getFusedLocationProviderClient(this);
progressBar = findViewById(R.id.barbar);
checkState();
}
private void checkState(){
final LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ConnectivityManager manager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null){
if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI || networkInfo.getType() == ConnectivityManager.TYPE_MOBILE){
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
Toast.makeText(this, "Enable your GPS!", Toast.LENGTH_SHORT).show();
} else {
getLocation();
}
}
} else {
Toast.makeText(this, "No Internet Connection!", Toast.LENGTH_SHORT).show();
}
}
private void getLocation(){
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
return;
}
progressBar.setVisibility(View.VISIBLE);
providerClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
Location location = task.getResult();
if (location != null){
Geocoder geocoder = new Geocoder(JadwalSholatActivity.this,Locale.getDefault());
try {
List<Address> addresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);
latitude = (double) addresses.get(0).getLatitude();
longitude = (double) addresses.get(0).getLongitude();
jadwalSholat();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
private void jadwalSholat(){
progressBar.setVisibility(View.GONE);
DateComponents dateComponents = DateComponents.from(new Date());
**Coordinates coordinates = new Coordinates(latitude,longitude);**
CalculationParameters parameters = CalculationMethod.MUSLIM_WORLD_LEAGUE.getParameters();
SimpleDateFormat formats = new SimpleDateFormat("HH:mm");
formats.setTimeZone(TimeZone.getDefault());
PrayerTimes prayerTimes = new PrayerTimes(coordinates,dateComponents,parameters);
...
}
}
所以,我遇到的问题很可能是程序没有得到经纬度值,如果还有其他问题,请在 cmets 中告诉他们
【问题讨论】:
-
addOnCompleteListener叫什么?如果是这样,您是否检查任务是否成功?task.isSuccessful()?您想接收位置更新还是只接收 LastLocation? -
我想要的是用户的最后一个位置,那么我会尝试添加成功的任务条件。非常感谢