Dann musst du aber auch damit leben, dass die Variablen Werte manchmal rumspinnen die Application Klasse kümmert sich für dich um den gesamten LifeCycle und verhindert damit genau das von die beschriebene Problem.
Beiträge von starsky128
-
-
Die ApplicationData Klasse funktioniert im Prinzip auch nur wie ein Singleton, also so wie whitenexx es auch schon vorgeschlagen hatte.
sorgt dafür, dass sich alle "app", oder wie du es nennen möchtest auf das gleiche, einzige ApplicationData Object beziehen.
Es sind also alle Daten die du da reinschreibst während der Laufzeit aus jeder anderen Activity verfügbar. -
Um auf Daten zuzugreifen, auf die ich aus mehreren Activities zugreifen möchte gehe ich normalerweise folgendermaßen vor:
- Ich erstelle eine Klasse die von "Application" erbt und die alle benötigten Variablen als private deklariert. Um darauf zuzugreifen benutze ich dann die jeweiligen öffentlichen getter und setter Methoden.
- In Activity XY kann ich jetzt über ein Object der Klasse ApplicationData auf alles zugreifen.Code
Alles anzeigenprotected ApplicationData app; ... public void onCreate(Bundle savedInstanceState) { ... app = (ApplicationData) getApplication(); int number = app.getNumber(); app.setNumber(55); ... }
Halte ich für sauberer als die Nutzung von static variablen und die Gefahr sich zu verhaspeln ist wesentlich geringer. -
Ein eigenes Backend in Verbindung mit einem User-Account fände ich am schönsten, allerdings lohnt sich das finanziell kaum, da ich Traffic und Webspace irgendwie finanzieren muss und mit den mickrigen Werbeeinnahmen ist das unmöglich. Würde ich die reinen Tripdaten austauschen, wäre das kein Problem... aber ohne Bilder machts keinen Spaß
Also bleiben noch:
- Google Drive/Dropbox Anbindung - Die Tripdaten werden dann einfach komprimiert mit Bildern auf den eigenen Cloudspeicher geladen und können von dort wieder importiert werde
- Android Beam/NFC Sharing zwischen mehreren Devices oder auch Bluetooth (wobei NFC in der Praxis schneller ist)
- Deine vorgeschlagene WLAN Methode finde ich auch gut, hab dazu gerade aber nur das hier entdeckt http://developer.android.com/g…connectivity/wifip2p.html
also ohne AccessPoint, sonder via AdHoc Netzwerk. Hast du sowas schonmal implementiert mit Datenaustausch über das gemeinsame WLAN? Stelle ich mir komfortabler vor, als eine p2p Verbindung aufbauen zu müssen.Werd mir mir mal ansehen müssen wie viel Aufwand das jeweils ist und dann entscheiden wie ich es mache.
-
So, ich hab endlich wieder etwas Zeit gefunden und ein paar Deiner Vorschläge umgesetzt :
- Als erstes würde es mir gefallen wenn du eine Info einbaust das GPS aktiviert sein muss für die Standortbestimmung.
- Orte sollten auch durch manuelle Eingabe bestimmt werden können.
- wenn man in der Reiseübersicht die trips sieht, sollte man durch einen longclick auch den namen eines trips ändern können.Da ich auch schon Anfragen zur manuellen Eingabe per E-Mail bekommen habe, habe ich mich dazu entschieden, das Update jetzt schon zu releasen.
Als nächstes wären dann CSV Export und mehrere Notizen dran, langfristig will ich auch noch einen Austausch von Daten zwischen mehreren Geräten (z.B. unterwegs mit dem Smartphone loggen, zu Hause dann auf dem Tablet alles ansehen) und eine Art Präsentations-Modus implementieren.
Hoffe es gefällt
-
Werd mal schauen, womit man vernünftig arbeiten kann.
Ich hab mich ehrlich gesagt an gar keiner anderen App orientiert und kann auf die Schnelle auf keine App namens Travel Stream finden.
Hast du einen Link?Logisch aber, dass es einige Apps gibt, die auf der gleichen Grundidee basieren, bzw. das gleiche tun. Da die meisten nicht 100%ig meinen persönlichen Ansprüchen genügt haben und ich eh ein wenig privat entwickeln wollte, hab ich mir selbst eine gebaut.
-
Super Feedback, danke nochmal!
- Die Standortbestimmung funktioniert neben GPS auch per WLAN oder dem Funknetz, aber du hast Recht. GPS ist wesentlich genauer und wird bessere Ergebnisse liefern, werde in der nächsten Version einen Hinweis einbauen.
- Die übrigen Punkte finde ich auch sehr gut, werde mir was einfallen lassen.Bzgl. Exportfunktion bin ich schon länger am grübeln. Am einfachsten wäre es, die Reisedaten als JSON oder CSV auszugeben, allerdings kann der Durchschnitts-User damit wohl nicht viel anfangen. Wichtig wäre mir vor allem eine Funktion, um auf Reisen gesammelte Daten auf ein anderes Gerät zu übertragen, damit ich mir z.B. daheim auf dem Tablet alles in Groß anschauen kann.
Vielleicht wäre ein einfaches webbasiertes Backend die Lösung (allerdings optional für den Nutzer, finde nichts schlimmer als in Apps zur Registrierung gezwungen zu werden..) -
Danke, freut mich
Für Fragen und Anregungen bin ich gerne zu haben -
Hallo Zusammen
Ich möchte euch meine App vorstellen: Triploggr ist ein Reisetagebuch bzw. -logbuch, mit dessen Hilfe man Reisen mit Orten, Bildern und Notizen festhalten kann.
Da ein Bild bekanntlich mehr als tausend Worte sagt, hier der Link
https://play.google.com/store/….schuttundunrat.triploggrEntwickelt habe ich die App vor allem aus persönlichem Interesse, da ich sehr gerne reise und mir bislang vor allem handschriftliche Notizen über die besuchten Orte gemacht habe. Auf meiner letzten großen Reise im März war die App dann soweit, dass ich sie in Aktion testen und letzte Fehler beseitigen konnte.
Ich hoffe sie gefällt euch und ich freue mich natürlich auch über Feedback und konstruktive Kritik.
-
Hallo Leute,
Ich habe bereits mit Hilfe der AndEngine ein Geschicklichkeitsspiel programmiert, bei dem man Spielsteine auswählen, und in einem Gitternetz frei platzieren kann. Allerdings bin ich mit der Engine und dem Ergebnis absolut nicht zufrieden und würde das ganze viel lieber nochmal mit nativen Android Layoutelementen programmieren.
Sprich: Scrollviews, in denen ich die verschiedenen Steine (modifizierte Imageviews) zu Beginn platziere, aus denen ich diese dann per Drag&Drop herausziehen und platzieren kann. Landen die Steine im Spielfeld, so sollen sie in dieses einrasten.
Gibt es irgendeine Möglichkeit, Objekte absolut zu positionieren? Oder anders gefragt, gibt es eine Möglichkeit Spiele mit bewegten Objekten zu entwickeln, ohne komplett auf Customviews zeichnen zu müssen und damit auf Touchevents verzichten zu müssen? Außerdem würde ich gerne besagte Scrollviews nutzen können..
Freue mich über jede Anregung
Danke!
-
Hab ich mir angeschaut und auch versucht umzusetzen, hat alles nicht geholfen Irgendwo stimmt was nicht, wenn ich bloß wüsste was..
edit:
Externer Inhalt www.youtube.comInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.habe im manifest die Option android:largeHeap="true" hinzugefügt, seither keine Abstürze mehr Das löst das eigentliche Problem zwar noch nicht, jedoch zumindest mal die Symptome und es macht meine App nutzbar ohne dauer Abstürze ertragen zu müssen. Werde mir jetzt mal den Rest anschauen, in der Hoffnung das Problem beim Kragen zu packen
-
b ist global, richtig.
das nullsetzen war auch eher ein verzweifelter versuch dem problem zu begegnen, ist mittlerweile auch wieder entfernt
-
titus: Deine Vermutung bewahrheitet sich leider
Stefan: nichts dergleichen..
Ich habe gerade festgestellt, dass ich nichtmal in den anderen Activities gewesen sein muss, damit der Fehler auftritt.
Es reicht wenn ich ein Bild wähle, danach ein neues Bild wähle und dann wieder.. spätestens beim drittel mal gibts einen OutOfMemoryError.
Dabei wird das Bild jedes mal in die gleiche Bitmap geladen, also überschrieben.Ich zeig mal hier einpaar Code Beispiele, vielleicht ist meine Vorgehensweise auch einfach schlecht?
Der User kann über verschiedene Buttons entweder über Galerie oder Kamera ein Bild wählen.
In der onActivityResult für die Kamera siehts so aus:Javab = generateBitmap(IMG_TEMP_PATH,SCREEN_HEIGHT,SCREEN_WIDTH); // b=Bitmap // generateBitmap nimmt das von der Kamera geschossene Bild (liegt im Standardpfad IMG_TEMP_PATH) und skaliert es auf Bildschirmgröße new SaveImageTask().execute(); // dazu gleich mehr
Für die Gallerie sieht es so aus:
Java
Alles anzeigenif (data != null) { imageUri = data.getData(); // Uri des ausgewählten Bilds try { String path = getRealPathFromURI(imageUri); // erzeugt String aus der Uri b = generateBitmap(path,SCREEN_HEIGHT,SCREEN_WIDTH); // siehe oben new SaveImageTask().execute(); } catch ... }
Java
Alles anzeigenprivate class SaveImageTask extends AsyncTask<Void, Void, Void> { private ProgressDialog dialog = new ProgressDialog(OptionsActivity.this); protected void onPreExecute() { dialog.setMessage("Bild wird skaliert und gespeichert..."); dialog.show(); } } @Override protected Void doInBackground(Void... params) { FileOutputStream out; try { out = new FileOutputStream( "IMG_TEMP_PATH"); b.compress(Bitmap.CompressFormat.PNG, 90, out); // bereits skalierte bitmap wird gespeichert b.recycle(); // speicher wieder freigeben (theoretisch...) } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); } return null; } protected void onPostExecute(Void result) { dialog.dismiss(); File imgFile = new File(IMG_TEMP_PATH); if (imgFile.exists()) { Bitmap myBitmap = BitmapFactory.decodeFile(imgFile // das frisch gespeicherte bild wird dem imageView bildvorschau zugewiesen .getAbsolutePath()); bildvorschau.setImageBitmap(myBitmap); bildvorschau.setScaleType(ScaleType.CENTER_CROP); myBitmap=null; // wenn ich hier recycle gibts einen fehler imgFile = null; } } }
Ich hoffe man kann folgen
-
Hallo Leute,
ich hänge schon länger an einem Problem, das mir mittlerweile Kopfschmerzen bereitet.
In meiner App ist es in einer Activity möglich ein Bild entweder aus der Gallerie auszuwählen oder per Kamera ein neues aufzunehmen. Das Foto wird auf Bildschirmgröße skaliert und in einem festen Ordner gespeichert. Zusätzlich wird es noch in einem kleinen Vorschau-ImageView angezeigt. Der Nutzer kann noch diverse Einstellungen tätigen und dann per Klick auf "fertig" zur nächsten Activity wechseln, in der das Bild geladen wird und als Hintergrundbild der gesamten Activity angezeigt wird. Daneben gibt es noch eine weitere Activity, die das gewählt Bild ebenfalls als Hintergrund anzeigt.Am Anfang hatte ich noch alle paar klicks einen OutOfMemory Error, da Bilder jeder Größe geladen wurden und nicht skaliert wurden, das habe ich mittlerweile behoben.
Trotzdem bekomme ich, nachdem ich in allen Activities unterwegs war und in der ersten wieder ein neues Hintergrundbild wählen möchte, immer wieder einen OutOfMemoryError.
Jetzt meine Frage: Kann es sein, dass die Activities die Bilder jeweils in den Speicher laden aber beim Verlassen nicht mehr freigeben? Das wäre meine einzige Erklärung, da es beim ersten Versuch immer klappt. Erst wenn ich die App eine Weile nutze, kommt der Fehler.
Mein Ansatz war, das Bitmap nach dem Zuweisen zum imageView auf null zu setzen, um dem Garbage Collector zu signalisieren, dass er aufräumen darf, das scheint aber nichts zu bringen.
Ich habe die Exceptions abgefangen, damit die App nicht abstürzt. Wenn ich jetzt minimiere und den Cache der Anwendung leere, geht alles wieder.
Gibt es eine Möglichkeit den Cache der App während der Laufzeit zu leeren?Ich hoffe, das Problem ausreichend erklärt zu haben
Vielleicht kann ja jemand helfen, würde mich sehr freuen! -
-
Hallo Leute, ich bin gerade halb am verzweifeln und hoffe jemand kann mir helfen
Ich möchte über eine URL, an die ich GPS Koordinaten übergebe, ein XML bekommen und dieses Parsen.
Das ganze läuft als Konsolenanwendung einwandfrei, hier mal der Code:
Java
Alles anzeigenprivate double lat; private double lng; . . . try{ DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); DocumentBuilder builder= factory.newDocumentBuilder(); URL url = new URL("http://api.geonames.org/findNearbyWikipedia?lat="+lat+"&lng="+lng+"&username=mein_username"); InputStream stream = url.openStream(); Document xmlDocument = builder.parse(stream); NodeList titleNodes= xmlDocument.getElementsByTagName("title"); NodeList articleURLNodes= xmlDocument.getElementsByTagName("wikipediaUrl"); for(int i=0; i<titleNodes.getLength(); i++){ System.out.println("Artikel "+ (i+1)+": "+ titleNodes.item(i).getTextContent() + " " + articleURLNodes.item(i).getTextContent()); } }catch(Exception ex){ System.out.println(ex.getMessage()); } }
Um das allerdings in Android umzusetzen muss ich AsyncTasks verwenden um keine NetworkOnMainThread Exception zu bekommen.
Leider werde ich aus der Doku nicht so schlauHier ist mal mein Ansatz, bei dem leider aber garnichts passiert:
Java
Alles anzeigenprivate class DownloadXMLTask extends AsyncTask<String, Void, Void> { String wikiUrl; URL url; InputStream stream; DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); DocumentBuilder builder; protected Void doInBackground(String... urls) { try { wikiUrl=urls[0]; url = new URL(wikiUrl); InputStream stream = url.openStream(); builder = factory.newDocumentBuilder(); Document xmlDocument = builder.parse(stream); NodeList titleNodes= xmlDocument.getElementsByTagName("title"); NodeList articleURLNodes= xmlDocument.getElementsByTagName("wikipediaUrl"); }catch(Exception ex){ System.out.println(ex.getMessage()); } return null; } }
Kann ich irgendwie die NodeLists zurückgeben und aus meiner Activity Klasse darauf zugreifen?
Würde mich sehr freuen wenn jemand helfen kann
Danke & Viele Grüße!
-
Habe eine Lösung gefunden
-
Hallo,
Ich habe folgendes vor:
Der Benutzer soll die Wahl haben, ein Hintergrundbild für eine Activity selber zu machen oder ein vorhandenes auszuwählen.Das gewählte Bild soll im ordner "DCIM/MeineApp/temp" landen und den titel "IMG_temp" erhalten.
Bei dem selbstgemachten Bild ist das auch kein Problem und funktioniert soweit einwandfrei.Allerdings soll, im Falle dass der User ein vorhandenes Bild auswählt, eine Kopie davon in eben diesem Ordner unter diesem Namen erstellt werden.
Gibt es eine Möglichkeit den Inhalt des Bildvorschau ImageViews zu speichern? Oder anhand der Uri von gewähltem Bild eine Kopie zu erstellen?Danke & Viele Grüße
Methode zum Bild auswählen:
Javapublic void oeffnen(View view){ Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); }
Auszug aus der onActivityResult Methode.
-
Also, wie sich rausgestellt hat, ist mCamera = null.
Der Fehler scheint (wieder in meiner Hauptactivity) hier zu liegen:
JavamPreview = new CameraPreview(this, mCamera); FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); preview.addView(mPreview); mPreviewFront = new CameraPreview(this, mCameraFront); //<------------------------- hier glaube ich FrameLayout previewFront = (FrameLayout) findViewById(R.id.camera_preview_front); previewFront.addView(mPreviewFront);
Wenn ich 2 Kamera Objekte anlege und öffne, dann gibt es noch keine Fehler.
Erst wenn ich dem Preview Fenster die Kamera zuweise, wie oben gezeigt, wird sie null..
Danke aber schonmal für die Tipps zur Fehlersuche -
Ich poste hier einfach mal die Klasse (mehr oder weniger 1:1 aus der Android Camera API Doku entnommen).
Der Fehler taucht in der surfaceCreated Methode auf, Zeile 32 ist hier 21: mCamera.setPreviewDisplay(holder);CameraPreview Klasse
Java
Alles anzeigenpublic class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private static final String TAG = "camera test"; private SurfaceHolder mHolder; private Camera mCamera; public CameraPreview(Context context, Camera camera) { super(context); mCamera = camera; // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); // deprecated setting, but required on Android versions prior to 3.0 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, now tell the camera where to draw the preview. try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { Log.d(TAG, "Error setting camera preview: " + e.getMessage()); } } public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); mCamera = null; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // If your preview can change or rotate, take care of those events here. // Make sure to stop the preview before resizing or reformatting it. if (mHolder.getSurface() == null){ // preview surface does not exist return; } // stop preview before making changes try { mCamera.stopPreview(); } catch (Exception e){ // ignore: tried to stop a non-existent preview } // set preview size and make any resize, rotate or // reformatting changes here // start preview with new settings try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e){ Log.d(TAG, "Error starting camera preview: " + e.getMessage()); } } }
Mit einer Kamera geht alles wunderbar, bloß wenn ich versuche eine zweite zu starten bekomme ich Probleme
Danke und Grüße