Android GPS Application

  • Antworten:10
Carroll Diehl
  • Forum-Beiträge: 13

22.08.2014, 23:21:41 via Website

Hallo allerseits,
ich muss sagen, ich habe ein zeitliches Problem:
Ich muss übermorgen mit einer App aufwarten mit der ich nun schon seit Wochen meine Zeit um die Ohren schlage - und ich glaube das, obwohl es unheimlich einfach ist.
Ich brauche unbedingt Hilfe:
Die App soll eine Art Rallye für eine Studienfahrt werden. Sie soll, wenn sie in einen bestimmten GPS-Umkreis kommt vier Fragen auswerfen, die man dann beantworten muss.
Die Umgebung steht schon, die Fragen sollten auch kein Problem sein, aber das GPS-Modul bekomme ich nicht hin. Es funktioniert, dass ich eine GPS-Anzeige bekomme, aber sobald ich versuche irgendwie weiter zu gehen stürzt das ganze ab.

Was ich also bräuchte wäre die GPS-Anzeige, welche wenn sie in einen Bestimmten Umkreis kommt
(longitude <= longitude + x && longitude >= longitude - x && latitude <= latitude +x && latitude >= latitude -x)
in eine andere Activity springt oder Buttons Visible setzt (welche dann aber auch funktionieren müssen, das war mein erstes Problem :] ).

Mit meinen Rudimentären Java-Kentnissen verzweifle ich leider an der Sache und der Versuch das Ganze per MIT App Inventor zu lösen ist daran gescheitert, dass er scheinbar 0.001 zu niedrig zum addieren findet (?). Zumindest deutete die Fehlermeldung das an.

Sonst arbeite ich mit Eclipse oder Android Studio (Android Studio, weil ich zwischenzeitlich auch auf die Möglichkeit eingegangen bin, dass der Fehler bei Eclipse lag, da dieses mir schon häufiger neue Apps mit Errors ausgespuckt hat, IDs nicht richtig umbenannt hat etc. Aber meine Verdächtigungen erwiesen sich leider als unhaltbar).

BugLogs kann ich leider auch nicht mitliefern, da ich das ganze direkt auf meinem Handy teste und so die LogCat nicht darauf zugreifen kann.

LG Carroll

www. mediafire .com/download/z2198fj8rt50ah4/Rallye.rar (Sorry, wegen dem gesplitteten Link, aber da es kein Spam ist erlaube ich mir einmal den Spam-Filter von AndroidPIT zu umgehen :] Ich hoffe ich stoße damit niemanden vor den Kopf.)

PS.: Ich uploade einmal das Projekt und dann eine Klasse, die, zumindest nach meiner Kenntnis, einfacher zu Bedienen ist.
Beide GPS-Klassen stammen nicht von mir, dazu fehlen mir leider die nötigen Fähigkeiten :D

PPS.: Der Text in der Credits.class ist auch nicht von mir verfasst und, zumindest hoffe ich das so, ironisch aufzufassen ;)

Antworten
Steffen S.
  • Forum-Beiträge: 63

23.08.2014, 07:59:21 via App

Gruppe.java -> Linie 45 -> saver = null

Du musst in Saver.java alle Variablen und Methoden auf static machen, dann geht alles.

package com.example.romrallye;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.io.File;
import java.io.FileInputStream;

public class Saver
{
    static String Points = "";
    static String Stage = "";
    static String Group = "";  
    static String line = "";
    static String[] savedText;
    static String pw = "123";


    public static void main(String[] args)
    {
    }

    public static void write()
    {
        String ptext = Points + "#" + Stage + "#" + Group;
        try
        {
            PrintWriter pWriter = new PrintWriter(new FileWriter("saveState.txt", true), true);
            pWriter.println(ptext);
            pWriter.flush();
            pWriter.close();
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }
    }

    public static void reset()
    {
        File file = new File("saveState.txt");
        //if (t.getText.equals(pw)) {
        file.delete();
        //} // end of if

    }

