From ddc593cdb18b37f175a5cec6701ced480f72bae1 Mon Sep 17 00:00:00 2001 From: user189 Date: Sun, 7 Mar 2021 14:41:40 +0530 Subject: [PATCH] Captured image show black in image view When image trying to access in image view crash occured because with android 11 and targetsdk version 29 or above direct image file access not allowed. Solution : with android 11 access files directly is not allowed , used media api to access file uri. Tracked-On: OAM-96183 Signed-off-by: shiva kumara R --- .../com/intel/multicamera/CameraBase.java | 1 + .../intel/multicamera/FullScreenActivity.java | 148 ++++++------------ .../com/intel/multicamera/MultiCamera.java | 11 +- .../intel/multicamera/MultiViewActivity.java | 6 +- .../com/intel/multicamera/PhotoPreview.java | 11 +- .../multicamera/SingleCameraActivity.java | 18 ++- .../com/intel/multicamera/VideoRecord.java | 1 + 7 files changed, 85 insertions(+), 111 deletions(-) diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/CameraBase.java b/camera/MultiCameraApplication/java/com/intel/multicamera/CameraBase.java index 87682d7..9ada2b7 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/CameraBase.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/CameraBase.java @@ -740,6 +740,7 @@ private void saveImage(Size imageDimension, File ImageFile) { uri = Utils.broadcastNewPicture(mActivity.getApplicationContext(), mCurrentPictureValues); ic_camera.setCurrentUri(uri); + ic_camera.setImagePath(ImageFile.getAbsolutePath()); ic_camera.setCurrentFileInfo(mCurrentPictureValues); diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/FullScreenActivity.java b/camera/MultiCameraApplication/java/com/intel/multicamera/FullScreenActivity.java index 7216c5e..c7bb078 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/FullScreenActivity.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/FullScreenActivity.java @@ -70,8 +70,7 @@ public class FullScreenActivity extends AppCompatActivity { MultiCamera mCameraInst; private TextView mRecordingTimeView; private boolean mIsRecordingVideo; - private CameraBase mCameraBack; - private CameraBase mCameraFront; + private CameraBase mCamera; private RoundedThumbnailView mRoundedThumbnailView; private BroadcastReceiver mUsbReceiver; @@ -103,7 +102,7 @@ protected void onCreate(Bundle savedInstanceState) { checkPermissions(); - openBackCamera(); + OpenCamera(); try { final IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); @@ -174,14 +173,26 @@ public void onClick(View v) { mLastClickTime = SystemClock.elapsedRealtime(); MultiCamera ic_camera = MultiCamera.getInstance(); if (ic_camera.getWhichCamera() == 0) { - openFrontCamera(); + mCameraInst.setOpenCameraId(1); ic_camera.setWhichCamera(1); Log.i(TAG,"Opened front camera"); + closeCamera(); + + unregisterReceiver(mUsbReceiver); + startActivity(new Intent(getApplicationContext(), FullScreenActivity.class)); + ic_camera.setWhichCamera(1); + finishAffinity(); } else { - openBackCamera(); + mCameraInst.setOpenCameraId(0); ic_camera.setWhichCamera(0); + Log.i(TAG,"Opened back camera"); + closeCamera(); + unregisterReceiver(mUsbReceiver); + startActivity(new Intent(getApplicationContext(), FullScreenActivity.class)); + ic_camera.setWhichCamera(0); + finishAffinity(); } } @@ -231,12 +242,7 @@ public void onClick(View v) { mCameraPicture.setVisibility(View.VISIBLE); mCameraSwitch.setVisibility(View.VISIBLE); mCameraSplit.setVisibility(View.VISIBLE); - if (ic_camera.getWhichCamera() == 1) { - mCameraFront.createCameraPreview(); - } - else { - mCameraBack.createCameraPreview(); - } + mCamera.createCameraPreview(); } }); @@ -245,6 +251,7 @@ public void onClick(View v) { public void onClick(View v) { MultiCamera ic_camera = MultiCamera.getInstance(); ic_camera.setIsCameraOrSurveillance(1); + unregisterReceiver(mUsbReceiver); Intent intent = new Intent(FullScreenActivity.this, MultiViewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); @@ -260,14 +267,10 @@ public void onClick(View v) { return; } mLastClickTime = SystemClock.elapsedRealtime(); - if (MultiCamera.getInstance().getWhichCamera() == 1) { - if (mCameraFront != null) - mCameraFront.takePicture(); - } - else { - if (mCameraBack != null) - mCameraBack.takePicture(); - } + + if (mCamera != null) + mCamera.takePicture(); + } }); @@ -282,16 +285,11 @@ public void onClick(View view) { try { if (mIsRecordingVideo) { mIsRecordingVideo = false; - if (mCameraInst.getWhichCamera() == 0) { - mCameraBack.getmRecord().stopRecordingVideo(); - mCameraBack.getmRecord().showRecordingUI(false); - mCameraBack.getmPhoto().showVideoThumbnail(); - } - else { - mCameraFront.getmRecord().stopRecordingVideo(); - mCameraFront.getmRecord().showRecordingUI(false); - mCameraFront.getmPhoto().showVideoThumbnail(); - } + + mCamera.getmRecord().stopRecordingVideo(); + mCamera.getmRecord().showRecordingUI(false); + mCamera.getmPhoto().showVideoThumbnail(); + if (numOfCameras > 1) { mCameraSwitch.setVisibility(View.VISIBLE); @@ -303,14 +301,10 @@ public void onClick(View view) { mSettings.setVisibility(View.VISIBLE); } else { mIsRecordingVideo =true; - if (mCameraInst.getWhichCamera() == 0) { - mCameraBack.getmRecord().startRecordingVideo(); - mCameraBack.getmRecord().showRecordingUI(true); - } - else { - mCameraFront.getmRecord().startRecordingVideo(); - mCameraFront.getmRecord().showRecordingUI(true); - } + + mCamera.getmRecord().startRecordingVideo(); + mCamera.getmRecord().showRecordingUI(true); + mSettings.setVisibility(View.GONE); mCameraSwitch.setVisibility(View.GONE); mCameraPicture.setVisibility(View.GONE); @@ -324,7 +318,7 @@ public void onClick(View view) { }); } - public void openBackCamera() { + public void OpenCamera() { closeCamera(); GetCameraCnt(); @@ -340,47 +334,14 @@ public void openBackCamera() { updateStorageSpace(null); - OpenOnlyBackCamera(); + Open_Camera(); } - public void openFrontCamera() { - closeCamera(); - - GetCameraCnt(); - updateStorageSpace(null); - - OpenOnlyFrontCamera(); - } - - private void OpenOnlyFrontCamera() { - - mCamera_FrontView = findViewById(R.id.textureview); - if (mCamera_FrontView == null) { - Log.e(TAG, "fail to get surface for front view"); - return; - } - if (mCameraFront == null) { - Open_FrontCamera(); - } - - if (mCamera_FrontView.isAvailable()) { - mCameraFront.textureListener.onSurfaceTextureAvailable( - mCamera_FrontView.getSurfaceTexture(), - mCamera_FrontView.getWidth(), mCamera_FrontView.getHeight()); - } else { - mCamera_FrontView.setSurfaceTextureListener(mCameraFront.textureListener); - } - } private void closeCamera() { - if (null != mCameraBack) { - mCameraBack.closeCamera(); - mCameraBack = null; - } - - if (null != mCameraFront) { - mCameraFront.closeCamera(); - mCameraFront = null; + if (null != mCamera) { + mCamera.closeCamera(); + mCamera = null; } } @@ -401,50 +362,37 @@ public void GetCameraCnt() { } } - private void OpenOnlyBackCamera() { + private void Open_Camera() { mCamera_BackView = findViewById(R.id.textureview); if (mCamera_BackView == null) { Log.e(TAG, "fail to find surface for back camera"); return; } - if (mCameraBack == null) { - Open_BackCamera(); + if (mCamera == null) { + Open_Camera_ById(); } if (mCamera_BackView.isAvailable()) { - mCameraBack.textureListener.onSurfaceTextureAvailable( + mCamera.textureListener.onSurfaceTextureAvailable( mCamera_BackView.getSurfaceTexture(), mCamera_BackView.getWidth(), mCamera_BackView.getHeight()); } else { - mCamera_BackView.setSurfaceTextureListener(mCameraBack.textureListener); + mCamera_BackView.setSurfaceTextureListener(mCamera.textureListener); } } - public void Open_BackCamera() { + public void Open_Camera_ById() { String[] Data = new String[5]; Data[0] = "BackCamera"; - Data[1] = CameraIds[0]; + Data[1] = CameraIds[mCameraInst.getOpenCameraId()]; Data[2] = "capture_list"; Data[3] = "video_list"; Data[4] = "pref_resolution_1"; - mCameraBack = new CameraBase(this, mCamera_BackView, null, mRecordingTimeView, + mCamera = new CameraBase(this, mCamera_BackView, null, mRecordingTimeView, Data, mRoundedThumbnailView); } - - public void Open_FrontCamera() { - String[] Data = new String[5]; - - Data[0] = "FrontCamera"; - Data[1] = CameraIds[1]; - Data[2] = "capture_list_1"; - Data[3] = "video_list"; - Data[4] = "pref_resolution_1"; - - mCameraFront = new CameraBase(this, mCamera_FrontView, null, mRecordingTimeView, - Data, mRoundedThumbnailView); - } /** * Checks if any of the needed Android runtime permissions are missing. * If they are, then launch the permissions activity under one of the following conditions: @@ -491,10 +439,8 @@ protected void onResume() { Log.e(TAG, "onResume"); MultiCamera ic_cam = MultiCamera.getInstance(); ic_cam.setIsCameraOrSurveillance(0); - if (ic_cam.getWhichCamera() == 0) { - openBackCamera(); - } else { - openFrontCamera(); - } + + Open_Camera(); + } } diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/MultiCamera.java b/camera/MultiCameraApplication/java/com/intel/multicamera/MultiCamera.java index d857557..9f2ce47 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/MultiCamera.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/MultiCamera.java @@ -33,10 +33,11 @@ public class MultiCamera { private Uri mCurrentUri; private ContentValues mCurrentFileInfo; + private String imagePath; MultiCamera() { mWhichCamera = 0; mIsCameraOrSurveillance = 0; - mOpenCameraId = -1; + mOpenCameraId = 0; } public static MultiCamera getInstance() { if (ic_instance == null) { @@ -124,4 +125,12 @@ public void setOpenCameraId(int openCameraId) { public static int getUsbCamDeviceClass() { return usb_dev_id; } + + public String getImagePath() { + return imagePath; + } + + public void setImagePath(String imagePath) { + this.imagePath = imagePath; + } } diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/MultiViewActivity.java b/camera/MultiCameraApplication/java/com/intel/multicamera/MultiViewActivity.java index 256f718..44101d6 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/MultiViewActivity.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/MultiViewActivity.java @@ -331,6 +331,7 @@ public void onClick(View v) { ic_camera.setOpenCameraId(0); closeCamera(); ic_camera.setIsCameraOrSurveillance(0); + unregisterReceiver(mUsbReceiver); Intent intent = new Intent(MultiViewActivity.this, SingleCameraActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); @@ -376,6 +377,7 @@ public void onClick(View v) { ic_camera.setOpenCameraId(1); closeCamera(); ic_camera.setIsCameraOrSurveillance(0); + unregisterReceiver(mUsbReceiver); Intent intent = new Intent(MultiViewActivity.this, SingleCameraActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); @@ -421,6 +423,7 @@ public void Open_BotmLeftCam() { public void onClick(View v) { ic_camera.setOpenCameraId(2); closeCamera(); + unregisterReceiver(mUsbReceiver); Intent intent = new Intent(MultiViewActivity.this, SingleCameraActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); @@ -468,6 +471,7 @@ public void Open_BotmRightCam() { public void onClick(View v) { ic_camera.setOpenCameraId(3); closeCamera(); + unregisterReceiver(mUsbReceiver); Intent intent = new Intent(MultiViewActivity.this, SingleCameraActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); @@ -1281,7 +1285,7 @@ public void enterFullScreen(View view) { } closeCamera(); - + unregisterReceiver(mUsbReceiver); Intent intent = new Intent(MultiViewActivity.this, SingleCameraActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/PhotoPreview.java b/camera/MultiCameraApplication/java/com/intel/multicamera/PhotoPreview.java index d73655e..f8d2c5e 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/PhotoPreview.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/PhotoPreview.java @@ -105,7 +105,7 @@ public void onClick(View v) { preView = mActivity.findViewById(R.id.preview); Uri uri = ic_camera.getCurrentUri(); - File file = new File(Utils.getRealPathFromURI(mActivity, uri)); + File file = new File(ic_camera.getImagePath()); if (file.exists()) { Log.v(TAG, " Thumbnail Preview File Deleted "); file.delete(); @@ -150,8 +150,9 @@ private void showDetailsDialog(ContentValues info) { } private void VideoPreview(ImageButton playButton, ImageView preView) { + final Uri videoUri = Uri.fromFile(new File(ic_camera.getImagePath())); final Optional bitmap = - Utils.getVideoThumbnail(mActivity.getContentResolver(), ic_camera.getCurrentUri()); + Utils.getVideoThumbnail(mActivity.getContentResolver(), videoUri); if (bitmap.isPresent()) { playButton.setVisibility(View.VISIBLE); @@ -175,7 +176,8 @@ private void photoPreview(ImageButton playButton, ImageView preView) { preView.setVisibility(View.VISIBLE); playButton.setVisibility(View.GONE); - preView.setImageURI(PhotoUri); + + preView.setImageURI(Uri.fromFile(new File(ic_camera.getImagePath()))); } public void showImageThumbnail(File ImageFile) { @@ -215,10 +217,11 @@ private int getOrientation(int rotation) { public void showVideoThumbnail() { + final Uri videoUri = Uri.fromFile(new File(ic_camera.getImagePath())); mRoundedThumbnailView.startRevealThumbnailAnimation("Video taken"); final Optional bitmap = - Utils.getVideoThumbnail(mActivity.getContentResolver(), ic_camera.getCurrentUri()); + Utils.getVideoThumbnail(mActivity.getContentResolver(), videoUri); if (bitmap.isPresent()) { mRoundedThumbnailView.setThumbnail(bitmap.get(), 0); diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/SingleCameraActivity.java b/camera/MultiCameraApplication/java/com/intel/multicamera/SingleCameraActivity.java index 03cf239..dc73362 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/SingleCameraActivity.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/SingleCameraActivity.java @@ -171,14 +171,23 @@ public void onClick(View v) { MultiCamera ic_camera = MultiCamera.getInstance(); if (ic_camera.getWhichCamera() == 0) { ic_camera.setOpenCameraId(1); - OpenCamera(); - ic_camera.setWhichCamera(1); + Log.i(TAG,"Opened front camera"); + closeCamera(); + unregisterReceiver(mUsbReceiver); + startActivity(new Intent(getApplicationContext(), FullScreenActivity.class)); + ic_camera.setWhichCamera(1); + finishAffinity(); + } else { ic_camera.setOpenCameraId(0); - OpenCamera(); - ic_camera.setWhichCamera(0); + closeCamera(); + unregisterReceiver(mUsbReceiver); + startActivity(new Intent(getApplicationContext(), FullScreenActivity.class)); + ic_camera.setWhichCamera(1); + finishAffinity(); + Log.i(TAG,"Opened back camera"); } } @@ -189,6 +198,7 @@ public void onClick(View v) { public void onClick(View v) { MultiCamera ic_camera = MultiCamera.getInstance(); ic_camera.setIsCameraOrSurveillance(1); + unregisterReceiver(mUsbReceiver); Intent intent = new Intent(SingleCameraActivity.this, MultiViewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); diff --git a/camera/MultiCameraApplication/java/com/intel/multicamera/VideoRecord.java b/camera/MultiCameraApplication/java/com/intel/multicamera/VideoRecord.java index d7c46f2..6be8c7c 100644 --- a/camera/MultiCameraApplication/java/com/intel/multicamera/VideoRecord.java +++ b/camera/MultiCameraApplication/java/com/intel/multicamera/VideoRecord.java @@ -729,6 +729,7 @@ private void saveVideo() { ic_camera.setCurrentUri(uri); + ic_camera.setImagePath(mVideoFilename); ic_camera.setCurrentFileInfo(mCurrentVideoValues); Log.i(TAG, "video saved @: " + mVideoFilename);