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

뷰에 나오는 화면 저장하기가 안됩니다.

0 추천
스크레치 아트 프로그램을 제작중인데요 기능상 거의 구현이 끝나가는데 아무리 해도 화일저장하기가 안되네요

옵션눌러서 저장하기 누르면 아무동작도 하지 않습니다. 여기저기 검색도 많이 해보고 소스도 많이 바꿔봤는데

저장하기 누르면 그냥 먹통이네요. 심지어 토스트도 동작하지 않습니다.

뭐가 잘못된걸까요?

뷰는 이미지뷰를 상속받고 배경은 그라디언트로 덮어지는 검정색은 이미지로 덮어서 그걸 지워가는 방식입니다.

 

manifest 내용

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 

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

 

저장하기 내용 (Activity 안에 위치)

 

        sv = (ScratchView)findViewById(R.id.scratchView);

 

private void savePicture(){

 

        sv.buildDrawingCache();

        Bitmap saveView = sv.getDrawingCache();

        File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

        if(!dir.exists())

            dir.mkdirs();

        FileOutputStream fos;

        try {

            fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/capture.jpeg");

            saveView.compress(Bitmap.CompressFormat.JPEG, 100, fos);

            Toast.makeText(getApplicationContext(), "저장완료", Toast.LENGTH_SHORT).show();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

        }

 

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

 

Layout xml 화일

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:id="@+id/relative"

    >

    <LinearLayout

        android:id="@+id/main"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="vertical">

 

        <com.arthur.leo.scratchartbook.ScratchView

            android:id="@+id/scratchView"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:layout_gravity="center"

            android:layout_weight="1"

            >

        </com.arthur.leo.scratchartbook.ScratchView>

 

    </LinearLayout>

 

</RelativeLayout>
익명사용자 님이 2016년 10월 6일 질문

1개의 답변

0 추천
토스트가 나오지 않았단건 에러를 try에서 캡쳐 한것인데....

해당 에러로그를 보여주시면 더 빠른 해결이 가능하겠네요~~!
ThisPlus (46,920 포인트) 님이 2016년 10월 6일 답변
에러 로그도 안나요. 아무일도 안일어납니다.
이것저것 수정하다가 지금은 안 넣어놨지만

catch (FileNotFoundException e) {
Log.e("scratch","그림저장오류",e);
            Toast.makeText(this, "저장 실패", Toast.LENGTH_LONG).show();

원래는 이렇게 해 놓았는데 오류 메세지도 팝업되지 않습니다.
그냥 아무일도 안일어나고 로그에는 터치 이벤트만 올라옵니다
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=251880, downTime=251880, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{4229cb50 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=251954, downTime=251880, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{4229cb50 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=256413, downTime=256413, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{4229cb50 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=256495, downTime=256413, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{4229cb50 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=260987, downTime=260987, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{4229cb50 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=261120, downTime=260987, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{4229cb50 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP

로그는 이렇게 찍힙니다...
catch (FileNotFoundException e)
해당 구문에서 캐치 에러를 Exception 전체를 받아 와 보십시오.
catch (Exception  e)  그리고 로그 찍어보세요
에러로그가 나올거에요
지속적인 답변 정말 감사합니다.
try {
            fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/capture.jpeg");
            saveView.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            Toast.makeText(getApplicationContext(), "저장완료", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "저장실패", Toast.LENGTH_SHORT).show();
        }
이렇게 해서 실행을 해도 아래와 같이만 나오네요 토스트도 안뜨구요.

I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=416710, downTime=416710, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{422c0800 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=416810, downTime=416710, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{422c0800 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
위의 로그는 LG폰으로 테스트했을때고 삼성폰으로 하면 아래와 같이 나옵니다

D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
E/ViewRootImpl: sendUserActionEvent() mView == null
D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
E/ViewRootImpl: sendUserActionEvent() mView == null
일단 제가 실행 해보니 FileNotFoundException이 발생을 하네요~!
키켓부터 파일저장 개발 이슈가 있다고 하는데 좀더 알아봐야 할듯 합니다.
전체로그 입니다. 실행한후 메인엑티비티에서 그리기 엑티비티로 넘어가고
조금 그린후에 옵션 불러내서 선굵기 조정한후 저장하기 누른상태 입니다.
역시나 아무런 오류도 없네요 ㅠ_ㅠ

10/07 11:57:17: Launching app
$ adb push /Volumes/DATA/Leo/AndroidStudioProjects/ScratchArtBook/app/build/outputs/apk/app-debug.apk /data/local/tmp/com.arthur.leo.scratchartbook
$ adb shell pm install -r "/data/local/tmp/com.arthur.leo.scratchartbook"
    pkg: /data/local/tmp/com.arthur.leo.scratchartbook
Success


$ adb shell am start -n "com.arthur.leo.scratchartbook/com.arthur.leo.scratchartbook.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Client not ready yet..Waiting for process to come online
Connected to process 7226 on device lge-lg_f180l-LGF180L5dd717c7
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ActivityManager: Timeline: Activity_launch_request id:com.arthur.leo.scratchartbook time:1409928
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
I/ActivityManager: Timeline: Activity_idle id: android.os.BinderProxy@4223fbc8 time:1410130
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=1411166, downTime=1411166, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{422413d8 V.E..... R.....I. 0,0-768,1280}
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=1411322, downTime=1411166, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{422413d8 V.E..... R.....I. 0,0-768,1280}
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=1415387, downTime=1415387, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{422413d8 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=139, metaState=0, flags=0x48, repeatCount=0, eventTime=1415470, downTime=1415387, deviceId=8, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{422413d8 V.E..... R....... 0,0-768,1280}
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_DOWN
I/ViewRootImpl: ViewRoot's Touch Event : ACTION_UP
D/dalvikvm: GC_FOR_ALLOC freed 429K, 24% free 13191K/17320K, paused 22ms, total 22ms
I/ActivityManager: Timeline: Activity_idle id: android.os.BinderProxy@4223fbc8 time:1450223
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
D/dalvikvm: GC_FOR_ALLOC freed 3953K, 39% free 12914K/20912K, paused 17ms, total 17ms
I/ActivityManager: Timeline: Activity_idle id: android.os.BinderProxy@4223fbc8 time:1723742
Application terminated.
File dir = new File(Environment.getExternalStorageDirectory(), "/MyPicture");
                if (!dir.exists())
                    dir.mkdirs();
                FileOutputStream fos;
                try {
                    fos = new FileOutputStream(dir.toString() + "/capture.jpeg");
                    saveView.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                    Toast.makeText(getApplicationContext(), "저장완료", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }

이렇게 하시면 되실거에요~~!
원인은 루트폴더에 직접쓰기가 막혀있네요~~!
폴더 생성후 폴더안에 저장을 하셔야 합니다.
그리고 익셉션은 왜 안찍히는지 모르겠네요~!
분명 파일을 못찾았단 익셉션이 나야 하는데....
실행해보면 저는 잘나오거등요
답변 감사합니다. 알려주신대로 해도 되질 않네요
옵션에서 메소드 호출을 제가 잘못하는건지 그냥 먹통이고
다른 여러가지 방법을 해봐도 안되는것 보면 어딘가 잘못되었다는것 같은데...
번거로우시더라도  다시한번 확인해 주시면 정말 감사하겠습니다.
https://www.dropbox.com/s/2pajxdgusb7ymn6/ScratchArtBook.zip?dl=0

8000자 이상은 쓸수가 없는것 같아서 소스전체를 압축했습니다.
안드로이드 스튜디오 프로젝트 폴더 전체입니다.
메뉴 아이템 값이 중복 대네요
메뉴 아이템 값을 변경해주세요
메뉴아이템 값이라면


        SubMenu subMenu = menu.addSubMenu(0, 0, 0, "선굵기");
        subMenu.add(1, 1, 0, "1");
        subMenu.add(1, 2, 1, "2");
        subMenu.add(1, 3, 2, "3");
        subMenu.add(1, 4, 3, "4");
        subMenu.add(1, 5, 4, "5");
        subMenu.setGroupCheckable(1, true, true);

        menu.add(2, 0, 6, "지우기");
        menu.add(3, 1, 7, "그림저장");

이걸 말씀해주신건가요? 주말에도 계속 찾아봤는데 찾을수가 없어서
저건가 하고 위와같이 변경을 했는데도 결과는 같네요 ㅜㅜ 무반응 입니다.
함수를 사용하실때는 인자들을 확인해주세요~~!
인자중에 itemId를 정하는 인자가 무엇인가요?
지금 현재 소스에서 해당 인자를 찾아서 중복값이 없도록 해주시면 됩니다.
정 모르시겠으면 API문서를 찾아보는 법도 방법입니다.
친절하신 설명 정말 감사합니다. 덕분에 API문서 찾아보고 알게 되었습니다.
그런데 중복값이 있으면 에러가 나야 하는데 에러가 안나는게 이상하네요.
직접 찾아보니 더 좋은 공부가 되네요.

MenuItem    add(int groupId, int itemId, int order, CharSequence title)

이부분으로 가운데 숫자가 중복이 되어있었네요 정말 감사합니다.
...