    public static boolean read(String filename)
    {
        try
        {
            FileInputStream fis = new FileInputStream(filename);
            Scanner s = new Scanner(fis);
            while (s.hasNextLine())
            {
                line = s.nextLine();
            }
            fis.close();
        }
        catch (Exception e)
        {
            return true;
        }
        setStrings(line);
        return false;
    }


    public static void setStrings(String str)
    {
        if (!line.isEmpty())
        {
            savedText = line.split("#");
            Points = savedText[0];
            Stage = savedText[1];
            Group = savedText[2];
        }
    }



    public static String getPoints()
    {
        return Points;
    }

    public static void setPoints(String p)
    {
        Points = p;
    }

    public static String getStage()
    {
        return Stage;
    }

    public static void setStage(String s)
    {
        Stage = s;
    }

    public static String getGroup()
    {
        return Group;
    }

    public static void setGroup(String g)
    {
        Group = g;
    } 
}

zumindest dein Aktuelles Problem (Und alles was mit dieser Klasse zu tun hat und auch zum Absturz geführt hätte) . weiter hab ich nicht getestet

— geändert am 23.08.2014, 08:06:55

Carroll Diehl

Antworten
Carroll Diehl
  • Forum-Beiträge: 13

23.08.2014, 13:09:48 via Website

Hallo :)

Danke für die schnelle und gute Antwort, darauf wäre ich nicht gekommen muss ich sagen.

Den nächsten Fehler, beim speichern der Stages als longip, longim, latp und latm (für die Umkreis-Bestimmung) habe ich auch gefunden.
Ein Fehler, der dümmer nicht sein könnte. Ich habe das Array mit [1][1] statt [0][0] aufgerufen, was zu einer NullPointerExeption führen musste.

Außerdem habe ich die beiden Dimensionen verwechselt, was auch dazu führte, dass der Pointer im Nichts landete.

Jetzt muss die App nur noch in den nächsten Screen gehen, wenn die if-Anweisung stimmt. Ich schaue mal, ob ich das auch noch hinbekomme :)

Auf jeden fall schon einmal einen riesen Dank, das hat mich um einiges weitergebracht.

LG Carroll

PS.: Der Link zu meiner aktuellen Version: www. mediafire .com/folder/1xwo90272p87y/

— geändert am 23.08.2014, 13:17:13

Antworten
Carroll Diehl
  • Forum-Beiträge: 13

23.08.2014, 13:25:45 via Website

Damit es denen etwas leichter gemacht wird, die jetzt nicht das ganze Projekt downloaden wollen:

Der Wechsel zwischen den Activities soll in einer if-Abfrage aufgerufen werden und momentan verwende ich den Code:

if (longi<=longip && longi>=longim && lat<=latp && lat>=latm)
{ Intent myIntent = new Intent(Rally.this, Frage.class);
startActivity(myIntent);
}

Die Activity ist im Manifest eingetragen, da kann der Fehler also nicht liegen : ]

LG Carroll

Antworten
Steffen S.
  • Forum-Beiträge: 63

23.08.2014, 16:27:34 via App

Hast wieder einen Fehler?

Carroll Diehl

Antworten
Carroll Diehl
  • Forum-Beiträge: 13

23.08.2014, 17:14:41 via Website

Ja, beim Wechseln in die Frage.class beendet das Programm.

Das ist leicht zu übersehen, da der Fall in der Regel ja erst eintritt, wenn man sich in der Umgebung befindet.
Ich hab mir auch einmal Genymotion installiert und dort ist es ja glücklicherweise recht einfach die GPS-Location zu bearbeiten, also kann ich den Log auch hochladen :)

LG Carroll

image-upload .de/image/l5JoEH/542cf6804f.png

Antworten
Steffen S.
  • Forum-Beiträge: 63

23.08.2014, 19:14:16 via Website

Frage.java:

public class Frage extends Rally
{

