crop and transaction

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • crop and transaction

    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:

    Quellcode

    1. String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CropPic.png";
    2. File imageFile = new File(imageFilePath);
    3. Uri imageFileUri = Uri.fromFile(imageFile); // convert path to Uri
    4. chooseImage.setOnClickListener(new View.OnClickListener() {
    5. @Override
    6. public void onClick(View view) {
    7. if (sliderImages.size() < 6) {
    8. try {
    9. Toast.makeText(getContext(), imageFileUri.toString(), Toast.LENGTH_SHORT).show();
    10. Intent imageDownload = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    11. imageDownload.setType("image/*");
    12. imageDownload.putExtra("crop", "true");
    13. imageDownload.putExtra("aspectX", 3);
    14. imageDownload.putExtra("aspectY", 2);
    15. imageDownload.putExtra("outputX", 200);
    16. imageDownload.putExtra("outputY", 150);
    17. imageDownload.putExtra("return-data", true);
    18. imageDownload.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
    19. imageDownload.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
    20. startActivityForResult(imageDownload, SELECTED_PICTURE);
    21. } catch (ActivityNotFoundException e) {
    22. ErrorDefinition.sendExceptionToDB(getContext(), e);
    23. } catch (Exception e) {
    24. ErrorDefinition.sendExceptionToDB(getContext(), e);
    25. }
    26. } else {
    27. Toast.makeText(getContext(), "Maximum of 6 pictures allowed.\n", Toast.LENGTH_SHORT).show();
    28. }
    29. }
    30. });
    31. takeFoto.setOnClickListener(new View.OnClickListener() {
    32. @Override
    33. public void onClick(View view) {
    34. if (sliderImages.size() < 6) {
    35. try {
    36. Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    37. captureIntent.putExtra("return-data", true);
    38. captureIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
    39. captureIntent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
    40. startActivityForResult(captureIntent, CAMERA_CAPTURE);
    41. } catch (ActivityNotFoundException e) {
    42. ErrorDefinition.sendExceptionToDB(getContext(), e);
    43. } catch (Exception e) {
    44. ErrorDefinition.sendExceptionToDB(getContext(), e);
    45. }
    46. } else {
    47. Toast.makeText(getContext(), "Maximum of 6 pictures allowed.\n", Toast.LENGTH_SHORT).show();
    48. }
    49. }
    50. });
    51. @Override
    52. public void onActivityResult(int requestCode, int resultCode, Intent data) {
    53. super.onActivityResult(requestCode, resultCode, data);
    54. switch (requestCode) {
    55. case SELECTED_PICTURE:
    56. if (resultCode == RESULT_OK) {
    57. if (data != null) {
    58. try {
    59. Bundle extra = data.getExtras();
    60. Bitmap bitmap = extra.getParcelable("data");
    61. try {
    62. bitmap = Utility.compressBitmap(getContext(), bitmap);
    63. } catch (OutOfMemoryError e) {
    64. ErrorDefinition.sendErrorToDB(getContext(), e);
    65. Toast.makeText(getContext(), "Picture too big. ", Toast.LENGTH_SHORT).show();
    66. }
    67. if (bitmap != null)
    68. sliderImages.add(bitmap);
    69. refreshImageSlider();
    70. } catch (Exception e) {
    71. ErrorDefinition.sendExceptionToDB(getContext(), e);
    72. }
    73. }
    74. }
    75. break;
    76. case CAMERA_CAPTURE:
    77. if (resultCode == RESULT_OK) {
    78. try {
    79. Intent cropIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    80. cropIntent.setDataAndType(imageFileUri, "image/*");
    81. cropIntent.putExtra("crop", "true");
    82. cropIntent.putExtra("aspectX", 3);
    83. cropIntent.putExtra("aspectY", 2);
    84. cropIntent.putExtra("outputX", 200);
    85. cropIntent.putExtra("outputY", 150);
    86. cropIntent.putExtra("return-data", true);
    87. cropIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
    88. cropIntent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
    89. startActivityForResult(cropIntent, SELECTED_PICTURE);
    90. }
    91. // respond to users whose devices do not support the crop action
    92. catch (ActivityNotFoundException e) {
    93. ErrorDefinition.sendExceptionToDB(getContext(), e);
    94. Toast.makeText(getContext(), "This device doesn't support the crop action!", Toast.LENGTH_SHORT).show();
    95. } catch (Exception e) {
    96. ErrorDefinition.sendExceptionToDB(getContext(), e);
    97. }
    98. }
    99. break;
    100. default:
    101. break;
    102. }
    103. }
    Alles anzeigen
  • 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.