am start 쓰면됨..


adb shell am start -a (action) -d (data uri) -t (mimetype) -n (component : packagename/activity)

ex) adb shell am start -a android.intent.action.VIEW -d http://www.google.com


usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]

               [--R COUNT] [-S] [--opengl-trace]

               [--user <USER_ID> | current] <INTENT>


am start: start an Activity.  Options are:

    -D: enable debugging

    -W: wait for launch to complete

    --start-profiler <FILE>: start profiler and send results to <FILE>

    -P <FILE>: like above, but profiling stops when app goes idle

    -R: repeat the activity launch <COUNT> times.  Prior to each repeat,

        the top activity will be finished.

    -S: force stop the target app before starting the activity

    --opengl-trace: enable tracing of OpenGL functions

    --user <USER_ID> | current: Specify which user to run as; if not

        specified then run as the current user.


<INTENT> specifications include these flags and arguments:

    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]

   [-c <CATEGORY> [-c <CATEGORY>] ...]

    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]

    [--esn <EXTRA_KEY> ...]

    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]

    [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]

    [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]

    [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]

    [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]

    [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]

    [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]

    [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]

    [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]

    [-n <COMPONENT>] [-f <FLAGS>]

    [--grant-read-uri-permission] [--grant-write-uri-permission]

    [--debug-log-resolution] [--exclude-stopped-packages]

    [--include-stopped-packages]

    [--activity-brought-to-front] [--activity-clear-top]

    [--activity-clear-when-task-reset] [--activity-exclude-from-recents]

    [--activity-launched-from-history] [--activity-multiple-task]

    [--activity-no-animation] [--activity-no-history]

    [--activity-no-user-action] [--activity-previous-is-top]

    [--activity-reorder-to-front] [--activity-reset-task-if-needed]

    [--activity-single-top] [--activity-clear-task]

    [--activity-task-on-home]

    [--receiver-registered-only] [--receiver-replace-pending]

    [--selector]

    [<URI> | <PACKAGE> | <COMPONENT>]



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스
TAG android

대부분의 모바일 앱, 웹에서

authentication (인증, 넌 누구냐) / authorization (허가, 권한 부여) 과정을 sns 계정을 통해 많이 한다 


새로운 서비스에 가입하려면 메일쓰고 이름쓰고 또 해야 하는데

어차피 다 똑같은 정보이고 또 쓰기 귀찮으니까 이미 가입한 서비스의 정보를 가져가 쓸게~ 하는거다..


facebook, twitter, google (plus) 가 대부분이고 OAuth 방식으로 하고 있다


뭐.. 이건 그렇다 치고


google 이 말이지..

그냥 google 계정이 있고 google plus 계정이 있다


google계정을 가진 사람이 google plus 를 사용하지 않을 수도 있는데

google은 google plus 계정을 사용하도록 유도(?) 하고 있고

개발자 사이트에도 google plus login으로 설명을 하고 있다.


하지만 그냥 google 로그인과 google plus 로그인은 다르지 않남!!??


일단 사용자가 google 계정을 가지고 있고 google plus 도 활성화 해둔 상태를 가정했을때


scope을 아래꺼만 쓰면

https://www.googleapis.com/auth/userinfo.profile


아래와 같이 상단에 Google 이라고 적혀있는것을 볼수있고

허가요청도 basic information 에 대해서만 하고 있다





scope 을 아래 것으로 쓰면

https://www.googleapis.com/auth/plus.login


상단에 Google + 라고 적혀있는것을 알수있고

circle 어쩌고 하면서 google + 관련 기능에 대한 권한을 요청하고 있는것을 볼수 있다.



위 두가지 상황은 나머지 소스는 모두 동일하고

scope만 다르게 설정한경우이다.


Google plus login할거면 PlusClient 클래스를 사용하면 더 간단하게 할수 있다. 


그럼

google 계정은 있는데 google plus 에는 가입을 안하는 경우 어떻게 동작을 할까?

이런경우는 한번더 물어보더라 -ㅅ-!




그리고 웹에 가서 google plus 에 가입하여 프로필에 보면

아래와 같이 google+ 로그인을 사용한 앱에 똵 등록이 되어있다!





즉... 주절주절 말이 많았는데..


내맘대로 결론은

1. 그냥 google 계정만 있으면 google plus에 가입했던 안했던 client 에서 google plus login이 가능..

