마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

java.lang.IllegalStateException의 이유를 알고 싶습니다.

0 추천
public void Binarization(Camera mCamera/*, final SurfaceHolder mHolder*/)
    {
        final Camera finalMCamera = mCamera;
        mCamera.setPreviewCallback(new Camera.PreviewCallback()
        {
            public void onPreviewFrame(byte[] data, Camera camera)
            {
                Camera.Parameters params = finalMCamera.getParameters();

                int w = params.getPreviewSize().width;
                int h = params.getPreviewSize().height;

                int format = params.getPreviewFormat();

                YuvImage image = new YuvImage(data, format, w, h, null);

                ByteArrayOutputStream out = new ByteArrayOutputStream();

                Rect area = new Rect(0, 0, w, h);

                image.compressToJpeg(area, 50, out);
                Bitmap Bit = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());

                for (int i = 0; i < data.length; i++)
                {
                    if (Bit.getPixel(i / Bit.getWidth(), i % Bit.getWidth()) >= 128)
                        Bit.setPixel(i / Bit.getWidth(), i % Bit.getWidth(), 256);

                    else
                    {
                        Bit.setPixel(i / Bit.getWidth(), i % Bit.getWidth(), 1);//134라인
                    }

                    Log.d("Tag", String.valueOf(i));
                }

                try
                {
                    FileOutputStream fos = openFileOutput("test.png", 0);
                    Bit.compress(Bitmap.CompressFormat.PNG, 100, fos);
                    fos.flush();
                    fos.close();

                    Log.d("Tag", "Bin");
                }
                catch (Exception e)
                {
                    Toast.makeText(getApplicationContext(), "file error", Toast.LENGTH_LONG).show();
                    final int d = Log.d("Tag", "error");
                }
            }
        });
    }

===========================

java.lang.IllegalStateException
at android.graphics.Bitmap.setPixel(Bitmap.java:1791)
at com.example.ai.jangtok.MainActivity$1.onPreviewFrame(MainActivity.java:134)
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1183)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7406)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

 

이렇게가 코드와 오류 내용이구요 어디가 134라인인지는 주석으로 적어두었습니다.

또 이 메소드가 실행한 후에 로그를 기록하게끔 해두었는데

Bin, error 아무것도 기록이 안되고 이메소드를 호출한 다음 라인에서 로그가 기록되었습니다.

그러면 저 메소드가 끝까지 실행되지 않은 상태에서 return되었다고 생각합니다.

어떤 이유때문에 이렇게 된건지 설명해주세요 부탁드립니다.
익명사용자 님이 2017년 1월 19일 질문

1개의 답변

0 추천
https://developer.android.com/reference/android/graphics/Bitmap.html#setPixel(int, int, int) 에 나오듯 IllegalStateException  는 "if the bitmap is not mutable"  일 때 발생합니다.

http://stackoverflow.com/questions/4349075/bitmapfactory-decoderesource-returns-a-mutable-bitmap-in-android-2-2-and-an-immu 를 참조하셔서 mutable bitmap으로 변경해서 처리 하세요.
익명사용자 님이 2017년 1월 20일 답변
...