게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
안드) 오픈CV에서 unable to add window 뜨네요 ㅠㅠ
게시물ID : programmer_11231짧은주소 복사하기
작성자 : 빙티
추천 : 0
조회수 : 446회
댓글수 : 0개
등록시간 : 2015/06/14 05:27:00
옵션
  • 창작글
  • 베스트금지
  • 본인삭제금지
안녕하세요! 반도의 흔한 학생입니다!!!

제가 Opencv를 활용한 서비스를 startService하던 도중
unable to add window token null is not for an application 에러에 부딛혀 버렸습니다.

구글링 한 결과
startService할 때의 Intent의 첫 인자를 MainActivity.this가 아니고 getApplicationContext()로 하면 생기는 에러더라구요
그런데 저는 그 첫 인자를 this(MainActivity.this랑 같은거?)로 하였으므로 문제가 없어야 했으며,
심지어 첫 인텐트 인자를 this로 같게하여 또다른 서비스를 실행시키는것 까지 성공하였습니다....
(혹시 몰라서 두번째 인자를 MainActivity.this, getBaseContext(), getApplicationContext()를 사용했으나 똑같은 오류가 떴습니다)

1
2
3
4
5
private void startWinklick(){
   //startService(new Intent(this, ScreenService.class)); //잘됨
   startService(new Intent(this, FaceService.class)); //opencv
   //unable to add window token null is not for an application android
}
cs

위에 startService는 실행 성공한 서비스이고요, 아래는 에러뜨며 실패한 서비스 입니다...

이렇게 되면 faceService내에서 오류가 있다고밖에 설명이 안되네요..
로그캣에서도 opencv BaseLoaderCallback 어쩌구 하는거보니
opencv를 사용하는 두번째 서비스인 faceService에서 문제가 있나 봅니다

캡처.PNG


맨 아래에 문제의 서비스의 onCreate랑 변수들 전문을 다 올렸는데요...
BaseLoaderCallback이 로그캣에 나와있는데, 저는 이걸 opencv예제에서 본걸 타이핑 한거라
굵은 글씨 두줄 이외엔 바꾼게 없습니다 ㅠㅠ

그리고 제가 생각하는 문제의 코드는 가장 많이 수정한 onCreate()안에 있는거 같습니다..
근데 아래의 onCreate에서 문제가 어디서 터지는지 발견하기 어렵네요 ㅠㅠ
디버깅 모드도 잘 작동을 안하고요 ㅠㅠㅠㅠ


어떻게 해야 하는지 알 수 있을까요????

답변 달아주시면 정말 감사드리겠습니다!!!









1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
public class FaceService extends Service implements CvCameraViewListener2{
    
        private LayoutInflater li;
        private RelativeLayout mPopupView;//항상 보이게할 뷰(nativecam_view.xml의 레이아웃)
        private CameraBridgeViewBase mOpenCvCameraView;//카메라뷰 (NativeCameraView1)
        private WindowManager.LayoutParams mParams; //뷰의 위치 및 크기
        private WindowManager mWindowManager;
        
        private static final String TAG = "OCVSample::Activity";
        private static final Scalar FACE_RECT_COLOR = new Scalar(02550255);
        public static final int JAVA_DETECTOR = 0;
        
        private File mCascadeFile;
        private CascadeClassifier mJavaDetector;
                
        private String[] mDetectorName;
        private float mRelativeFaceSize = 0.5f;
        private int mAbsoluteFaceSize = 0;
        private GlobalSettings global;
        
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
        
        private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
            @Override
            public void onManagerConnected(int status) {
                switch (status) {
                case LoaderCallbackInterface.SUCCESS: {
                    Log.i(TAG, "OpenCV loaded successfully");
     
     
                    try {
                        //==얼굴전면==//
                        InputStream is = getResources().openRawResource(
                                R.raw.lbpcascade_frontalface);
                        File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
                        mCascadeFile = new File(cascadeDir,
                                "lbpcascade_frontalface.xml");
                        FileOutputStream os = new FileOutputStream(mCascadeFile);
     
                        byte[] buffer = new byte[4096];
                        int bytesRead;
                        while ((bytesRead = is.read(buffer)) != -1) {
                            os.write(buffer, 0, bytesRead);
                        }
                        is.close();
                        os.close();
                        //-- end --//
     
                        mJavaDetector = new CascadeClassifier(
                                mCascadeFile.getAbsolutePath());
                        if (mJavaDetector.empty()) {
                            Log.e(TAG, "Failed to load cascade classifier");
                            mJavaDetector = null;
                        } else
                            Log.i(TAG, "Loaded cascade classifier from "
                                    + mCascadeFile.getAbsolutePath());
                        
                        
                        cascadeDir.delete();
     
                    } catch (IOException e) {
                        e.printStackTrace();
                        Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
                    }
                    mOpenCvCameraView.setCameraIndex(1);
                    mOpenCvCameraView.setMaxFrameSize(300200);// TODO : 최대 크기 지정
                    mOpenCvCameraView.enableView();//뷰 활성화
     
                }
                    break;
                default: {
                    super.onManagerConnected(status);
                }
                    break;
                }
            }
        };
        
        public FaceService() {
            mDetectorName = new String[2];
            mDetectorName[JAVA_DETECTOR] = "Java";
     
            Log.i(TAG, "Instantiated new " + this.getClass());
        }
        
        @Override
        public void onCreate() {
            super.onCreate();
            Log.i("TAG""Face Service Started");
            
            li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            
            
            mParams = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,//
                    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                    PixelFormat.TRANSLUCENT);
            //(int w, int h, int _type, int _flags, int _format)
            
            mParams.width = cameraWidth;
            mParams.height = cameraHeight;
            
            mParams.gravity = Gravity.LEFT | Gravity.TOP; //좌표계가 좌상점을 중심으로..
            
            mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
            
            mPopupView = (RelativeLayout) li.inflate(R.layout.nativecam_view, null);
            
            
            
            mOpenCvCameraView = (NativeCameraView) mPopupView.findViewById(R.id.NativeCameraView1);
            mOpenCvCameraView.setCameraIndex(1);
            mOpenCvCameraView.setCvCameraViewListener(this);
            
            
            
            mWindowManager.addView(mPopupView, mParams); //SYSTEM_ALERT_WINDOW permission 필요
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback);
            global = (GlobalSettings) getApplicationContext();//super.onCreate()뒤에 넣자
            
            //TODO global.set등은 처음엔 초기화를 시켜주자
        }
.......................
cs

꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호