Kann ich noch nicht sagen, ich halte gerade Rücksprache mit meinem Prof wieviel SWS dafür nach Plan vorgesehen sind. Natürlich haben wir noch andere Vorlesungen und Projekte und können nicht unsere gesamte Zeit für das Studienprojekt investieren. Ob Game oder was anderes ist uns prinzipiell völlig egal, solange es gut umzusetzen und interessant ist. Mir ging es ja prinzipiell um ein paar kreative Vorschläge was man evtl. machen könnte
Beiträge von dyingangel666
-
-
Hi Leute,
wir haben dieses Semester im Studiengang Medieninformatik ein kleines Softwareprojekt im Team als Projektarbeit. Es wurden einige Projekte von Profs vorgeschlagen, jedoch sind die Projekte die unserem Team zusagen schon vergeben. Laut Prof können wir aber auch selber Ideen vorschlagen, nur hörts da leider mit der Kreativität auf, da wir die Komplexität schwer einschätzen können. Im letzten Semester konnten wir unsere ersten Erfahrungen in Android sammeln, was uns auch allen recht leicht viel, dank guter Vorkenntnisse in Java. Da kamen dann von einem Team z.B eine kleine Zeichenapp zustande, in der man auf einem Canvas zeichnen konnte, via Colorpicker die Brushfarbe wählen konnte, oder in einem anderen Dialog die Brushgröße und Transparenz einstellen konnte, Stempel zeichnen konnte, oder via Multitouch Formen, wie Rechtecke und Kreise setzen konnte. Das andere Team hatte ein kleines Klickgame gemacht, wo verschiedene Objekte über das Display flogen die man mit dem Finger antippen konnte und dann explodierten und man Punkte bekam.
Soviel also zu unseren Erfahrungen in Android. Unser Team besteht aus 4 Leuten und wir suchen eine Idee für eine App die in einem Semester mit 4 Leuten gut zu lösen ist. Habt ihr vielleicht Tips oder Ratschläge was man da machen könnte?
Gruß Alex
-
Problem gelöst! Habe es jetzt über eine LinkedList vom Typ Object gelöst und packe dort alle gezeichneten Objekte rein. Jedes Objekt hat eine eigene Id. Beim zeichnen eines Objekts bekommt jedes Objekt eine Id, die der objectIdList angefügt wird (hinten). Beim zeichnen des Canvas wird einfach die Liste durchlaufen und jedes Objekt ausgegeben und mit der Reihenfolge der objectIdList verglichen. Die wird eigentlich nur benötigt weil man bei mir im Vordergrund und im Hintergrund zeichnen kann. Wenn man im Vordergrund zeichnet wird das Objekt am Ende der objectList angefügt und für den Hintergrund am Anfang der Liste. Um jetzt aber noch die Reihenfolge zu merken in der die Objekte eigentlich gezeichnet wurden hab ich die objectIdList eingeführt, janz einfach
Javaprivate LinkedList<Object> objectList = new LinkedList<Object>(); private LinkedList<Integer> objectIdList = new LinkedList<Integer>();
Kann geschlossen werden!
-
Hi,
das eine Problem mit dem Drawingcache gelöst, steh ich auch schon vor dem nächsten Ich zeichne in meiner App auf einen Canvas. Man kann normal Zeichnen mit verschiedenen Brushes, man kann aber auch Kreis- und Rechtecke via Multitouch auf den Canvas legen. Das funzt auch prima. Jetzt hab ich allerdings ein Problem mit der Reihenfolge wie der Canvas gezeichnet wird. Wenn man ein neues Kreis- oder Rechteckobjekt gezeichnet hat und dann normal mit den Brushes weiterzeichnen will sollen diese natürlich über den alten Objekten im Canvas gezeichnet werden und nicht dahinter...
Ich dachte ich bin schlau und führe für jedes Objekt (FreeHand, Circle o. Square) eine layerId und speichere dieser nacheinander in einer Liste, um die Reihenfolge der gezeichneten Objekte zu speichern. Diese wollte ich dann beim zeichnen des Canvas prüfen, so dass er weiss welches Objekt wohin gehört... nur leider krieg ichs nicht hin Habt ihr ne Idee wie ich das entweder mit den layerId's hinbekomme oder vielleicht auch ganz anders... eleganter?
die Objektklassen:
Java
Alles anzeigen//Innere Klasse Circle, wird gebraucht um eine Liste mit Kreisobjekten anzulegen, um diese im Canvas zu speichern public class Circle { int id; float x; float y; float r; Paint p; public Circle(int id, float x, float y, float r, Paint p) { this.id = id; this.x = x; this.y = y; this.r = r; this.p = p; } public int getId() { return this.id; } } //Innere Klasse Square, wird gebraucht um eine Liste mit Rechteckobjekten anzulegen, um diese im Canvas zu speichern public class Square { int id; int x1; int y1; int x2; int y2; Paint p; public Square(int id, int x1, int y1, int x2, int y2, Paint p) { this.id = id; this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.p = p; } public int getId() { return this.id; } } //Innere Klasse FreeHand, wird gebraucht um eine Liste mit Freehandobjekten anzulegen, um diese im Canvas zu speichern public class FreeHand { int id; Path path; Paint paint; public FreeHand(int id, Path path, Paint paint) { this.id = id; this.path = path; this.paint = paint; } public int getId() { return this.id; } public Path getPath() { return this.path; } public Paint getPaint() { return this.paint; } }
onDraw():
Java
Alles anzeigenpublic void onDraw(Canvas canvas) { //Lädt das Bild aus dem Galleryintent (Menu->Load) als BG in den Canvas if(imageLoaded) { loadedImage.setBounds(canvas.getClipBounds()); loadedImage.draw(canvas); } //Prüft ob im Hintergrund gezeichnet wird oder nicht if(drawMode) { for (int i=0; i < freehandList.size(); i++) { canvas.drawPath(freehandList.get(i).getPath(), freehandList.get(i).getPaint()); } canvas.drawPath(path, paint); } else { canvas.drawPath(path, paint); for (int i=0; i < freehandList.size(); i++) { canvas.drawPath(freehandList.get(i).getPath(), freehandList.get(i).getPaint()); } } //Zeichnet alle Kreise die gemacht wurden ins Canvas for (int i=0; i < circleList.size(); i++) { setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.FILL); canvas.drawCircle(circleList.get(i).x, circleList.get(i).y, circleList.get(i).r, circleList.get(i).p); } //Zeichnet alle Rechtecke die gemacht wurden ins Canvas for (int i=0; i < squareList.size(); i++) { setBrushStyle(Paint.Join.BEVEL, Paint.Cap.SQUARE, Paint.Style.FILL); canvas.drawRect(squareList.get(i).x1, squareList.get(i).y1, squareList.get(i).x2, squareList.get(i).y2, squareList.get(i).p); } //Falls Kreis gezeichnet wird, sieht man den Kreis während des zeichnens auch if(drawCircle) { float x1 = (x[0] + x[1]) / 2.0f; float y1 = (y[0] + y[1]) / 2.0f; float r = (float) Math.sqrt(Math.pow(x[1] - x[0], 2.0f) + Math.pow(y[1] - y[0], 2.0f) / 2.0f); int lbs = getBrushSize(); int lbc = getBrushColor(); setBrushSize(1); setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.FILL); Paint newPaint = new Paint(); newPaint.set(paint); Circle actualCircle = new Circle(layerId, x1, y1, r, newPaint); canvas.drawCircle(x1, y1, r, newPaint); //Ist quasi das was man während des Kreissetzens sieht, wenn man die Finger noch drauf hat if(isTouch[0] == false && isTouch[1] == false) { //Wenn Finger Weg sind wird der letzte Zustand des Kreises als Kreisobjekt gespeichert circleList.addLast(actualCircle); drawCircle = false; undoId.addLast(2); } setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE); setBrushSize(lbs); setBrushColor(lbc); } //Falls Rechteck gezeichnet wird, sieht man das Rechteck während des zeichnens auch if(drawSquare) { int lbs = getBrushSize(); int lbc = getBrushColor(); setBrushSize(1); setBrushStyle(Paint.Join.BEVEL, Paint.Cap.SQUARE, Paint.Style.FILL); Paint newPaint = new Paint(); newPaint.set(paint); Square actualSquare = new Square(layerId, (int)x[0], (int)y[0], (int)x[1], (int)y[1], newPaint); canvas.drawRect(x[0], y[0], x[1], y[1], newPaint); //Ist quasi das was man während des Rechtecksetzens sieht, wenn man die Finger noch drauf hat if(isTouch[0] == false && isTouch[1] == false) { //Wenn Finger Weg sind wird der letzte Zustand des Rechtecks als Objekt gespeichert squareList.addLast(actualSquare); drawSquare = false; undoId.addLast(3); layerIdList.addLast(layerId); layerId++; } setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE); setBrushSize(lbs); setBrushColor(lbc); } //Setzt nach dem Zeichnen von Kreisen oder Rechtecken wieder den richtigen Pinsel zum zeichnen if(brushForm) setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE); else setBrushStyle(Paint.Join.BEVEL, Paint.Cap.SQUARE, Paint.Style.STROKE); canvas.drawPath(cursorPath, cursorPaint); //Cursor vom Brush }
-
Ok, ich hab die Lösung gefunden... mal wieder sau dämlich... aber naja
Nachdem der Outputstream im Tryblock geschlossen wird einfach noch die Zeile "drawView.destroyDrawingCache();" rein. Dann stellt man sicher dass er auch vor jedem Speicher den aktuellen Drawingcache nutzt
Trotzdem danke für die Hilfe. Kann geschlossen werden!
-
Seltsam, genau den Gedanken hatte ich auch, allerdings hab ichs in der DrawView Klasse direkt probiert. Bei mir brachte es nur einen weissen Bildschirm.
Mit deiner Variante, passiert nichts. Speichert zwar das Bild beim ersten mal korrekt. Aber beim erneuten speichern, ist wieder dasselbe Bild wie vorher auch, ohne neue Änderungen
-
Glaube nicht dass es daran liegt, da es eher unwahrscheinlich ist, da das Zeitformat mit Sekunden ja im Dateinamen ist und es sowieso nicht doppelt vorkommen kann. Die Prüfung ist noch von vorher drin, da hatte ich den Dateinamen mit einem Generator generiert, bei dem hätte das noch vorkommen können. Er speichert ja auch immer mehrere Bilder ab, nur sehen die halt alle aus wie das erste das gespeichert wurde
Drawingcache ist natürlich in der View aktiviert, allerdings mach ich das im Konstruktor.
Java
Alles anzeigenpublic DrawView(Context context) { super(context); //loadedImage = context.getResources().getDrawable(R.drawable.color); loadedImage = null; setDrawingCacheEnabled(true); //Aktiviert das Caching, wird zum Speichern benötigt um die aktuelle Zeichenfläche zurückzugeben setFocusable(true); setFocusableInTouchMode(true); this.setOnTouchListener(this); this.setBackgroundColor(0xffffffff); //Wird der BG nicht geändert, würde er beim Speichern schwarz sein, so isser Standardmäßig weiss paint.setAntiAlias(true); //Macht schönere Ränder beim Brush, machts allerdings etwas langsamer cursorPaint.setAntiAlias(true); paint.setDither(true); //Höhere Farbechtheit, machts allerdings auch bissel langsamer //Lade Standardbrush setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE); setBrushSize(2); setBrushColor(0xff000000); }
-
Hi Leute,
hab en Problem beim Speichern eines Bildes. Ich zeichne in der View auf einem Canvas. Beim speichern wird der Drawingcache zurückgegeben. Wenn ich also was in den Canvas gemalt habe und speichere funzt alles einwandfrei beim Speichern. Wenn ich nach dem speichern aber noch was im Canvas dazumale und nochmal speichern will gibt er mir nur das Bild von vorher aus, ohne die letzten Änderungen... woran kann das liegen? -> siehe Zeile 10-11
Java
Alles anzeigenpublic void saveAsBitmap() { isFileAlreadySaved = true; //Holt aktuelles Datum und schreibt es in einen String der weiter unten an Dateinamen drankommt Calendar currentDate = Calendar.getInstance(); SimpleDateFormat formatter= new SimpleDateFormat("yyyyMMMddHmmss"); String dateNow = formatter.format(currentDate.getTime()); //Holt aktuellen DrawingCache (alles was bis jetzt gemalt wurde) und speichert ihn ins Bitmap Bitmap bitmap = drawView.getDrawingCache(); //Fragt den Systempfad ab und erstellt den Appordner String root = Environment.getExternalStorageDirectory().toString(); File myDir = null; //Prüft ob das Bild normal gespeichert wurde oder ob es geteilt werden soll if(isFileToShare) { myDir = new File(root + "/PhotoshApp/Share"); } else { myDir = new File(root + "/PhotoshApp"); } myDir.mkdirs(); String fname = "photoshapp_"+ dateNow + ".jpg"; actualFileName = root + "/PhotoshApp/Share/" + fname; //Speichert aktuellen Pfad inkl. Dateinamen als String (fürs Teilen benötigt) File file = new File (myDir, fname); if (file.exists ()) file.delete (); try { FileOutputStream out = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); //Bild wird als JPEG mit Qualität 90 gespeichert //Feedback um User zu informieren was passiert Toast.makeText(getApplicationContext(), "Image saved!",Toast.LENGTH_SHORT).show(); out.flush(); out.close(); } catch (Exception e) { //Feedback um User zu informieren was passiert - Gibt Exception im Toast aus Toast.makeText(getApplicationContext(), e.toString(),Toast.LENGTH_SHORT).show(); } }
-
Hat sich mittlerweile erledigt, habs hinbekommen.
In der DrawView in onDraw:
Javapublic void onDraw(Canvas canvas) { //Lädt das Bild aus dem Galleryintent (Menu->Load) als BG in den Canvas if(imageLoaded) { Rect imageBounds = canvas.getClipBounds(); loadedImage.setBounds(canvas.getClipBounds()); loadedImage.draw(canvas); } }
Und in der Activity in onActivityResult:
JavaDrawable drawable = new BitmapDrawable(BitmapFactory.decodeFile(picturePath)); drawView.setImageToBackground(drawable);
Kann geschlossen werden!
-
Hi Leute,
hab ein kleines Problem mit meinem Abschlussprojekt, eine kleine Malapp mit der man auf einem Canvas zeichnen kann. Dafür gibts verschiede Funktionen, wie Colorpicker, ne Seekbar für die Pinselgröße, speichern etc... Die App läuft soweit, vorallem mit guter Performance. Jetzt hätt ich allerdings noch gerne eine Funktion drin, die ich einfach nicht hinbekomme. Ich würde gerne ein Bild aus der Gallery laden und irgendwie als Hintergrund in den Canvas reinsetzen, sodass man quasi auf dem Bild malt. Beim speichern soll das Bild natürlich im Bitmap das erstellt wird enthalten sein. Wie krieg ich das am besten gelöst? Hier mal bissel Code (Die teilweise geilen Kommentar bitte ignorieren, sind nur zum Nachvollziehen des Codes für meine beiden Studienkollegen)
Die Klasse DrawView:
Java
Alles anzeigenpublic class DrawView extends ImageView implements OnTouchListener { boolean drawMode = true; //Es wird im Vordergrund gezeichnet als Standard - für Background als Standard false setzen boolean brushForm = true; //Es wird Standardmäßig der Runde Brush gewählt - für echigen als Standard false setzen boolean drawCircle = false; //Prüft ob Kreis gemalt werden soll boolean drawSquare = false; //Prüft ob Rechteck gemalt werden soll //Anzahl der Finger die maximal verwendet werden fürs Multitouch final int MAX_POINT_CNT = 2; float[] x = new float[MAX_POINT_CNT]; //Array mit x-Werten der jeweiligen Fingerpositionen float[] y = new float[MAX_POINT_CNT]; //Array mit y-Werten der jeweiligen Fingerpositionen boolean[] isTouch = new boolean[MAX_POINT_CNT]; //Speichert welche Finger gerade aktiv sind Path path = new Path(); Paint paint = new Paint(); Paint cursorPaint = new Paint(); Path cursorPath = new Path(); LinkedList<Path> pathList = new LinkedList<Path>(); //Liste der Paintobjekte, speichert Informationen zu den jeweiligen Brushes LinkedList<Paint> paintList = new LinkedList<Paint>(); //Liste der Pfade die gezeichnet wurden. (jeweiliger Index von Pfad/Paintobjekt ist gleich) LinkedList<Circle> circleList = new LinkedList<Circle>(); //Liste der Kreisobjekte die gezeichnet wurden LinkedList<Square> squareList = new LinkedList<Square>(); //Liste der Rechteckobjekte die gezeichnet wurden public DrawView(Context context) { super(context); setDrawingCacheEnabled(true); //Aktiviert das Caching, wird zum Speichern benötigt setFocusable(true); setFocusableInTouchMode(true); this.setOnTouchListener(this); this.setBackgroundColor(0xffffffff); //Wird der BG nicht geändert, würde er beim Speichern schwarz sein, so isser Standardmäßig weiss paint.setAntiAlias(true); //Macht schönere Ränder beim Brush, machts allerdings etwas langsamer cursorPaint.setAntiAlias(true); paint.setDither(true); //Höhere Farbechtheit, machts allerdings auch bissel langsamer //Lade Standardbrush setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE); setBrushSize(2); setBrushColor(0xff000000); } //Zeichnet alles auf den Canvas public void onDraw(Canvas canvas) { if(brushForm) setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE); else setBrushStyle(Paint.Join.BEVEL, Paint.Cap.SQUARE, Paint.Style.STROKE); canvas.drawPath(cursorPath, cursorPaint); if(drawMode) { for (int i=0; i < pathList.size(); i++) { canvas.drawPath(pathList.get(i), paintList.get(i)); } canvas.drawPath(path, paint); } else { canvas.drawPath(path, paint); for (int i=0; i < pathList.size(); i++) { canvas.drawPath(pathList.get(i), paintList.get(i)); } } } //Down-Move-Up Touchevent-Handler public boolean onTouch(View view, MotionEvent event) { float eventX = event.getX(); float eventY = event.getY(); int pointerIndex = ((event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT); int pointerId = event.getPointerId(pointerIndex); int action = (event.getAction() & MotionEvent.ACTION_MASK); int pointCnt = event.getPointerCount(); if (pointCnt <= MAX_POINT_CNT) { if (pointerIndex <= MAX_POINT_CNT - 1) { for (int i = 0; i < pointCnt; i++) { int id = event.getPointerId(i); x[id] = (int) event.getX(i); y[id] = (int) event.getY(i); } switch (action) { case MotionEvent.ACTION_DOWN: if(drawCircle || drawSquare) isTouch[pointerId] = true; else { path = new Path(); path.reset(); path.moveTo(eventX, eventY); } return true; case MotionEvent.ACTION_MOVE: if(drawCircle || drawSquare) isTouch[pointerId] = true; else { path.lineTo(eventX, eventY); cursorPath.reset(); cursorPath.addCircle(eventX, eventY, 30, Path.Direction.CW); } break; case MotionEvent.ACTION_UP: if(drawCircle || drawSquare) isTouch[pointerId] = false; else { cursorPath.reset(); Paint newPaint = new Paint(); newPaint.set(paint); if(drawMode) { pathList.addLast(path); paintList.addLast(newPaint); } else { pathList.addFirst(path); paintList.addFirst(newPaint); } } break; default: if(drawCircle || drawSquare) isTouch[pointerId] = false; return false; } } } invalidate(); //Aktualisiert die View return true; } }
Und noch die Activity:
Java
Alles anzeigenpublic class MainActivity extends Activity { private static int RESULT_LOAD_IMAGE = 1; //Wird vom Galleryintent verwendet boolean isFileToShare = false; //Prüft ob die Datei im Share Ordner oder im normalen Ordner abgelegt werden soll boolean isFileAlreadySaved = false; //Wurde das Bild schon gespeichert? Wird abgefragt wenn man die App schließt und evtl. einen Dialog zu öffnen int actualColor = 0xffff0000; //Selbe Farbe wie in DrawView beim Laden des Standardbrushes, wird überschrieben bei Änderung durch colorPicker String actualFileName = ""; //Wird benötigt um beim Aufruf von Share zu wissen welches Bild geteilt werden soll Bitmap bmp = null; //Bild aus Galerie DrawView drawView = null; //Wird beim Starten ausgeführt @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Setzt App nach Start auf Fullscreen - Kann man überlegen das nochmal mit reinzunehmen, daher nur auskommentiert //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.setRequestedOrientation(1); //Verhindert das drehen der App, ColorPicker funzt nicht richtig in Landscapemode (0) drawView = new DrawView(this); setContentView(drawView); } //Generiert das Optionsmenu @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.main_optionsmenu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { //BEI ÄNDERUNGEN DIE REIHENFOLGE BITTE IN strings.xml und main_optionsmenu.xml der Übersicht wegen abgleichen //HIER WERDEN AUCH NUR METHODEN AUFGERUFEN, ALSO KEINEN CODE IN DIE CASES SCHREIBEN -> METHODEN DEFINIEREN!!! switch (item.getItemId()) { case R.id.id_optionsmenue_save: saveAsBitmap(); //Speichert gemaltes Bild im photoshapp Order der sich im root des Speichers befindet break; case R.id.id_optionsmenue_load: loadAsBitmap(); //!!!!!! FUNZT NOCH NICHT RICHTIG !!!!!!! break; default: return super.onOptionsItemSelected(item); } return true; } //Nur relevant für das Laden eines Bildes über den Galleryintent @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); //Soll eigentlich das gewählte Bild aus dem Intent in die View laden... man sieht aber nix :D Keine Ahnung worans liegt //Denke das Bild wird irgendwo hintendran geladen, oder garnicht, oder keine Ahnung was! drawView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); //Feedback um User zu informieren was passiert Toast.makeText(getApplicationContext(), "Image loaded!",Toast.LENGTH_SHORT).show(); } } //Speichert den aktuellen Content im externen Speicher public void saveAsBitmap() { isFileAlreadySaved = true; //Holt aktuelles Datum und schreibt es in einen String der weiter unten an Dateinamen drankommt Calendar currentDate = Calendar.getInstance(); SimpleDateFormat formatter= new SimpleDateFormat("yyyyMMMddHmmss"); String dateNow = formatter.format(currentDate.getTime()); //Holt aktuellen DrawingCache (alles was bis jetzt gemalt wurde) und speichert ihn ins Bitmap Bitmap bitmap = drawView.getDrawingCache(); //Fragt den Systempfad ab und erstellt den Appordner String root = Environment.getExternalStorageDirectory().toString(); File myDir = null; //Prüft ob das Bild normal gespeichert wurde oder ob es geteilt werden soll if(isFileToShare) { myDir = new File(root + "/PhotoshApp/Share"); } else { myDir = new File(root + "/PhotoshApp"); } myDir.mkdirs(); String fname = "photoshapp_"+ dateNow + ".jpg"; actualFileName = root + "/PhotoshApp/Share/" + fname; //Speichert aktuellen Pfad inkl. Dateinamen als String (fürs Teilen benötigt) File file = new File (myDir, fname); if (file.exists ()) file.delete (); try { FileOutputStream out = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); //Bild wird als JPEG mit Qualität 90 gespeichert //Feedback um User zu informieren was passiert Toast.makeText(getApplicationContext(), "Image saved!",Toast.LENGTH_SHORT).show(); out.flush(); out.close(); } catch (Exception e) { //Feedback um User zu informieren was passiert - Gibt Exception im Toast aus Toast.makeText(getApplicationContext(), e.toString(),Toast.LENGTH_SHORT).show(); } } //Öffnet den Galleryintent um ein Bild aus der Gallery zu wählen public void loadAsBitmap() { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, RESULT_LOAD_IMAGE); } }
Hat jemand Rat für mich? Momentan passiert jedenfalls nichts. Wenn die App abstürzen würde, wüsst ich wenigstens dass was falsch ist Aber so passiert einfach garnichts