Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在调用意图时保持MainActivity运行?_Java_Android_Google Maps_Android Intent_Google Maps Api 3 - Fatal编程技术网

Java 如何在调用意图时保持MainActivity运行?

Java 如何在调用意图时保持MainActivity运行?,java,android,google-maps,android-intent,google-maps-api-3,Java,Android,Google Maps,Android Intent,Google Maps Api 3,我有一个代码,当我调用地图活动时,它会接收纬度和经度并显示在地图上,但当我在地图上时,onLocationChange不会运行,因此它不会显示人只移动第一个心房时的位置,我如何更改它以使其不断发送心房 import android.location.GpsSatellite; import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener;

我有一个代码,当我调用地图活动时,它会接收纬度和经度并显示在地图上,但当我在地图上时,
onLocationChange
不会运行,因此它不会显示人只移动第一个心房时的位置,我如何更改它以使其不断发送心房

import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.content.Intent;
import android.Manifest;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.model.LatLng;


public class MainActivity extends AppCompatActivity implements View.OnClickListener, LocationListener, GpsStatus.Listener {

    private LocationManager locManager; //Gerente de Localização
    private LocationProvider locProvider; //Provedor de Localização
    private static final int REQUEST_LOCATION = 2; //Utilizado nas requisições de localização
    Intent map;
    LatLng Local;

    //Inicializado aqui para não dar crash caso o mapa seja chamado antes desses atributos serem inicializados.
    double latitude = 0;
    double longitude = 0;

    //Pacote onde será armazenado o valor do LatLng.
    Bundle args = new Bundle();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Instância dos buttons:
        Button map = (Button)findViewById(R.id.button_map);
        map.setOnClickListener(this);

        Button gnss = (Button)findViewById(R.id.button_gnss);
        gnss.setOnClickListener(this);

        Button config = (Button)findViewById(R.id.button_config);
        config.setOnClickListener(this);

        Button credits = (Button)findViewById(R.id.button_credits);
        credits.setOnClickListener(this);
        //Fim Instância dos Buttons

        //O Gerente recebe uma location
        locManager = (LocationManager)getSystemService(LOCATION_SERVICE);


    }

    @Override
    public void onClick(View view){
        switch(view.getId()){
            case R.id.button_map:
                Local = new LatLng(latitude, longitude);
                //Pacote inicializado com o LatLng
                args.putParcelable("Latlng", Local);

                //Criar tela relativa ao mapa
                map = new Intent(this, MapsActivity.class);
                //O pacote é passado para a Intent referente ao mapa
                map.putExtra("bundle", args);
                startActivity(map);

                break;

            case R.id.button_gnss:
               /*Intent gnss = new Intent(this, GnssActivity.class);
                startActivity(gnss);
                */
                break;

            case R.id.button_config:
                Intent config = new Intent(this, SettingsActivity.class);
                startActivity(config);

                break;

            case R.id.button_credits:
                Intent credits = new Intent(this, CreditsActivity.class);
                startActivity(credits);
                break;
        }

    }


    @Override
    protected void onResume(){
        super.onResume();
        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION) ==
                PackageManager.PERMISSION_GRANTED) {
            // A permissão foi dada
            ativaGPS();
        }
        else {
            // Solicite a permissão
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    REQUEST_LOCATION);
        }

    }

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


    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_LOCATION) {
            if(grantResults.length == 1 && grantResults[0] ==
                    PackageManager.PERMISSION_GRANTED) {
                // O usuário acabou de dar a permissão
                ativaGPS();
            }
            else {
                // O usuário não deu a permissão solicitada
                Toast.makeText(this, "Sua localização não será mostrada", Toast.LENGTH_SHORT).show();
                        finish();
            }
        }
    }

    //Ativa o GPS
    public void ativaGPS() {
        try {
            locProvider = locManager.getProvider(LocationManager.GPS_PROVIDER);
            locManager.requestLocationUpdates(locProvider.getName(), 30000, 1, this);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

    //Desativa o GPS
    public void desativaGPS() {
        try {
            locManager.removeUpdates(this);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

    public void onGpsStatusChanged(int event) {
        // Alguma mudança no sistema GPS
       // A aplicação deverá chamar o método da classe LocationManager para obter   informações sobre o status do distema GPS.
        TextView coords=(TextView)findViewById(R.id.text_view_coords);
        String satInfo="PRN;Azimute;Elevação;SNR;Used in Fix\n";

        try {
            GpsStatus gpsStatus=locManager.getGpsStatus(null);
        } catch (SecurityException e) {
            e.printStackTrace();
        }

        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION) ==
                PackageManager.PERMISSION_GRANTED) {
                    GpsStatus gpsStatus = locManager.getGpsStatus(null);
                    Iterable<GpsSatellite> sats=gpsStatus.getSatellites();
                     for (GpsSatellite sat:sats) {
                        // processe as informações de cada satélite
                     }
                }
        // Informações do sistema estão encapsuladas no objeto gpsStatus

        // Alguma mudança no sistema GPS

        // Informações do sistema estão encapsuladas no objeto gpsStatus


    }





    //Métodos criados automaticamente na implementação do Location Listener !
    @Override
    public void onLocationChanged(Location location) {
        TextView coords=(TextView)findViewById(R.id.text_view_coords);

        latitude=location.getLatitude();
        longitude=location.getLongitude();

        //Cordenadas em DD
        coords.setText("Latitude"+latitude +"\n"+"Longitude:"+longitude);

        /*coords.setText("Latitude:"+Location.convert(latitude,Location.FORMAT_SECONDS)
                +"\n" +
                "Longitude:"+Location.convert(longitude,Location.FORMAT_SECONDS)); */



        //Passar o Bundle referente ao LatLng criado anteriormente.


    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }
    // FIM dos Métodos criados automaticamente na implementação do Location Listener !

}

是的,您可以同时运行两个活动,甚至更多。您所要做的就是在后台运行它们,您可以使用服务

虽然不是同时进行,但您也可以让活动与服务一起收听,您可以尝试启动结果意图并在中接收结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { /** you receive the result here**/}

由于大多数语音搜索应用程序、条形码扫描器和地图都使用此方法,因此在“活动结果”中接收意图是有效的。您是否想过将“地图活动”作为一个片段来实施,以覆盖您的主要活动,并可按需显示

然后,您可以在MapActivity中实现一个方法,从onLocationChanged()调用该方法,并使所有必要的内容显示片段上的当前位置

看看

在MapActivity中,您可以声明如下内容

public void locationChanged(double latitude, double longtitude){
     this.latitude = latitude;
     this.longtitude = longtitude
     //All necessary code you need to update the location shown on the map
}
在您声明的主要活动中

public class MapFragment extends AppCompatActivity implements View.OnClickListener, LocationListener, GpsStatus.Listener {
      private MapFragment mapFragment; 

      ...
}
在onCreate()方法中,设置片段的视图

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment);
}
完成所有这些操作后,可以在onLocationChanged()方法中调用在MapFragment中声明的方法

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment);
}
@Override
public void onLocationChanged(Location location) {
        TextView coords=(TextView)findViewById(R.id.text_view_coords);

        mapFragment.locationChanged(location.getLatitude(), location.getLongitude();

        //Rest of your code as necessary

}