The image of the Android custom camera does not appear in the gallery until I restart my phone

I’m working on a camera application, I want it to be when I click the Capture button, it takes a snapshot and saves it on the SD card so that it can be viewed in the gallery.

However, he cannot save how I want it. At the time when I press the capture button, it takes a picture, but the image is displayed only in the gallery after the phone is completely restarted.

This problem was useless with me for several weeks, I mainly followed the instructions for the android.

Here is my code for the main class that processes images.

private PictureCallback mPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); if (pictureFile == null){ Log.d(TAG, "Error creating media file, check storage permissions: "); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (FileNotFoundException e) { // Log.d(TAG, "File not found: " + e.getMessage()); } catch (IOException e) { // Log.d(TAG, "Error accessing file: " + e.getMessage()); } } }; private static File getOutputMediaFile(int type){ // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyCameraApp"); // This location works best if you want the created images to be shared // between applications and persist after your app has been uninstalled. // Create the storage directory if it does not exist if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ Log.d("MyCameraApp", "failed to create directory"); return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile; if (type == MEDIA_TYPE_IMAGE){ mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg"); } else if(type == MEDIA_TYPE_VIDEO) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_"+ timeStamp + ".mp4"); } else { return null; } return mediaFile; } public void onClick(View v) { mCamera.takePicture(null, null, mPicture); Context context = getApplicationContext(); CharSequence text = "Click Detected"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); } 

My cat log shows the following when I click

Level: E Tag: camera Text: in handlemessage for CAMERA_MSG_RAW_IMAGE

My permission

 uses-permission android:name="android.permission.CAMERA" uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 

Any help is greatly appreciated. Thanks

+6
source share
3 answers

This question is a duplicate. The image saved on the SD card is not displayed in the Android Gallery application (especially the ShadowGod answer)

To fix your code, add the following to onPictureTaken after fos.close ()

 File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyCameraApp"); sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ mediaStorageDir))); 
+6
source
 sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); 

It does not seem to work on KITKAT. It throws a permission denial exception and causes the application to crash. So for this I did the following,

 String path = mediaStorageDir.getPath() + File.separator + "IMG_Some_name.jpg"; CameraActivity.this.sendBroadcast(new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri .parse("file://" + path))); 

Hope this helps.

+2
source

All Articles