    private Stages stages;
    private Saver saver;
    private Rally rally;
    private TextView frage;
    private Button aw1;
    private Button aw2;
    private Button aw3;
    private Button aw4;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.informationen_main);

        frage = (TextView) findViewById(R.id.textView2);
        aw1 = (Button) findViewById(R.id.bt_antw1);
        aw2 = (Button) findViewById(R.id.bt_antw2);
        aw3 = (Button) findViewById(R.id.bt_antw3);
        aw4 = (Button) findViewById(R.id.bt_antw4);


        int actualstage = Integer.parseInt(saver.getStage());
        frage.setText(stages.getFrage(actualstage));
        aw1.setText(stages.getAntwort(actualstage, 1));
        aw2.setText(stages.getAntwort(actualstage, 2));
        aw3.setText(stages.getAntwort(actualstage, 3));
        aw4.setText(stages.getAntwort(actualstage, 4));


        aw1.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view)
                {

                    if (Integer.parseInt(saver.getStage()) == Integer.parseInt(saver.getGroup()) &amp;&amp; Integer.parseInt(saver.getPoints()) != 0)
                    {Intent myIntent = new Intent(view.getContext(), Finish.class);
                        if (stages.check(Integer.parseInt(saver.getStage())) == 1)
                        {saver.setPoints(saver.getPoints() + 20);}
                        rally.levelup();
                        startActivityForResult(myIntent, 0);}
                    Intent intent = new Intent();
                    setResult(RESULT_OK, intent);
                    finish();


                }

            });

...

findViewById kannst du erst nach setContentView machen

Carroll Diehl

Antworten
Steffen S.
  • Forum-Beiträge: 63

23.08.2014, 19:17:03 via App

deswegen bekommst du Einen null pointer exception. weil er es vor setContentView nicht kennt deine View

— geändert am 23.08.2014, 20:29:17

Carroll Diehl

Antworten
Carroll Diehl
  • Forum-Beiträge: 13

23.08.2014, 20:34:16 via Website

Okay :) Erst einmal wieder vielen Herzlichen Dank für die Hilfe. Es tut mir Leid, dass ich deine Zeit so intensiv in Anspruch nehme.

Ich habe es verbessert, die Fehler die mir hier unterlaufen sind echt mehr als peinlich :/

Aber bei mir will er immer noch nicht in den Frage-Screen gehen.

Ich habe zwar noch ein paar Fehler gefunden (wieder mit dem Array) und er baut on Create im Debugger auch gut auf (also er fliegt nicht mehr mit den Stages Aufrufen raus, sondern danach mit einer Nullpointer-Exception wieder).

Zur Erleichterung des Prüfens habe ich einmal einen Button in die Klasse gesetzt, der einfach in die Fragen.class geht.

Es muss aber an der Fragen.class liegen, da auch beim Aufrufen dieser in der MainActivity die App abstürzt.

Die neue Version der App:

www. mediafire .com/download/f61p3cpcchh81sd/RomRallye_x1.8.rar

LG Carroll

PS.:

Wieder die Klasse in der der Fehler auftritt hier:

package com.example.romrallye;