2. google login / google plus login 은 그냥 범위가 다름

3. 어차피 일반 사용자들은 뭐가뭔지 모름

4. 걍 google 이 원하는대로 google plus login 써주자





저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스
TAG android

/system/framework/framework-res.apk


apktool 을 이용해서 풀면

리소스들이 똵!!



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스

Fragment에 setRetainInstance(true) 를 설정하면 

onSaveInstanceState(Bundle) 에 설정해준것을 사용하지 않는다 

onActivityCreaded(Bundle) 에서 항상 null을 리턴함


http://stackoverflow.com/questions/9405577/why-isnt-my-fragments-onsaveinstancestate-being-called?answertab=active#tab-top



setRetainInstance(false) 일때 회전시킨경우 

-객체 새로 생성됨

onCreate

onCreateView

onActivityCreated

호출됨


setRetainInstance(true) 일때 회전시킨경우

- 객체 유지함, 따라서 모든 필드값 유지됨

onCreateView

onActivityCreated 

호출됨

- view는 그래도 새로 생성됨



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스

Android - Tasks and Back Stack (1) 에 이어 그다음 내용부터 

http://developer.android.com/guide/components/tasks-and-back-stack.html#ManagingTasks


역시나 내맘대로 정리 보는사람 음스므로 음슴체 


<Managing Tasks>


- 이전에 설명했던 android의 task, back stack관리는 대부분의 app에 잘 동작함

- 개발자가 activity들이 back stack에 어떻게 존재하는지 task랑 어떤 연관을 가지고 동작하는지 같은 것에 대해 고민하지 않아도 됨

- 그래도 개발자는 이런 기본적인 동작을 하고 싶지 않을수도 있음 

- 한 activity를 현재 task에 속하게 하지 않고 새로운 task로 시작하게 하고 싶거나

- 이미 생성되어 있는 activity의 instance를 그대로 사용하면서 맨 위로 올리고 싶거나

- task를 떠날때 back stack에서 clear시키고 싶을수 있음

- 이러한 것을 manifest 파일의 <activity> 에서 정의해 줄수 있음


* <activity>에 정의해주는 속성 

- taskAffinity

- launchMode

- allowTaskReparenting

- clearTaskOnLaunch

- alwaysRetainTaskState

- finishOnTaskLaunch


* intent의 flag로 설정해 주는거 (startActivity() 할때)

- FLAG_ACTIVITY_NEW_TASK

- FLAG_ACTIVITY_CLEAR_TOP

- FLAG_ACTIVITY_SINGLE_TOP


<Using the manifest file>

- <activity> 의 속성으로 넣어주는거 하나씩 보겠음

* launchMode

- standard 

   - default임, 앞에서 계속 설명한거와 같은 동작, 새 instance생성해서 task의 top으로 올림

- singleTop 

   - activity가 이미 task의 top에 있으면 새 instance를 생성하지 않고 그 activity의 onNewIntent()를 호출함 

   - top에 없으면 새 instance 생성하여 task의 top으로 올림

   - 예를들면

   - A-B-C-D (D가 top에 있음) 인 task가 있음

   - activity D를 실행하라는 intent가 들어옴

   - activity D의 launchMode가 standard인 경우 activity D의 새 instance를 생성함 따라서 A-B-C-D-D가됨

   - activity D의 launchMode가 singleTop인 경우 activity D는 stack의 top에 있으므로 top에 있는 activity D의 onNewIntent()를 호출함

   - 그래서 stack은 그대로 A-B-C-D 가됨

   - 그런데 activity B를 실행하는 intent가 들어오는 경우

   - activity B의 launchMode가 singleTop 으로 설정되어 있어도 activity B의 새 instance가 생성되고 stack에 추가됨

   - 그래서 stack은 A-B-C-D-B 가됨

- singleTask

   - 시스템은 새 task를 만들고 새로 생성된 activity를 root로 둠 (근데 밑에 그림 보면 root가 아님.. 설명을 위해서인가?)

   - 그런데 다른 task에 activity의 instance가 있으면 새로 instance를 만들지 않고 그 activity의 onNewIntent()를 호출함

   - 그리고 그 activity가 있는 task를 foreground로 가져옴

   - 결국 activity는 instance 1개만 있음

- singleInstance

   - task에 오직 하나의 activity만 가짐

   - 다른 activity들을 task에 두지 않음

   - 그외 singleTask랑 같음


