Before updating to Windows 10 you may need to return your Pro license. More information here

Saving Screenshots to Android Gallery

I want to make a screenshot of the Android screen while playing the game by pressing a GUI button and save it to the android's Gallery.

I found a tutorial that details how to save images to the android's gallery using the SDK and java. Here's the link http://developer.android.com/training/camera/photobasics.html

My problem is that I don't understand how to use java with unity. My basic understanding is that I need to either make a library or a plugin. Is that correct? Can you point me to a tutorial that walks me through the process? Or suggest another approach?


more ▼

asked Jan 11, 2012 at 02:23 PM

avatar image

151 12 15 33

Hey, any update here? I'm hitting on the same wall, so some pointers would be great.

Aug 06, 2012 at 01:36 PM Miyavi

related: http://answers.unity3d.com/questions/22954/how-to-save-a-picture-take-screenshot-from-a-camer.html - btw did you ever got to a good solution for this? it's quite annoying we can't simply replicate the native android's (or iPhone) native screenshot button behavior.

Dec 12, 2012 at 01:54 PM Cawas
(comments are locked)
10|3000 characters needed characters left

5 answers: sort voted first

After lots of digging, I've found a solution, but it's made me realize that this post probably should have been three separate questions.

RE: How to use Java Plugins in Unity
The documentation for Unity includes a page describing plugins. Under the Android section, there is a description of how to make a jar file and use AndroidJavaObject to access it in Unity.

RE: How to make and save an Android Screenshot
First, according to this post, androids have problems encoding to PNG. This post provided a link to an alternative jpg encoding.

Second, to view the screenshot from the android file manager, the file path needs to be set using Application.persistentDataPath . More in this post.

RE: Android Gallery
[EDIT] Still working on this... After taking a screenshot, the image does not show up in the gallery regardless of the filepath. However, on rebooting the phone, it does a media scan and automatically adds all image files to the gallery, again regardless of the filepath. There is a post about forcing a media scan, but I have yet to try out the answer

more ▼

answered Jan 21, 2012 at 04:48 PM

avatar image

151 12 15 33

