Autore Topic: Non far apparire Activity nella mia app...  (Letto 317 volte)

Offline smartgatto

  • Utente junior
  • **
  • Post: 96
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S5
  • Sistema operativo:
    Windows 7
Non far apparire Activity nella mia app...
« il: 06 Giugno 2015, 02:29:41 CEST »
0
Ciao a tutti...ho un problema nello sviluppare la mia applicazione di antifurto... mi spiego:
tramite google cloud message ho sviluppato una app che all'arrivo di un messaggio dal server lo visualizza come toast (fin'ora, poi la visualizzazione verrà eliminata) e fino qua tutto ok.
La mia intenzione era che quando arriva un messaggio determinato ("password") si avvia una class ("rintraccia") che recupera le coordinate gps e le scrive sul server. Qui mi sono arenato. Il programma "rintraccia" funziona bene solo se si apre l'activity, mentre io invece vorrei che non si aprisse niente, ovvero che rimanesse tutto nascosto... come potrei fare?
Grazie mille!

Qui la parte che controlla il messaggio e se arriva la password avvia l'altra activity:

Codice: [Seleziona]
public void controlla(){
    String password = "password";
    if (mes.equals(password)) {
        messaggio = "Password OK";

        Intent intent = new Intent(GcmMessageHandler.this, rintraccia.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

    }
    else {
        messaggio = mes;
    }

e qui la class rintraccia:
Codice: [Seleziona]
public class rintraccia extends FragmentActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;

    @Override

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

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        // Create the LocationRequest object
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(600000)        // 10 seconds, in milliseconds
                .setFastestInterval(0); // 1 second, in milliseconds
    }

    @Override
    protected void onResume() {
        super.onResume();
        mGoogleApiClient.connect();
    }

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

        if (mGoogleApiClient.isConnected()) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            mGoogleApiClient.disconnect();
        }
    }


    private void handleNewLocation(Location location) {

        location.getLatitude();
        location.getLongitude();
        double latix = location.getLatitude();
        double longix = location.getLongitude();
        TextView longitudine = (TextView) findViewById(R.id.longitudine);
        TextView latitudine = (TextView) findViewById(R.id.latitudine);
        longitudine.setText(Double.toString(longix));
        latitudine.setText(Double.toString(latix));


            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            mGoogleApiClient.disconnect();
            try {
                String user = "username";
                String pass = "password";
                String path = "smb://192.168.X.X/latitudine.txt";

                NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, pass);
                SmbFile smbFile = new SmbFile(path, auth);
                SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile);
                smbfos.write(Double.toString(location.getLatitude()).getBytes());
            } catch (IOException ioe) {
                //Handle exception here, most of the time you will just log it.
            }
            try {
                String user = "username";
                String pass = "password";
                String path = "smb://192.168.X.X/longitudine.txt";
                NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, pass);
                SmbFile smbFile = new SmbFile(path, auth);
                SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile);
                smbfos.write(Double.toString(location.getLongitude()).getBytes());
            } catch (IOException ioe) {
                //Handle exception here, most of the time you will just log it.
            }

    }






    @Override
    public void onConnected(Bundle bundle) {
        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (location == null) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
        else {
            handleNewLocation(location);
        }
    }


    @Override
    public void onConnectionSuspended(int i) {

    }



    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        if (connectionResult.hasResolution()) {
            try {
                connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        } else {
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        handleNewLocation(location);
    }
}

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Non far apparire Activity nella mia app...
« Risposta #1 il: 06 Giugno 2015, 08:49:31 CEST »
0
Devi usare un service

Offline smartgatto

  • Utente junior
  • **
  • Post: 96
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S5
  • Sistema operativo:
    Windows 7
Re:Non far apparire Activity nella mia app...
« Risposta #2 il: 07 Giugno 2015, 10:52:49 CEST »
0
Ah ok.. allora mi metto subito a studiare come convertirlo in service! Grazie per la dritta!

Post unito: 07 Giugno 2015, 16:00:26 CEST
Dunque.. mi sono documentato sui service e ho provato a modificare la mia app come segue, però mi da errore che l'api non è connesso...ho provato a sistemare il comando "        mGoogleApiClient.connect();" ma niente da fare...
come posso risolvere?

Codice: [Seleziona]
06-07 15:53:37.081    6710-7691/xxxxxxxxxx.com.gcmsimplex E/AndroidRuntime﹕ FATAL EXCEPTION: IntentService[rintraccia]
    Process: xxxxxxxxxxx.com.gcmsimplex, PID: 6710
    java.lang.IllegalStateException: GoogleApiClient is not connected yet.
            at com.google.android.gms.common.api.zze.zzb(Unknown Source)
            at com.google.android.gms.common.api.zzg.zzb(Unknown Source)
            at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source)
            at xxxxxxxxxxxx.com.gcmsimplex.rintraccia.onHandleIntent(rintraccia.java:91)
            at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.os.HandlerThread.run(HandlerThread.java:61)

Ho modificato quanto segue la class "rintraccia"
Codice: [Seleziona]
public class rintraccia extends IntentService implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {

    public rintraccia()
    {
        super("rintraccia");
    }

//  private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;



    private void handleNewLocation(Location location) {
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        mGoogleApiClient.disconnect();
        Toast toast=Toast.makeText(this,(Double.toString(location.getLatitude())) + " , " + (Double.toString(location.getLongitude())), Toast.LENGTH_LONG);
        toast.show();
    }



    @Override
    public void onConnected(Bundle connectionHint) {
        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

        if (location == null) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
        else {
            handleNewLocation(location);
        }
    }


    @Override
    public void onConnectionSuspended(int i) {

    }



        @Override
        public void onConnectionFailed(ConnectionResult connectionResult) {
            Toast toast=Toast.makeText(this,"Errore nella connessione!",Toast.LENGTH_LONG);
            toast.show();

        }

    @Override
    public void onLocationChanged(Location location) {
        handleNewLocation(location);
    }



    @Override
    protected void onHandleIntent(Intent arg0) {
     
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        // Create the LocationRequest object
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(600000)        // 10 seconds, in milliseconds
                .setFastestInterval(0); // 1 second, in milliseconds
     
        mGoogleApiClient.connect();

        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (location == null) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        } else {
            handleNewLocation(location);
        }
    }

    @Override
    public void onDestroy()
    {
        Toast toast=Toast.makeText(this,"Coordinate tracciate",Toast.LENGTH_LONG);
        toast.show();
    }
}

e nella main activity qui il controllo della password e l'attivazione del service "rintraccia":
Codice: [Seleziona]
public void controlla(){
    String password = "password";
    if (mes.equals(password)) {
        startService();
        stopService();

    }
    else {
        //visualizza altri messaggi;
    }


}
    public void startService()
    {
        startService(new Intent(this,rintraccia.class));
    }

    public void stopService()
    {
        stopService(new Intent(this,rintraccia.class));
    }
« Ultima modifica: 07 Giugno 2015, 16:00:26 CEST da smartgatto, Reason: Merged DoublePost »