- 밑에 그림으로 singleTask 더 살펴봄

   Figure 4 설명 .

   - Activity Y 가 singleTask로 설정되어있음 

   - Activity 2 가 activity Y를 실행시킴 

   - Activity Y 가 singleTask이므로 이미 있는 activity Y가 속해 있는 task가 foreground로 올라오고 activity Y의 onNewIntent()가 호출됨

     (Activity Y 가 다른 task에없었으면 새로 다른 task에 생성되서 들어가게됨) 


  * (번외) 근데 여기서 activity 2가 activity X를 실행시키면 어떻게 될까??? 

   - activity X는 top이 아닌데 말이쥐

   - 사실 singleTask로 되어있는 activity는 task의 root가 되니까 위 그림과 같이 될수 없는데...어?

   - 직접해볼라니 좀 귀찮아서 일단 구글링 

   - http://stackoverflow.com/questions/6268646/android-question-about-singletask-mode?answertab=active#tab-top 

   - 위 링크에 답변한 사람 dbalaouras 아저씨의 이론대로 설명하면

   - activity X 가 불리면 activity Y는 destroy되고 activity X 가 top으로 옴

   - 위 그림으로 보면 세번째 상태로 바로 간다는 거임 - 그럴거 같음

   - 언젠가 테스트해보겠음.. 귀찮지만...


- 다시 본론으로 

- launchMode 속성은 intent flag값에 의해 overrided 될수 있음 (무시될수 있음)

 * 이부분 테스트해서 정리좀 해야할듯.. 

launchMode설정상태에서 flags넣어 실행하는거 case별로.. 언젠가 -ㅅ-


<Using Intent Flags>

- activity 실행할때 넘겨주는 Intent에 flags를 줄수있음

- FLAG_ACTIVITY_NEW_TASK

   - singleTask와 같음

   - 귀찮지만 다시 설명하면

   - 새로운 task로 activity를 실행시킴

   - 어딘가 activity가 있으면 그 task가 foreground로 나오고 기존의 activity의 onNewIntent()가 호출됨

- FLAG_ACTIVITY_SINGLE_TOP

   - singleTop과 같음

   - activity가 top에 있을 경우만 그 activity의 onNewIntent()가 호출됨, top에 없으면 새로 만듬

- FLAG_ACTIVITY_CLEAR_TOP

   - 실행하려는 activity가 현재 task(current task)에 있으면 새 instance를 생성하지 않고 그 activity위에 있는 activity들을 다 destroy 시키고 실행하려는 activity를 top으로 가져오고 onNewIntent()를 호출함


  *(번외) 그럼 다른 task에 있으면 다르나???? 왜 current task라고 적혀있는거지????? 

   - 이건잠시 보류


   - FLAG_ACTIVITY_CLEAR_TOP flag는 주로 FLAG_ACTIVITY_NEW_TASK랑 같이 쓰임

   - 그러면 기존의 다른 task에 있는 activity를 새 task에 가져올수 있게됨 (이거 해석 다시 해봐야겠다능)

   - 이 플래그로 실행하려는 activity의 launchMode가 standard이면 그 activity도 stack에서 지워지고 새 instance가 생성되어 stack에 들어감

   - 왜냐면 standard는 항상 새로 만들어야 옵션이니까


<Handling affinities>

- affinity는 activity가 어느 task에 속하게 할지 정해줌

- 기본적으로 같은 app의 모든 activity들은 각각의 affinity를 가질수 있음

- 기본적으로 같은 app의 모든 activity들은 같은 task에 속하게됨

- 근데 이 정보를 고칠수 있음

- 다른 app에 있는 activity들이 affinity 를 공유할수 있음

- 그리고 같은 app에 있는 activity들이라도 서로 다른 task에 속할 수 있음

