모름

목표: 유니티 안드로이드 플랫폼에서 프린트를 사용한다

 

작동방법:

1. https://developer.android.com/training/printing/photos?hl=ko 안드로이드 네이티브 사진 인쇄 방법을 참고하여

 

2. https://developer.android.com/reference/androidx/print/PrintHelper?hl=ko 안드로이드 프린트헬퍼 클래스에 유니티로 접근한다

 

3. 안드로이드 프린트 헬퍼에서 주요 함수는 printBitmap(String jobName, Bitmap bitmap) / setColorMode(int colorMode), setOrientation(int orientation), setScaleMode(int scaleMode) 이다

 

4. 해당 함수를 사용하기 위해 유니티에서 사용할 프린트 헬퍼 aar 플러그인을 "https://maven.google.com/web/index.html" 에서 찾는다. (상세: https://maven.google.com/web/index.html#androidx.print:print:1.0.0) ps. 그리고 나서 유니티 Plugin/Android  폴더에 위치시킨다.

 

5. 이 때 프린터헬퍼의 printBitmap(String jobName, Bitmap bitmap) 함수에서 Bitmab 파싱을 하기 위해서, 안드로이드의 BitmapFactory 클래스를 참조해야한다. https://developer.android.com/reference/android/graphics/BitmapFactory?hl=ko 

 

6. 그리하여 아래 코드처럼 프린트를 호출한다

 

7. 아마 쓰기 읽기 권한이 있어야 할 것이다

 

8. 마지막으로 원하는 프린터를 찾아서 안드로이드 기기와 연결해준다 (이건 알아서 하면됨)

 

public class PrintScript : MonoBehaviour
{
    public Texture2D image;
    public Button printBtn;

    private enum ColorModes { Monochrome = 1, Color = 2 }
    private enum Orientations { Landscape = 1, Portrait = 2 }
    private enum ScaleModes { Fit = 1, Fill = 2 }
    
    private void Awake()
    {
        printBtn.onClick.AddListener(OnClickPrintBtn);
    }

    private void OnClickPrintBtn()
    {
        PrintImage();
    }

    private void PrintImage()
    {
        var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        var printHelper = new AndroidJavaObject("androidx.print.PrintHelper", activity);
        printHelper.Call("setColorMode", (int) ColorModes.Color);
        printHelper.Call("setOrientation", (int) Orientations.Landscape);
        printHelper.Call("setScaleMode", (int) ScaleModes.Fit);
        printHelper.Call("printBitmap", "somePrintJobName", ToAndroidBitmap(image));
    }
    
    private static AndroidJavaObject ToAndroidBitmap(Texture2D tex2D)
    {
        byte[] pngBytes = tex2D.EncodeToPNG();
        return CallStaticOnce("android.graphics.BitmapFactory","decodeByteArray", pngBytes, 0, pngBytes.Length);
    }
    
    private static AndroidJavaObject CallStaticOnce(string className, string methodName, params object[] args)
    {
        using var ajc = new AndroidJavaClass(className);
        return ajc.CallStatic<AndroidJavaObject>(methodName, args);
    }
}

 

 

실행화면

안드로이드에서 호출