전체 글 328

[안드로이드스튜디오] 구글 플레이서비스 에러 (애드몹 등)

얼마전 안드로이드 스튜디오 1.3.2 업그레이드가 있었다. 이후 예전 처럼 애드몹을 넣으려고 했으나 처음 보는 에러와 마주해버렸다. 난감하다. 똑같은 소스인데 에러가 나니.... ignoring unknown package filter 'extra-google-m2repository'Warning 아무리 태양계의 고수들에게 검색 질의를 해봐도... 'SDK 버전이 문제다...' 이런 내용 밖에 찾아 볼 수 없었다. 그러나, 답은 태양계 너머? 명왕성에 있었다. dependencies { compile 'com.google.android:gms:play-services:6.+' } 예전 버전에서는 전혀 문제가 없었지만, 이번 버전의 안드로이드 스튜디오에서는 맨 위의 에러가 발생했다. dependencies..

FAILED BINDER TRANSACTION, TransactionTooLargeException

Preference를 overide 한 경우 OncreateView를 사용하여 새롭게 만들어 준다. 하지만, 이미지가 PreferenceScreen 자리에 들어가게 된다면 고려해야 할 것이 있다. UI에서 매번 다른 동작이 발생 할 때마다(다이얼로그 열리고 닫히는 등) 이 OnCreateView가 불려지면서 안드로이드 내부를 들쑤시고 다닐 수 있다. @Override protected View onCreateView( ViewGroup parent ) { super.onCreateView(parent); mLayoutInFlater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(mView == nu..

스레드, 타이머, 핸들러 그리고 루퍼

일정, 특정 시간 후에 어떤 작업을 해야 할 경우 아래와 같이 타이머를 쓸 수 있다. 하지만 이렇게 사용할 경우 TimerTask is scheduled already 에러를 만나 앱을 죽일 수 있다. public void stopTimer() { mTask = new TimerTask() { @Override public void run() { mTimer = new Timer(); ....... }; mTimer = new Timer(); if(mTimer != null) { mTimer.schedule(mTask, 10000); ....} 이 경우에는 아래와 같은 방법으로 에러를 피할 수 있다. public StropTimerTask stopTimerTask; public void reSchedul..

스레드(Thread) 대신 AsyncTask(비동기 태스크)를 쓰자!

UI 가 있는 곳에서 스레드 작업을 조금 길게 하면 화면에 버벅거리면서 아예 멈추는 경우도 발생한다. 하지만 스레드 대신 AsyncTask를 사용하면 이런 현상을 말끔히 해결해준다. class MainForReadyInitAsyncTask extends AsyncTask { @Override protected void onPostExecute(Void result) { // 작업이 완료 된 후 할일 super.onPostExecute(result); } @Override protected void onPreExecute() { // 작업을 시작하기 전 할일 super.onPreExecute(); } @Override protected Void doInBackground(Void... params) { /..

Service에서 SharedPreference 사용하기(context와 getApplicationContext차이)

기본적으로 SharedPreferences pref = getContext().getSharedPreferences(key, Context.MODE_PRIVATE); 위와 같은 코드를 사용하면 SharedPreference를 사용하여 앱에서 필요한 부분을 저장하고 불러올 수 있다. 하지만, Service(onReceive 등)와 같은 곳에서는 아래와 같이 getApplicationContext를 사용하여야 sharedPreference를 불러올 수 있다. 만약 위처럼 getContext()를 사용하게 되면 아무것도 얻을 수 없다. mContext.getApplicationContext().getSharedPreferences(key, Context.MODE_PRIVATE); getContext, cont..

서비스가 죽어도 자동으로 다시 실행하기

앱에 서비스를 등록해서 사용하고 있는데, 이러저러한 이유로 갑자기 앱이 죽어버리거나 서비스가 종료되면 정말 난감하다. 이럴 때는 @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, this.START_STICKY, startId); } 위와 같이 onStartCommand를 사용하여 startService를 하도록 하며, START_STICKY 플래그를 쓰게 하면 죽어도 다시 살아나는 좀비 같은 존재가 된다.

안드로이드 TTS 중복 읽기 방지 (2개 이상의 앱)

아이스크림 샌드위치 버전까지는 안드로이드에서 TTS를 사용할 때 setOnUtteranceCompletedListener를 사용했으나, 이후 버전 부터는 setOnUtteranceProgressListener를 사용해서 Speaking의 시작과 끝에 대응할 수 있다. 또한, HashMap을 사용하도록 한 것도 큰 변화의 특징이다. 1개의 앱에서만 TTS를 사용한다면 문제가 없지만, 만약 2개 이상의 앱에 TTS를 사용할 경우엔 중복 문제가 발생하게된다. 즉, 1번 앱에서 '동해물입니다.' 라고 끝나야하는데, 2번 앱에서 '백두산인가요'라고 입력 되었던 문구가 함께 울리게 되는 것이다. (2번 앱은 실행 후 꺼버렸음에도 불구하고) 이런 문제를 해결 하기 위해서 아래와 같은 조치가 필요하다. speak 할 ..

반응형