- <activity> 의 taskAffinity 속성값에 정의해줌 
- affinity 동작의 두가지 경우

   * FLAG_ACTIVITY_NEW_TASK flag가 있는 intent로 activity가 실행되는 경우 

      - 기본적으로 새로 생성되는 activity는 startActivity()를 호출한 activity가 속한 task에 속하게 됨

      - 근데 FLAG_ACTIVITY_NEW_TASK flag가 있는 intent로 실행되면 시스템은 새 task에 activity를 포함시킴 (앞에 FLAG_ACTIVITY_NEW_TASK 설명한 그대로임) 

      - 근데 affinity가 정의되어 있으면 같은 affinity를 가진 task를 찾아서 그 task로 들어가게됨 

   * activity가 allowTaskReparenting=true 로 설정되어 있는경우 

      - activity는 시작된 task에서 같은 affinity를 가진 task로 옮겨감

      - 예를들어

      - 여행 app에서 지정된 지역의 날씨를 보여주는 activity가 있는경우 (이 activity에 allowTaskReparenting=true설정)

      - 기본적으로 날씨 activity는 여행 app에 있는 다른 activity들과 같은 affinity를 가짐

      - 여행 app이 아닌 다른 app의 activity에서 날씨 activity를 실행한경우 날씨 activity는 실행시킨 activity의 task에 가게됨

      - 그런데 여행 app이 foreground로 나오면 날씨 activity는 다시 affinty가 같은 여행 app의 task로 돌아감


<Clearing the back stack>

- 사용자가 장시간 task를 떠나 있으면 시스템은 root activity를 제외하고 task의 activity들을 clear시킴

- 사용자가 다시 task로 돌아오면 root activity만 남아있음

- 이러는 이유는 사용자가 오랜 시간이 지난후 돌아왔다는것은 전에 뭘하고 있었는지는 관계없이 다시 새로운 것을 시작하기 위해 온것이기때문

- alwaysRetainTaskState

   - root activity에 true로 설정되어 있으면 task의 오랜 시간지나도 모든 activity를 유지함 

- clearTaskOnLaunch

   - root activity에 true로 설정되어 있으면 사용자가 task를 떠나고 돌아올때마다 task를 clear시킴

   - alwaysRetainTaskState의 반대가됨

   - 사용자가 task에 돌아올때는 항상 초기 상태가 됨

- finishOnTaskLaunch

   - clearTaskOnLaunch 이랑 비슷한데 이건 task 전체에 해당하는게 아니라 하나의 activity에만 해당됨

   - root activity뿐만아니라 어떤 activity이든 사라질수 있게 되는거임

   - true로 설정되어 있으면 activity는 현재 session만을 위해 task에 있게 되는거임 

   - 사용자가 task를 떠났다가 돌아오면 없다능 

 

<Starting a task>

- activity의 intent-filter에 아래와 같이 적어주면 task의 entry point로 설정할수 있음

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

- 위와 같은 intent-filter는 activity 런처에 아이콘과 label로 표현됨

- 사용자는  activity 런처를 통해서 task를 떠나고 task로 돌아오고 할수 있어야 함

- 앞에서 배운 activity launchMode중에 singleTask, singleInstance는 처음 새 task에서 시작됨

- 그래서 이 두 launchMode는 activity가 ACTION_MAIN, CATEGORY_LAUNCHER filter를 가졌을때만 사용해야 함

- 이 filter가 없는 activity A 를 singleTask로 실행시키면 일단 singleTask이므로 새 task로 실행됨

- 그리고 사용자가 홈 버튼을 누름

- activity A가 있는 task는 background로 감 

- 근데 더이상 activity A가 있는 task를 가져올 방법이 없음, 런처가 없으니까

(번외) 근데 이건 activity가 어떻게 런치되는가에 따르니까.. 런처 말고는 실행할 방법이 없는 activity에만 해당된다고 생각

- 사용자가 다시는 activity A 에 돌아오지 못하고 하고 싶은경우에는 finishOnTaskLaunch를 true로 설정하면됨


------------------------------------------------------------------

음 근데 최근엔 recent menu도 있고 한데..

거기에 대한 언급은 하나도 없네 어?

너무 이 기술문서만 믿어도 안될듯 하는 주관적인 내생각 ㅋ



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스
TAG android

http://developer.android.com/guide/components/tasks-and-back-stack.html


위 내용을 내맘대로 정리

보는사람 음스므로 음슴체


<Tasks and Back Stack>


- application은 여러개의 activity를 가짐 

- activity는 다른 app의 activity를 실행시킬수 있음

- 어떤 하나의 job을 수행했을때 사용자와 상호작용하는 activity들의 모임 -> task

- 이 activity들은 back stack이라 불리는 stack에 오픈된 순서대로 배열됨

- home 화면은 대부분의 task의 start 지점이 됨

