게임 엔진/Unity

[유니티/안드로이드 11] WRITE_EXTERNAL_STORAGE 사용하지 않고 스크린샷 갤러리에 노출 시키기

niamdank 2021. 11. 24. 19:26

※ SaveImageToGallery 함수를 사용하여 이미지를 갤러리에 저장한다.

 

protected enum ImageFormat
{
	JPG,
	PNG
}

protected const string MEDIA_STORE_IMAGE_MEDIA = "android.provider.MediaStore$Images$Media";
protected static AndroidJavaObject m_Activity;

protected static AndroidJavaObject Activity
{
	get
	{
		if (m_Activity == null)
		{
			AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
			m_Activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
		}
		return m_Activity;
	}
}

protected static string SaveImageToGallery(Texture2D tex, string title, string desc)
{
	using (AndroidJavaClass mediaClass = new AndroidJavaClass(MEDIA_STORE_IMAGE_MEDIA))
	{
		using (AndroidJavaObject contentResolver = Activity.Call<AndroidJavaObject>("getContentResolver"))
		{
			AndroidJavaObject image = Texture2DToAndroidBitmap(tex);
			return mediaClass.CallStatic<string>("insertImage", contentResolver, image, title, desc);
		}
	}
}

protected static AndroidJavaObject Texture2DToAndroidBitmap(Texture2D a_Texture, ImageFormat format = ImageFormat.JPG)
{
	byte[] encodedTexture = (format == ImageFormat.JPG ? a_Texture.EncodeToJPG() : a_Texture.EncodeToPNG());
	using (AndroidJavaClass bitmapFactory = new AndroidJavaClass("android.graphics.BitmapFactory"))
	{
		return bitmapFactory.CallStatic<AndroidJavaObject>("decodeByteArray", encodedTexture, 0, encodedTexture.Length);
	}
}

 

※ Deprecated 되었으며 scanFile로 해당 파일을 스캔하는 것을 추천, InsertImage 사용 시 파일이 두 개가 되는 문제가 있음.