1

私はマップアクティビティを呼び出すと緯度と経度を受け取ってマップに表示するコードを持っていますが、マップ上にあるときはonLocationChangeは実行されないため、その人物がいる場所は表示されません最初のatributtesだけを動かすと、どうやってそれを変えてatributtesを絶えず送るのですか?インテントが呼び出されたときにMainActivityを実行し続けるには?

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 ! 

} 

------------------------------------- MAPアクティビティ---- ---------------------------

import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 



public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

    private GoogleMap mMap; 

    double latitude; 
    double longitude; 


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

     Bundle bundle = getIntent().getParcelableExtra("bundle"); 

     LatLng objLatLng = bundle.getParcelable("Latlng"); 
     latitude = objLatLng.latitude; 
     longitude= objLatLng.longitude; 


     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 


    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     float zoomLevel = 16.0f; 
     mMap = googleMap; 

     //Posição atual marcada no mapa referentes a marcação e setagem da posição atual na API do Google Maps 
     LatLng posAtual = new LatLng(latitude, longitude); 
     mMap.addMarker(new MarkerOptions().position(posAtual).title("Sua posição atual!")); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(posAtual)); 

     //This goes up to 21 
     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(posAtual, zoomLevel)); 

    } 

} 

答えて

0

あなたは2回のアクティビティを同時に実行できます。 、あなたがしなければならないのは、バックグラウンドでそれらを実行され、あなたはありません同時にalthoug

​​

で CHACKドキュメントからサービスを使用できますが、活動はまた、サービスを聴いてみましょうことができます結果のインテントを開始して結果を受け取ることができます。

ほとんどの音声検索h app、バーコードスキャナ、マップでこのメソッドを使用する

1

MainActivityをカバーし、必要に応じてVisibleにすることができるフラグメントとしてMapActivityを実装することを考えましたか?

次に、onLocationChanged()から呼び出して、フラグメントの現在の位置を示すのに必要なすべての作業を行うMapActivityメソッドを実装できます。

ビューを設定するあなたは、あなたがあなたのonCreate()メソッドでは

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

     ... 
} 

を宣言

MainActivityで
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 
} 

のようなものを宣言することができますMapActivity内部Fragments

を見てみましょうフラグメントの名称

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

     mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment); 
} 

あなたはそれのすべてをやったとき、あなたはあなたのonLocationChanged()メソッドで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 

} 
関連する問題