[안드로이드 공부]/알림

[FLAG_UPDATE_CURRENT의 비밀]Permission Denial: broadcasting Intent is not exported from uid

코코모아 2016. 1. 26. 11:07

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 


같은 어플리케이션 내에서 브로드캐스트를 주고 받는데 외부에서 접근하려고 한다는 에러가 뜬다. 참으로 골치 아픈 에러다....

W/BroadcastQueue: Permission Denial: broadcasting Intent  act=com.comostudio.xxx flg=0x10000010 cmp=com.comostudio.xxx/.receiver.yyy } bnds=[556,596][768,692] from com.comostudio.xxx (pid=-1, uid=10000) is not exported from uid 10050 due to receiver com.comostudio.xxx/.receiver.yyy

아무리 인터넷을... 구글링을 해봐도 딱히 맞는 답이 없다.

1. 물론 exported = true로 해주면 바로 위 에러는 사라지고 브로드 캐스트를 받을 수 있게 된다. 하지만, 그게 답이 아니지 않는가? 다른 어플리케이션이 접근할 수 있도록 대문을 활짝 열어 놓는 셈인데.... 이렇게 해결 하라고 해서 좋다고 하는 사람들이 많았다.... 보안 문제는 반드시 집고 넣어가야지 그냥 되게만 해서는 안된다..

2. 노티피케이션에 펜딩인텐트를 등록하고 지우고를 반복하면서 써보라고 하는데.... 이것도 말이 안된다. 물론 getBroadcast가 아니라 getActivity의 경우 먹히기는 한다. 하지만, 이게 근본 해결책은 아니다.

3. manifest에 액티비티등의 이름을 두 개를 사용해서 이런 일이 벌어 질 수도 있다고 한다. 그러나... 이것도 아니다.

4. getPackageManger를 사용해서 getLaunchIntentForPackage를 사용해서 Intent를 사용하라고 한다. 어차피 같은 패키지 내인데 이것이 또 한 무슨 소용이랴.

이 뿐만 아니라 정말 다양한 해결 책이 많이 제시되고 있다. 하지만 정확한 내용을 알아야 한다.

에러내용을 보면 같은 어플내이지만 pid가 다르다. 왜 그럴까?

답)) FLAG_UPDATE_CURRENT 요놈이 문제아다!
노티를 갱신하거나 새로 만들 때 기존 인텐트를 재활용 하겠다는 의도인데.... 동적으로 돌아가고 있는 코드에서는 Pid가 달라질 수 있다. 즉, 앱 입장에서는 '너 우리편 아니잖아? 왜 접근하려고 해?' 라고 충분히 말할 수 있는 것이다. 즉, 아무리 인텐트가 달라질 것이 없다고 하더라도 무턱태고 FLAG_UPDATE_CURRENT 요놈을 쓰면 안된다는 것이다!

==> FLAG_CANCEL_CURRENT 이놈을 사용해서 기존 것을 지우고 새롭게 만들어야 현재 나의 앱과 정상적인 통신을 할 수 있게 되는 것이다...

인터넷 그 어디에도 나오지 않았던 답이다.... 
물론, 내가 못 찾았거나 실력이 부족해서 아직도 잘못 이해 하고 있을 수도 있다.

그런데 웃긴 것은...
롤리팝 버전에서는 위와 같은 에러가 나지 않는 다는 것이다....
당연히 위와 같은 처리를 하지 않아도 되도록 좋아진 것이겠지만.... 
참으로.... 웃긴다....


어쨌든...

exported = true와 같이 보안 문제를 달고 다니는 땜빵 해결은 절대 하지 말자.

모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.