- 사용자가 app런처 아이콘 또는 홈화면의 shortcut을 클릭해서 실행하면 그 app의 task가 앞으로 나오게 됨

- app의 task가 최근에 사용된 적이 없으면 새 task가 생성되고 그 app의 main activity가 task의 root가 됨


- 현재 앞에 있는 activity A 가 다른 activity B 를 실행시킴 

- 실행된 activity B는 stack의 top으로 가고 focus를 가지게 됨

- 이전 activity A는 stack에 남아있게 되고 stop됨 

- activity가 stop되면 시스템은 ui 상태를 유지함

- 사용자가 back 버튼을 누르면 stack의 top에 있던 activity B는 pop되고 destroy됨

- 앞에 있던 activity A가 resume되고 ui 상태 복구됨

- task안에 있는 activity들은 결코 재배치 되지 않음

- 오직 stack의 last in, first out의 원칙에 따라 push, pop될뿐임


Figure 1. activity가 back stack에 들어가고 빠지고 하는거 



- 사용자가 계속 back 버튼을 누르면 홈 화면에 갈때까지 stack안에 있는 있는 activity들은 차례로 pop됨

- stack에서 모든 activity가 제거되면 task는 더이상 없는게 됨


- task는 결합된 단위임(뭔소린지 모르겠으니 영어원문 : a cohesive unit)

- 사용자가 다른 새 task를 시작하거나 홈으로 가면 기존에 foreground에 있던 task는 background로 옮겨짐

- background에 있는동안 그 task에 있는 모든 activity들은 당근 stop상태

- back stack은 task들을 온전히 유지시킴

- task는 다른 task가 foreground에 있을 동안 단지 포커스를 잃을뿐


Figure 2. 두개의 task - task B는 foreground 에서 사용자랑 샤바샤바 하고 있고 그동안 task A는 background에서 resume되길 기다릴뿐..


- 사용자가 background에 있는 task를 pick up하면 당연 foreground로 옴

- 예를들어

- 현재 3개의 activity를 가진 task A가 있음

- 사용자가 홈버튼을 누르고 다른 app을 실행시킴

- 시스템은 새로 실행된 app의 새 task B를 시작시킴 

- 다시 홈으로 와서 task A로 실행되어 있는 app을 실행시킴

- 그럼 당근 task A가 foreground로 옴

- 그러니 task A에 있는 3개의 activity는 stack의 top으로 오고 resume됨 (당연 젤 위에 있는 activity만 resume됨)

- 여기서 사용자는 다시 홈으로 가서 task B의 app 을 시작할수 있음 

- 이것이 multi tasking임 


- 여기서 한번더 강조 back stack에 있는 activity들은 재배열 될 수 없음 (즉 중간에 있던 activity가 top으로 온다거나 못함) 

- 사용자가 한 activity를 실행시키면 새 instance가 생성되고 stack의 top으로 들어감

- app의 activity는 여러 시점에서 instance화 될수 있음 (multiple instances)

- 같은 activity가 각각 여러개의 instance로 생성되서 각각 다른 상태로 stack에 쌓일 수 있음

- 그런데 여러 instance로 되게 하기 싫으면 설정 수정하면됨 


Figure 3. 하나의 activity는 여러번 instance화 됨


* activity와 task의 기본 동작 다시 정리 

- activity A가 activity B를 실행시키면 activity A는 stop됨

- 시스템은 stop된 activity A의 상태들(스크롤 포지션이라던가 폼에 입력되어있는 text라던가)을 유지함

- activity B가 앞에 있는 상태에서 사용자가 back버튼을 누르면 activity A가 resume됨

- 사용자가 홈 버튼을 눌러서 task를 빠져나오면 수행되고 있던 activity는 stop되고 task는 background로 감

- 시스템은 task내의 모든 activity들의 상태를 유지함 

- 사용자가 app런처 아이콘 눌러서 다시 실행시키면 그 app의 task는 resume되고 foreground로 옴

- stack의 top에 있던 activity도 resume됨

- 사용자가 back버튼을 누르면 실행되고 있던 activity는 stack에서 pop되고 destroy됨

- 이전의 activity가 resume됨

- activity가 destroy될때는 시스템은 activity의 상태 저장하지 않음

- activity는 다른 task에서 여러번 instance화 될 수 있음 


---------------------------------------------------

Saving Activity State는 넘어감