I don't think it's so complicated that you will have to write a Plugin... You just need to have the user specify where their Android Gallery path is (if it's different than the default) ... then use the method to capture the screen @ http://answers.unity3d.com/questions/59944/accessing-the-iphone-or-android-camera-for-screens.html

Jan 21, 2012 at 04:52 PM ina

/sdcard/DCIM/camera/ or /sdcard/media/images/

Jan 21, 2012 at 04:54 PM ina

I came to the conclusion that no plugins were necessary too, but since it was part of my original question, I thought I should answer that part too.

I used your post as a starting point actually about two weeks ago, but at the time I didn't have commenting or upvoting privileges. :) Thanks for the help.

Jan 21, 2012 at 04:59 PM cmauceri

I think instead of messing with plugins, I'm going to allow the automatic media scan to take care of updating the gallery, and simply inform the user that the image will be available there on reboot.

Jan 21, 2012 at 07:09 PM cmauceri

You have to send an update to the media content provider for the image to show up right after you saved it. I have to dig for the code in one of our projects, do you still need it?

Aug 15, 2012 at 08:59 PM marsbear
(comments are locked)
10|3000 characters needed characters left

This plugin looks like it will do the trick:


more ▼

answered Apr 05, 2013 at 12:55 PM

avatar image

31 1

It sure looks like. But does it really? Any testimony?

Apr 05, 2013 at 01:28 PM Cawas

Yep it works for me! iOS + Android.

Apr 05, 2013 at 03:45 PM zoooom

The plugin did the trick to me too. It means there is no simple solution. It offers a compiled library for android and another one for iphone. Awesome plugin! Though this should be default in Unity, which is lame.

Sep 24, 2013 at 01:49 PM Cawas
(comments are locked)
10|3000 characters needed characters left

I got a partial answer for the 'saving an image in the users gallery on Android' part of the question. That's how we do it in native Android. I will look for a solution from Unity.

 final Bitmap bitmap = INSERTSOMEVIEWHERE.getDrawingCache();
 final File appSzenesFolder;
 try {
     appSzenesFolder = directoryAndStorage.getOrCreatePictureDirectory("NameOfTheImageFolderInTheGallery");
     final Date now = new Date();
     final File file = new File(appSzenesFolder, (now.getTime() / 1000) + ".png");
     final FileOutputStream ostream = new FileOutputStream(file);
     bitmap.compress(CompressFormat.PNG, 100, ostream);
     // Tell the media scanner about the new file so that it is immediately available to the user.
     MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null, null);
 } catch (IOException e) {
     // Insert error handling here :)

This is pretty much copy and paste from one of our previous projects. I removed some of the error handling (you have to check for the existence of the folder etc).

INSERTSOMEVIEWHERE is some view in Android. This code is basically meant to take a screenshot from a particular view ans save it in the gallery. You can take the root view if you want to take a screenshot of the whole app.

There is that external helper function directoryAndStorage.getOrCreatePictureDirectory I use to create a folder in the users gallery depending on which device we are running on (Some devices don't have an external storage and the Nook does not have the function getExternalStoragePublicDirectory). The helper function is far from complete, you could add support for different Android versions aswell:

 public File getOrCreatePictureDirectory(String directoryName) {
     final File picturesDir;
     if (Build.PRODUCT.equals("NOOKcolor")) {
         // The nook color uses a slightly different path for images and the
         // usual constant for the path does not work
         picturesDir = new File("/mnt/media");
     } else if (Build.PRODUCT.equals("NOOKTablet")) {
         picturesDir = new File("/mnt/media");
     } else {
         picturesDir = Environment
     File dir = new File(picturesDir, directoryName);
     if (!dir.exists()) {
         Log.i(Config.LOG_TOKEN, "'" + dir
                 + "' does not exist, trying to create ...");
         if (dir.mkdirs() == false) {
             Log.e(Config.LOG_TOKEN, "Failed to create directory '" + dir
                     + "'!");
             return null;
     return dir;

That's it so far. If you have questions, shoot. I'm going to post updates soon.

more ▼

answered Aug 16, 2012 at 02:10 PM

avatar image

1 1

Thanks for the code, but I'm capturing a snap from Unity, so I can't use that code to update the sdcard.

I'm actually using [code] sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); [/code] which doesn't give me any errors. I just downloaded eclipse with the Android plugin, to compile it to a .jar and to use it as JNI... but yet, I have no idea on what I'm doing, so I haven't achieved anything yet.

Aug 20, 2012 at 11:19 AM Miyavi

My code would only be half the solution. You 'just' have to get your image into a Java plugin within your project. I can test how to do that but not before monday or tuesday.

Apr 05, 2013 at 03:10 PM marsbear
(comments are locked)
10|3000 characters needed characters left

Hello Guys,

You should use this wonderful plugin with full support.


more ▼

answered Jun 30, 2014 at 04:05 PM

avatar image

1.8k 19 23 36

(comments are locked)
10|3000 characters needed characters left

Use this code work for me

IEnumerator ScreenshotEncode() {

     yield return new WaitForEndOfFrame();
     texture1 = new Texture2D(Screen.width-(int)Left_P.y, Screen.height, TextureFormat.RGB24, false);
     texture1.ReadPixels(new Rect(0+Left_P.y, 0, Screen.width-Left_P.y, Screen.height), 0, 0);
     for(int i =0 ; i< hiders.Length;i++)
     yield return 0;
       bytes = texture1.EncodeToPNG();

File.WriteAllBytes( "/mnt/sdcard/DCIM/Images/" + "DrawCircuit " +save_Address+".jpg",bytes ); }}

more ▼

answered Jul 29, 2014 at 04:32 PM

avatar image

20 1 5

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here



Answers and Comments



asked: Jan 11, 2012 at 02:23 PM

Seen: 28022 times

Last Updated: Feb 10 at 02:37 PM