Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed problem with saving images in Android sample #24622

Merged
merged 6 commits into from
Dec 4, 2023

Conversation

alexlyulkov
Copy link
Contributor

@alexlyulkov alexlyulkov commented Nov 30, 2023

Fixes #24590

Current code for saving images in Android sample worked only on very old phones.
Added support for modern Android versions.

Required:

Copy link
Contributor

@asmorkalov asmorkalov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I propose not introduce new dependency, but reuse approach from.


You just need to override behaviour of base class.

@asmorkalov asmorkalov self-assigned this Nov 30, 2023
@asmorkalov
Copy link
Contributor

Full recompilation is required because no incremental change information is available. This is usually caused by clean builds or changing compiler arguments.
Compiling with toolchain '/usr/lib/jvm/java-11-openjdk-amd64'.
file or directory '/mnt/projects/Projects/OpenCV/opencv-master-android2/opencv_android/tutorial-3-cameracontrol/src/debug/java', not found
file or directory '/mnt/projects/Projects/OpenCV/opencv-master-android2/opencv_android/tutorial-3-cameracontrol/build/generated/aidl_source_output_dir/debug/out', not found
file or directory '/mnt/projects/Projects/OpenCV/opencv-master-android2/opencv_android/tutorial-3-cameracontrol/build/generated/renderscript_source_output_dir/debug/out', not found
Compiling with JDK Java compiler API.
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:76: error: package Build does not exist
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                 ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:76: error: package Build does not exist
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                                          ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:77: error: cannot find symbol
            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
            ^
  symbol:   class Bitmap
  location: class Tutorial3View
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:77: error: cannot find symbol
            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                            ^
  symbol:   variable BitmapFactory
  location: class Tutorial3View
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:81: error: cannot find symbol
                    ContentResolver resolver = getContext().getContentResolver();
                    ^
  symbol: class ContentResolver
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:82: error: cannot find symbol
                    ContentValues contentValues = new ContentValues();
                    ^
  symbol: class ContentValues
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:82: error: cannot find symbol
                    ContentValues contentValues = new ContentValues();
                                                      ^
  symbol: class ContentValues
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:83: error: package MediaStore does not exist
                    contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, mPictureFileName);
                                                ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:84: error: package MediaStore does not exist
                    contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg");
                                                ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:85: error: package MediaStore does not exist
                    contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
                                                ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:85: error: cannot find symbol
                    contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
                                                                             ^
  symbol: variable Environment
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:86: error: cannot find symbol
                    Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
                    ^
  symbol: class Uri
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:86: error: package MediaStore.Images does not exist
                    Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
                                                                    ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:88: error: cannot find symbol
                        OutputStream fos = resolver.openOutputStream(Objects.requireNonNull(imageUri));
                        ^
  symbol: class OutputStream
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:88: error: cannot find symbol
                        OutputStream fos = resolver.openOutputStream(Objects.requireNonNull(imageUri));
                                                                     ^
  symbol: variable Objects
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:89: error: package Bitmap does not exist
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                                              ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:90: error: cannot find symbol
                        Objects.requireNonNull(fos).close();
                        ^
  symbol: variable Objects
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:97: error: cannot find symbol
            mPictureFileName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath()
                                                                             ^
  symbol:   variable Environment
  location: class Tutorial3View
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java:97: error: cannot find symbol
            mPictureFileName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath()
                               ^
  symbol:   variable Environment
  location: class Tutorial3View
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3Activity.java:180: error: package Build does not exist
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                 ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3Activity.java:180: error: package Build does not exist
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                          ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3Activity.java:181: error: package Manifest does not exist
            if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                                            ^
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3Activity.java:182: error: cannot find symbol
                != PackageManager.PERMISSION_GRANTED) {
                   ^
  symbol:   variable PackageManager
  location: class Tutorial3Activity
/home/alexander/Projects/OpenCV/opencv-master/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3Activity.java:183: error: package Manifest does not exist
                String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};

Copy link
Contributor

@asmorkalov asmorkalov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried the solution manually. Works well, besides the first photo. I propose to move saving permission request to the very beginning. Otherwise the first image is not saved.

Copy link
Contributor

@asmorkalov asmorkalov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@asmorkalov
Copy link
Contributor

@mshabunin Could you take a look the PR and related changes in CI and environment.

Copy link
Contributor

@mshabunin mshabunin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me. Do not forget to revert pipeline branch before merge.

@alexlyulkov
Copy link
Contributor Author

I tried the solution manually. Works well, besides the first photo. I propose to move saving permission request to the very beginning. Otherwise the first image is not saved.

Yes, it saves image only on the next tap after confirming memory access. The user can decline assess request, so we still may need to ask for it on every image save.
The proper way is to make the async behavior. If we don't have the permission now, we need to save the image in some class field and run saveImage() later from Activity.onRequestPermissionsResult() method.
I can add it, but I think it is overcomplicated for the sample.

@alexlyulkov
Copy link
Contributor Author

Tested on Android 9 and Android 10. Works fine.

@asmorkalov asmorkalov merged commit 8165659 into opencv:4.x Dec 4, 2023
25 of 26 checks passed
@asmorkalov asmorkalov mentioned this pull request Jan 19, 2024
thewoz pushed a commit to thewoz/opencv that referenced this pull request May 29, 2024
…ple-img-save

Fixed problem with saving images in Android sample opencv#24622

Fixes opencv#24590

Current code for saving images in Android sample worked only on very old phones.
Added support for modern Android versions.

Required:
- opencv/ci-gha-workflow#127
- opencv-infrastructure/opencv-gha-dockerfile#27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

tutorial3-camera-control sample fails to save captured image on modern android
3 participants