Managing Tasks랑 나머진 담 포스트에.. 헥헥



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스
TAG android
Convert to Dalvik format failed : Unabled to execute dex : null

위에러를 내고 eclipse가 out of memory 에러를 내기 마련..
메모리 사이즈를 늘려준다 
eclipse.ini 파일에 사이즈 늘려줌..

-Xms256m
-Xmx1024m

늘려줘도 에러나네 어? 얼마나 늘려줘야 에러 안나주겠니?? -_-ㅋ 



저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스
기본적으로 android 에서 dialog 를 만들어 띄우면 다음과 같은 모습니다



여기서 dialog 의 기본 ui 인 title이라던가 하얀 테두리 같은것을 쓰고싶지 않을때 
초간단하게 다음과 같이 하면된다 -_-;;

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));


이건 머..
너무 케간단해서 글로 올리기가 민망하구먼;;

저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스

*그냥 튜토리얼 설명 간단하게 옮겨놓은 수준의 포스팅임;

Google API 를 쓸려면 sdk 에 Google API 가 있는 버전을 써야하고..
maps 쪽 api쓰려면 AndroidManifest.xml 의 <application> element  안에 다음을 써준다

<uses-library android:name="com.google.android.maps" />

그리고.. 머.. MapActivity 상속받고.. MapView쓰고 하면된다..
문제는 MapView를 정의할때 apiKey를 정해 주어야 한다

<com.google.android.maps.MapView
       
android:id="@+id/mapview"
       
android:layout_width="fill_parent"
       
android:layout_height="fill_parent"
       
android:clickable="true"
       
android:apiKey="Your Maps API Key"
/>

apiKey는 얻어와야 하는데 아래 사이트에서 만들어 준다
http://code.google.com/android/maps-api-signup.html

터미널을 띄어서 다음 명령을 친후 나오는 값을 위 사이트에 넣어주면 apiKey를 만들어 주는데
그런 유효환 key를 넣어줘야 MapView에 지도가 나타난다

$ keytool -list -keystore ~/.android/debug.keystore
...
Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98

keytool은 java sdk설치하면 있는거..
debug.keystore 는 대부분 home directory/.android/ 아래에 있다.

이거 무시해서 했다가 지도 안나와서 식겁했네 ㅋㅋㅋ
튜토리얼 문서 잘 읽고 따라합시다 -_- 아놔 영어로 되어있으니 설명은 안읽고 코드부분만 대강 보다보니;;;
저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스

* MediaScannerConnection 이용

private MediaScannerConnectionClient client = new MediaScannerConnectionClient(){
        public void onMediaScannerConnected() {
            mediaScanner.scanFile(path, mimetype);
        }

        public void onScanCompleted(String path, Uri uri) {
mediaScanner.disconnect();
        }
};

MediaScannerConnection mediaScanner = new MediaScannerConnection(context.getApplicationContext(), client);
mediaScanner.connect();

이건 원하는 파일을 scanning 할 수 있다.
그리고 MediaScannerConnection 의 첫번째 인자로 Context가 들어가는데 ApplicationContext를 넣어줘야 connect가 되더라;
이거때문에 삽질;;

기존의 content가 삭제된 경우는 scan한다고 해서 기존의 content가 db에서 제거되지 않기때문에
content uri를 얻어와서 provider를 통해 직접 delete를 호출해 줘야 한다.
(scan한다음 넘어오는 uri 사용, scan 안한다면 where문 잘써서 query 날려~)

* 구찮으니 통째로 Scanning!!

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));

media mount action을 새로 보내버리는 것이다.
그럼 다시 scanning을 하기때문에 파일을 이동시킨경우 삭제된 것 까지 처리가 쉽게 되버린다~
하지만 비효율적이니;


이를 수행하고 나면 아래와 같은 log를 볼수 있다.

D/MediaScannerService(  181): start scanning volume external
D/MediaScanner(  181):     scan time: 111ms
D/MediaScanner(  181): postscan time: 59ms
D/MediaScanner(  181):    total time: 687ms
D/MediaScannerService(  181): done scanning volume external


통째로 scanning하는 하는 방법은 비추이다

kitkat부터는 security가 강화되었는데 Intent.ACTION_MEDIA_MOUNTED 는 system 이 보내는 broadcast이므로 사용자가 보내면 FC가 발생한다.

쓰지맙시다!!


저작자 표시 비영리 변경 금지
신고
Posted by 바나나쥬스