Lösung:
Also es lag wohl doch an einem Bild. Das Bild hatte eine Auflösung von 600 x 600 und 130 kb.
Ich habe die Auflösung runtergeschraubt auf 50 x 50 und da ging es wieder.
Ist das normal das bei einer solchen Bildgröße solche Probleme auftreten in einer Liste,
selbst wenn nur ein Eintrag vorhanden ist?
Beiträge von Kalicronic
-
-
Also mir ist aufgefallen das es nur bei dem Pyro_7_PLUS_3G und einem Huawei P8 lite 2017, beide Android V.8, auftritt.
Es laufen auf diesem auch immer 4-5 Threads mehr.
Was ist den eine normale anzahl an threads?
Ich schau mal ob ich später code ausschnitte hochladen kann.Edit: ich habe auch ein ViewHolder für die ListAdapter Klasse ausprobiert. Dies änderte auch nichts.
-
Ich habe es mit verschiedenen Geräten getestet. (Pyro_7_PLUS_3G, Lenovo TB3-710F und noch eins für verschiedene Android Versionen)
Wo kann man die laufenden Threads denn sehen?
Im Programm selber habe ich vielleicht 3-4 Threads wissentlich laufen, aber auch nur temporär für bestimmte Aufgaben.
Das Layout ist relativ simple und nutzt ein einfaches Listview mit einfachen Daten. Es ist nur ein kleines Statussymbol in jedem Eintrag.
Zudem sind es auch nur 5 Listen Einträge.Es gibt eine MainActivity die 3 verschiedene Fragmente aufrufen kann.
Sichtlich tritt es auf wenn ich eine Listitem ancklicke. Und da wird auch im Profiler was angezeigt.(siehe bild im ersten Beitrag)Edit: 24 Threads laufen zu dem Zeitpunkt laut Profiler.
-
Den Normalen Wave-Effekt. Da ist nix verändert.
Ja, ein Android Gerät via USB-Debugging. -
Hey Leute,
In meienr App habe ich bemerkt das beim Klicken (long click und normalen click) eine Verzögerung entsteht.
Die Animation des Klickens ist auch nicht so gleitend wie es sein sollte. Zudem weis ich auch nicht ob der slow down während des Klicks oder schon vorher besteht.
Ich weis nicht wie ich solche Slow downs ausfindig mache mit Android Studio.
Mit dem Profiler hab ich mich nun gerade erst angefreundet, sehe aber noch nicht bei allem durch. -
Hallo
Das was du hast ist ja kein String sondern ein Byte Array.
Wie du richtig sagst kann man ein Zip an dem Anfang erkennen der ist PK und dann kommen angaben in Hex.
https://www.hummel1.de/prog/zipview/zipstruc.htmSchaue dir mal ein Zip mit einen Hex-Editor an.
Die Bytes nach den ersten Zwei „PK“ sind keine Charter die im ASCII Code ein Zeichen oder Buchstaben entspricht, deshalb die komischen Zeichen. Die du als Platzhalter sehen kannst.
Weil das keine Druckbaren, Anzeigbaren Zeichen sind. Der hex wert ist trotzdem vorhanden.In Punkto Speicherverbrach hat @Xcreen natürlich recht. Wenn es nur wenige Bytes sind und nicht erst eine Datei erstellen willst, du das Array am Anfang auf das „PK“ prüfen willst dann in etwa so.
Code
Alles anzeigenbyte[] zipArray = {0x50, 0x4b, 0x03, 0x04, 0x14, 0x20, 0x02, 0x20, 0x08, 0x20}; String zipString = ""; for (int i=0; i<4; i++){ zipString= zipString+zipArray[i]; } if( zipString.equals("807534")) { // ist ein Zipfile } // hier wird leider noch mehr speicher verbraucht // weil das ByteArry in ein StringArry gewandelt wird so wie du es gemacht hast zipString = new String(zipArray); String st = zipString.substring(0,4); String testZip = "PK"+(char)0x03+(char)0x04; if (st.equals( testZip )){ // ist ein Zipfile }
Aus irgendeinem Grund habe ich das mit dem String übersehen.
Natürlich werden die nicht als konkrete Zeichen angezeigt. *facepalm*Die Lösung funktioniert nun so, vielen dank.
-
Hey Leute
ich habe von einer url etwas als byte[] heruntergeladen. Im besten fall ist dies eine zip datei.
Genau das will ich überprüfen. Der einfachste weg der sich aber als kompliziert herausstellte ist
die ersten 5 bytes (magic number) zu lesen, die wie ich aus recherchen habe eine identifikationsnummer für Dateitypen sein soll.
Mein problem ist jedoch das ich unbekannte zeichen herausbekomme. -> (PK����Æ^6N���)
Ich habe auch schon andere Charsets versucht, aber es kamm bis her immer das gleiche unlesbare Zeug.Hier mein short code:
Falls jemand eine idee hat oder auch eine alternative lösung, bitte her damit. =D
-
Hey! =)
Also ja die Permissions sind gesetzt und erstellt auch die Bilder.
Ich hab das GitHub Beispiel mal übernommen und das Funktioniert auch so weit, aber das ändert
bisher nichts an meinem eigentlichen Problemen außer das ich ein paar paar hübsche Funktionen zusätzlich habe.Also entweder hast du meine Frage nicht ganz verstanden oder ich deine Antwort bzw. den Beispielkode nicht.
Nochmal zu meinem Problem:
Ich kann Bilder aus der Galerie wählen und auch Fotos machen die auch gespeichert werden auf meinem Device.
Nun möchte ich direkt nach einer Bildauswahl oder einem gemachten Foto das jeweilige Bild Zuschneiden.Bei meinen bisherigen versuchen konnte ich nur nach einem ausgewählten Bild aus der Galerie ein bild zuschneiden,
was aber manchmal nach dem zuschneiden zu einer "TransactionTooLargeException" führt. -
Hey Leute,
Ich habe zwei Probleme.
Über meine App kann der Benutzer Bilder aus der Galerie auswählen oder ein Foto machen.
Direkt danach soll der Benutzer das jeweilige Bild Zuschneiden können mit "crop".
Problem 1.
Das direkte Cropen funktioniert zwar bei einem Bild das aus der Galerie gewählt wurde.
Mach ich aber ein Foto weis ich nicht wie ich konkret danach ein Crop ausführen kann ohne nochmal die Galerie aufzurufen.Problem 2.
Ab und an bekomme ich die TransactionTooLargeException. (Wo kann man diese Exception überhaupt abfangen?)
Das diese entsteht beim austausch eines zugeschnittenen (croped) Bildes von dem Intent zu meiner App.
Ich nehme an das ich über das Intent das zugeschnittenen Bildes habe ich herausbekommen und das man es direkt speichern muss und es dann in OnActivityResult vom Device laden sollte.
Nur leider hat das irgendwie nicht so ganz geklappt mit ein paar beispielen aus dem Netz. Vielleicht hat da jemand eine beispiel Lösung zu meinem Code nochmal.Hier meine Codeschnippsel:
Code
Alles anzeigenString imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CropPic.png"; File imageFile = new File(imageFilePath); Uri imageFileUri = Uri.fromFile(imageFile); // convert path to Uri chooseImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (sliderImages.size() < 6) { try { Toast.makeText(getContext(), imageFileUri.toString(), Toast.LENGTH_SHORT).show(); Intent imageDownload = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); imageDownload.setType("image/*"); imageDownload.putExtra("crop", "true"); imageDownload.putExtra("aspectX", 3); imageDownload.putExtra("aspectY", 2); imageDownload.putExtra("outputX", 200); imageDownload.putExtra("outputY", 150); imageDownload.putExtra("return-data", true); imageDownload.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); imageDownload.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString()); startActivityForResult(imageDownload, SELECTED_PICTURE); } catch (ActivityNotFoundException e) { ErrorDefinition.sendExceptionToDB(getContext(), e); } catch (Exception e) { ErrorDefinition.sendExceptionToDB(getContext(), e); } } else { Toast.makeText(getContext(), "Maximum of 6 pictures allowed.\n", Toast.LENGTH_SHORT).show(); } } }); takeFoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (sliderImages.size() < 6) { try { Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); captureIntent.putExtra("return-data", true); captureIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); captureIntent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString()); startActivityForResult(captureIntent, CAMERA_CAPTURE); } catch (ActivityNotFoundException e) { ErrorDefinition.sendExceptionToDB(getContext(), e); } catch (Exception e) { ErrorDefinition.sendExceptionToDB(getContext(), e); } } else { Toast.makeText(getContext(), "Maximum of 6 pictures allowed.\n", Toast.LENGTH_SHORT).show(); } } }); @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case SELECTED_PICTURE: if (resultCode == RESULT_OK) { if (data != null) { try { Bundle extra = data.getExtras(); Bitmap bitmap = extra.getParcelable("data"); try { bitmap = Utility.compressBitmap(getContext(), bitmap); } catch (OutOfMemoryError e) { ErrorDefinition.sendErrorToDB(getContext(), e); Toast.makeText(getContext(), "Picture too big. ", Toast.LENGTH_SHORT).show(); } if (bitmap != null) sliderImages.add(bitmap); refreshImageSlider(); } catch (Exception e) { ErrorDefinition.sendExceptionToDB(getContext(), e); } } } break; case CAMERA_CAPTURE: if (resultCode == RESULT_OK) { try { Intent cropIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); cropIntent.setDataAndType(imageFileUri, "image/*"); cropIntent.putExtra("crop", "true"); cropIntent.putExtra("aspectX", 3); cropIntent.putExtra("aspectY", 2); cropIntent.putExtra("outputX", 200); cropIntent.putExtra("outputY", 150); cropIntent.putExtra("return-data", true); cropIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); cropIntent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString()); startActivityForResult(cropIntent, SELECTED_PICTURE); } // respond to users whose devices do not support the crop action catch (ActivityNotFoundException e) { ErrorDefinition.sendExceptionToDB(getContext(), e); Toast.makeText(getContext(), "This device doesn't support the crop action!", Toast.LENGTH_SHORT).show(); } catch (Exception e) { ErrorDefinition.sendExceptionToDB(getContext(), e); } } break; default: break; } }
-
Hallo leute,
Ums kurz zu machen:
Ich habe eine Fileserver auf dem ich JPEGs Speichere. Diese sollen möglichst wenig Speicherplatz wegnehmen, was über meine App auf 50 Kb komprimiert werden soll.
Mein jetziger Code funktioniert zwar soweit, aber bei einigen Bildern wird die Qualität zu schlecht.
So sieht mein code bis hierhin aus:Java
Alles anzeigenpublic static Bitmap compressBitmap(Context ctx, Bitmap bmp){ Bitmap editBmp = bmp; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { //Change Bmp x- or y-size smaller than 600 while(editBmp.getWidth() > 600 || editBmp.getHeight() > 600){ editBmp = Bitmap.createScaledBitmap(editBmp, editBmp.getWidth()/2, editBmp.getHeight()/2, false); } //compress without quality reduction to read bytesize editBmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] imageInByte = baos.toByteArray(); long lengthbmp = imageInByte.length / 1000; //dividing with 1000 for Kilobytes bmp = editBmp; int quality = 100; //reduce bmp bytesize with quality reduction while(lengthbmp >= 50) { if(quality <= 0){ break; } baos = new ByteArrayOutputStream(); editBmp = bmp; quality -= 5; editBmp.compress(Bitmap.CompressFormat.JPEG, quality, baos); imageInByte = baos.toByteArray(); lengthbmp = imageInByte.length / 1000; //dividing with 1000 for Kilobytes } //Toast.makeText(ctx, quality + "\n" + String.valueOf(lengthbmp) + " kb" + editBmp.getWidth() + "x" + editBmp.getHeight(), Toast.LENGTH_SHORT).show(); return editBmp; } catch (Exception e) { //Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show(); return null; } }
Die Gründe für eine schlechte Qualität sind mir klar und im Prinzip kann ich nun rumprobieren und mit einigen Zahlen rumspielen bis es halbwegs funktioniert, aber vielleicht hat jemand einen besseren Ansatz oder sogar eine Lösung dafür.