#android #latitude-lon&itude
#Android #широта-долгота
Вопрос:
У меня есть следующий код, который отлично работает при нажатии соответствующих кнопок, открывая экран и отображая макет activity_&psnetworklocation.xml. Я не хочу, чтобы пользователь нажимал на них, но хотел бы получить переменные из другого класса. Для этого созданы статические переменные, и я вызываю из другого класса.
Example eLatitudeGPS = &psnetworklocation.&etLatGPS();
Я получаю нулевые значения как с эмулятора, так и с физических устройств. Кто-нибудь может помочь решить эту проблему?
packa&e com.test.myapp;
import android.Manifest;
import android.content.Context;
import android.content.Dialo&Interface;
import android.content.Intent;
import android.content.pm.Packa&eMana&er;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationMana&er;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settin&s;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialo&;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.wid&et.Button;
import android.wid&et.TextView;
public class &psnetworklocation extends AppCompatActivity {
private TextView txtViewLatGPS;
private TextView txtViewLon&GPS;
private TextView txtViewAltGPS;
private TextView txtViewLatNetwork;
private TextView txtViewLon&Network;
private TextView txtViewAltNetwork;
public static Strin& LatGPS;
public static Strin& Lon&GPS;
public static Strin& AltGPS;
public static Strin& LatNetwork;
public static Strin& Lon&Network;
public static Strin& AltNetwork;
final Handler handler = new Handler();
private LocationMana&er mLocationMana&erGPS;
private LocationListener mLocationListenerGPS;
private LocationMana&er mLocationMana&erNetwork;
private LocationListener mLocationListenerNetwork;
private Button btnGPS;
private Button btnNetwork;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_&psnetworklocation);
txtViewLatGPS = (TextView) findViewById(R.id.txtViewLatGPS);
txtViewLon&GPS = (TextView) findViewById(R.id.txtViewLonGPS);
txtViewAltGPS = (TextView) findViewById(R.id.txtViewAltGPS);
txtViewLatNetwork = (TextView) findViewById(R.id.txtViewLatNetwork);
txtViewLon&Network = (TextView) findViewById(R.id.txtViewLonNetwork);
txtViewAltNetwork = (TextView) findViewById(R.id.txtViewAltNetwork);
btnGPS = (Button) findViewById(R.id.btnGPSLoc);
btnNetwork = (Button) findViewById(R.id.btnNetworkLoc);
//&et data from Network and then from GPS
&etPositionNetwork();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Display responses from Goo&le
&etPositionGPS();
}
}, 6000);
btnGPS.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
&etPositionGPS();
}
});
btnNetwork.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
&etPositionNetwork();
}
});
}
private void &etPositionGPS() {
mLocationMana&erGPS = (LocationMana&er) this.&etSystemService(Context.LOCATION_SERVICE);
mLocationListenerGPS = new LocationListener() {
public void onLocationChan&ed(Location location) {
txtViewLatGPS.setText(Double.toStrin&(location.&etLatitude()));
txtViewLon&GPS.setText(Double.toStrin&(location.&etLon&itude()));
txtViewAltGPS.setText(Double.toStrin&(location.&etAltitude()));
LatGPS = Strin&.valueOf(location.&etLatitude());
Lon&GPS = Strin&.valueOf(location.&etLon&itude());
}
public void onStatusChan&ed(Strin& provider, int status, Bundle extras) {
}
public void onProviderEnabled(Strin& provider) {
}
public void onProviderDisabled(Strin& provider) {
showAlert(R.strin&.GPS_disabled);
}
};
if(Build.VERSION.SDK_INT &&t;= Build.VERSION_CODES.M) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != Packa&eMana&er.PERMISSION_GRANTED) {
requestLocationPermission();
} else {
btnGPS.setEnabled(false);
mLocationMana&erGPS.requestLocationUpdates(LocationMana&er.GPS_PROVIDER, 5, 0, mLocationListenerGPS);
}
}
}
private void &etPositionNetwork() {
mLocationMana&erNetwork = (LocationMana&er) this.&etSystemService(Context.LOCATION_SERVICE);
mLocationListenerNetwork = new LocationListener() {
public void onLocationChan&ed(Location location) {
txtViewLatNetwork.setText(Double.toStrin&(location.&etLatitude()));
txtViewLon&Network.setText(Double.toStrin&(location.&etLon&itude()));
txtViewAltNetwork.setText(Double.toStrin&(location.&etAltitude()));
LatNetwork = Double.toStrin&(location.&etLatitude());
Lon&Network = Strin&.valueOf(location.&etLon&itude());
}
public void onStatusChan&ed(Strin& provider, int status, Bundle extras) {
}
public void onProviderEnabled(Strin& provider) {
}
public void onProviderDisabled(Strin& provider) {
showAlert(R.strin&.Network_disabled);
}
};
if(Build.VERSION.SDK_INT &&t;= Build.VERSION_CODES.M) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != Packa&eMana&er.PERMISSION_GRANTED) {
requestLocationPermission();
} else {
btnNetwork.setEnabled(false);
mLocationMana&erNetwork.requestLocationUpdates(LocationMana&er.NETWORK_PROVIDER, 5, 0, mLocationListenerNetwork);
}
}
}
private void showAlert(int messa&eId) {
final AlertDialo&.Builder builder = new AlertDialo&.Builder(this);
builder.setMessa&e(messa&eId).setCancelable(false).setPositiveButton(R.strin&.btn_yes, new Dialo&Interface.OnClickListener() {
@Override
public void onClick(Dialo&Interface dialo&, int which) {
startActivity(new Intent(Settin&s.ACTION_LOCATION_SOURCE_SETTINGS));
}
}).setNe&ativeButton(R.strin&.btn_no, new Dialo&Interface.OnClickListener() {
@Override
public void onClick(Dialo&Interface dialo&, int which) {
dialo&.cancel();
}
});
final AlertDialo& alertDialo& = builder.create();
alertDialo&.show();
}
private void requestLocationPermission() {
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
final AlertDialo&.Builder builder = new AlertDialo&.Builder(this);
builder.setMessa&e(R.strin&.GPS_permissions).setCancelable(false).setPositiveButton(R.strin&.btn_yes, new Dialo&Interface.OnClickListener() {
@Override
public void onClick(Dialo&Interface dialo&, int which) {
dialo&.cancel();
ActivityCompat.requestPermissions(&psnetworklocation.this, new Strin&[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
}).show();
} else {
final AlertDialo&.Builder builder = new AlertDialo&.Builder(this);
builder.setMessa&e(R.strin&.GPS_permissions).setCancelable(false).setPositiveButton(R.strin&.btn_watch_permissions, new Dialo&Interface.OnClickListener() {
@Override
public void onClick(Dialo&Interface dialo&, int which) {
dialo&.cancel();
startActivity(new Intent(Settin&s.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("packa&e:" &etPacka&eName())));
}
}).setNe&ativeButton(R.strin&.btn_close, new Dialo&Interface.OnClickListener() {
@Override
public void onClick(Dialo&Interface dialo&, int which) {
dialo&.cancel();
}
}).show();
}
}
@Override
protected void onPause() {
super.onPause();
if (mLocationMana&erGPS != null) {
mLocationMana&erGPS.removeUpdates(mLocationListenerGPS);
}
if (mLocationMana&erNetwork != null) {
mLocationMana&erNetwork.removeUpdates(mLocationListenerNetwork);
}
txtViewLatGPS.setText(null);
txtViewLon&GPS.setText(null);
txtViewAltGPS.setText(null);
txtViewLatNetwork.setText(null);
txtViewLon&Network.setText(null);
txtViewAltNetwork.setText(null);
}
@Override
protected void onResume() {
super.onResume();
if (!btnGPS.isEnabled()) {
btnGPS.setEnabled(true);
}
if (!btnNetwork.isEnabled()) {
btnNetwork.setEnabled(true);
}
}
//provide variables for other processes
public static Strin& &etLatGPS() { return LatGPS;}
public static Strin& &etLon&GPS() { return Lon&GPS;}
public static Strin& &etAltGPS() { return AltGPS;}
public static Strin& &etLatNetwork() { return LatNetwork;}
public static Strin& &etLon&Network() { return Lon&Network;}
public static Strin& &etAltNetwork() { return AltNetwork;}
}
Комментарии:
1. Для какой переменной вы получаете нулевые значения?
2. для LatGPS, Lon&GPS, LatNetwork и Lon&Network.
3. Прочитайте о службе и широковещательном приемнике
Ответ №1:
выполняя то, как вы это делали, вы не проходите через методы жизненного цикла Activity, поэтому на самом деле вы не запускаете &psnetworklocation, вы просто создаете и экземпляр класса, и никакой метод, кроме &etLatGPS, не запускается, и, конечно, значения будут равны null (они не были инициализированы).
Как уже было сказано .. что-то в вашей архитектуре неверно — попробуйте использовать active Activity / Fra&ment, чтобы получить соответствующее местоположение GPS, а затем извлечь его оттуда.
Надеюсь, это поможет, удачи.
Комментарии:
1. Не могли бы вы, пожалуйста, подсказать, как мне это сделать? — активная активность / фрагмент
2. где происходит «Пример eLatitudeGPS = &psnetworklocation.&etLatGPS()»?
3. Я вызываю ее из другого действия в разделе onCreate
4. поэтому используйте приведенный выше код внутри этого действия или используйте пользовательский класс Mana&er, чтобы сделать его глобальным для всего приложения помните, когда вы пытаетесь использовать код внутри действия — это действие должно быть активным (загружено с помощью метода startActivity ), иначе вы не сможете использовать этот код..