import com.example.romrallye.Rally;
import com.example.romrallye.R;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.content.Intent;
public class Frage extends Rally {

private Rally rally;
private TextView frage;
private Button aw1;
private Button aw2;
private Button aw3;
private Button aw4;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.frage_main);



    frage = (TextView) findViewById(R.id.textView2);
    aw1 = (Button)findViewById(R.id.bt_antw1);
    aw2 = (Button)findViewById(R.id.bt_antw2);
    aw3 = (Button)findViewById(R.id.bt_antw3);
    aw4 = (Button)findViewById(R.id.bt_antw4);

    int actualstage = 0; /*Integer.parseInt(Saver.getStage());*/

    String fragetxt = Stages.getFrage(actualstage);
    String aw1txt = Stages.getAntwort(0, actualstage);
    String aw2txt = Stages.getAntwort(1, actualstage);
    String aw3txt = Stages.getAntwort(2, actualstage);
    String aw4txt = Stages.getAntwort(3, actualstage);
    frage.setText(fragetxt);

    aw1.setText(aw1txt);
    aw2.setText(aw2txt);
    aw3.setText(aw3txt);
    aw4.setText(aw4txt);


    aw1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                if(Integer.parseInt(Saver.getStage())==Integer.parseInt(Saver.getGroup())&amp;&amp;Integer.parseInt(Saver.getPoints())!=0)
                {Intent myIntent = new Intent(view.getContext(), Finish.class);
                if(Stages.check(Integer.parseInt(Saver.getStage()))==1)
                {Saver.setPoints(Saver.getPoints()+20);}
                rally.levelup();
                startActivityForResult(myIntent, 0);}
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();


            }
        });



        aw2.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                if(Integer.parseInt(Saver.getStage())==Integer.parseInt(Saver.getGroup())&amp;&amp;Integer.parseInt(Saver.getPoints())!=0)
                {Intent myIntent = new Intent(view.getContext(), Finish.class);
                if(Stages.check(Integer.parseInt(Saver.getStage()))==2)
                {Saver.setPoints(Saver.getPoints()+20);}
                rally.levelup();
                startActivityForResult(myIntent, 0);}
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();


            }
        });



        aw3.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                if(Integer.parseInt(Saver.getStage())==Integer.parseInt(Saver.getGroup())&amp;&amp;Integer.parseInt(Saver.getPoints())!=0)
                {Intent myIntent = new Intent(view.getContext(), Finish.class);
                if(Stages.check(Integer.parseInt(Saver.getStage()))==3)
                {Saver.setPoints(Saver.getPoints()+20);}
                rally.levelup();
                startActivityForResult(myIntent, 0);}
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();


            }
        });



        aw4.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                if(Integer.parseInt(Saver.getStage())==Integer.parseInt(Saver.getGroup())&amp;&amp;Integer.parseInt(Saver.getPoints())!=0)
                {Intent myIntent = new Intent(view.getContext(), Finish.class);
                if(Stages.check(Integer.parseInt(Saver.getStage()))==4)
                {Saver.setPoints(Saver.getPoints()+20);}
                rally.levelup();
                startActivityForResult(myIntent, 0);}
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();


            }
        });

        Button next = (Button) findViewById(R.id.bt_back);
        next.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent intent = new Intent();
                setResult(RESULT_OK, intent);
                finish();
            }
        });


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

Und hier die Fehlermeldung(en):

image-upload .de/image/K3JmGQ/7aa958ab9b.png

— geändert am 23.08.2014, 20:40:30

Antworten
Steffen S.
  • Forum-Beiträge: 63

23.08.2014, 20:42:54 via App

(Button) R.id.bt_back
also der Button mit dieser ID.

fehlt in deinen Layout "frage_main.xml".
deswegen der exception.

schreib mit grad das nächste mal ne Nachicht, dann machen wir das per mail oder so. geht schneller

und in Saver.java ändere dort bei Points alles in Integer. Dort tritt nämlich der nächste Exception dann auf wegen den Addieren und so.

dann brauchst du auch bei den punkten nicht mehr Integer.parse

und bei Stage tät ich das selbe machen. weil in beiden Fällen sind die werte nur Zahlen.

PS.: wenn du den Integer dann doch als String brauchst wie z.b. wenn es in einem TextView anzeigen lassen willst. brauchst dann grad z.B. "String.valueOf(Saver.getPoints()) machen, dann hast es als String, day wirst ja aber glaub wissen ;-)

— geändert am 23.08.2014, 20:57:15

Carroll Diehl

Antworten
Carroll Diehl
  • Forum-Beiträge: 13

23.08.2014, 21:22:32 via Website

Hallo,

Danke für die Hilfe! Ich bin soweit gekommen, wie ich es mir nicht mehr hätte erträumt, da ich meine Zeit so lange an diesem großem Haufen von dummen und vermeidbaren Fehlern verschwendet habe. Im Nachhinein ist das ziemlich peinlich aber auch Erleichternd, da sie aufgrund ihrer simplen Stupidität ja auch ziemlich schnell zu beheben sind :)

Ich schreib dich dann per PN an, wenn ich wieder irgendwo hänge, aber jetzt schon vielen vielen Dank für die Bemühungen :)

Antworten