http://developers.facebook.com/docs/guides/mobile/#android

FaceBook사에서 Guide를 했는데도 불구하고,

07-29 10:11:50.140: DEBUG/Facebook-authorize(11292): Login failed: invalid_key


 위와 같은 error가 발생하며, Login Page로 가지 않는 문제가 있었다. 
 
이래저래 서치를 해본 결과
Android Hash Key를 생성하는데서 문제가 있었다. 
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore 
| openssl sha1 -binary
| openssl base64

http://developer.android.com/guide/publishing/app-signing.html#debugmode

Android 개발자 사이트를 보면, debugmode에서의 app-sigining에 대한 내용이 있다.

Eclipse에서 applicatoin을 debug로 signing할때, "android"란 password를 통해서 생성sign하기때문에, keytool에서도 동일 password를 써줘야 한다.




GOAL 
  • ListActivity 에서 ContextMenu를 띄운다.
  • ContextMenuItem을 선택하여 특정 Position의 ListViewItem에 대한 작업을 수행한다.
Try 1.

ListView를 ContextMenu에 등록하여, LongClick Event발생시 ContextMenu를 띄우게 한다.registerForContextMenu(getListView());  

Result : Failed

이방법은 LongClick을 받은 Item Position을 알아낼 방법이 없다.
( 아시는 분 손좀? ^^ )

Try 2.


ListView setOnItemLongClickEventListener() 에서, 
openContextMenu(view) 를 통해서 ContextMenu를 Open 하고, 그 View를 이용해 Position을 가져 온다. 

Result : Failed

openContextMenu의 파라미터가 되기 위해서는 registerContextMenu를 통해서 registering을 해야 하는데,
Adapter에서 View를 만들때 register를 한다고 해도, unregister를 해야 하는 시점이 불분명하고,
비직관적이다. 

Try 3.
 

registerForContextMenu(getListViewI()) 를 통해 ListView의 ContextMenu를 Open
getListView().setOnItemLongClickListener를 등록하여, Last Long Clicked Position을 저장
ContextMenuItemSelected가 호출 될때 저장된 Position을 사용하여 Task 수행

Result : Success


그래도 뭔가 찜찜하다. 뭔가 좋은 방법이 있을것 같은데.. 아시는 분 없나요? ㅎㅎ



 
Android File I/O를 살펴본 이유는 POJO 를 저장하기 위해서다. 

사실 SharedPreference를 통해서 POJO를 저장할 수 있길 기대 했지만, SharedPreference는 Java Object를 저장할 수 없게 되어 있다.

그래서 결국 POJO를 Serialize 해서, File로 떨구기로 결정했기에, Android File I/O에 대해서 살펴 보기로 하였다. 

Android에서 File I/O의 Target Directory는 두가지일수 있다. 
하나는 Internal Storage이고, 다른 하나는 External Stroage(SD Card)이다. 
POJO를 저장하는 건 보통 매우 작은 단위의 Data이기 때문에, Internal Storage로 결정했다.

File I/O 역시, Context Class를 통해서 해결한다. 
Context Class를 살펴 보면 openFileInput/openFileOutput이 있다. 

abstract FileInputStream openFileInput(String name)
Open a private file associated with this Context's application package for reading.
abstract FileOutputStream openFileOutput(String name, int mode)
Open a private file associated with this Context's application package for writing.

보통 Java Application 에서 FileInputStream을 직접 사용하는것과 다리 
Context의 openFileInput Method를 통해서 internal Storage에서 해당 App의 SandBox Directory로 부터 File Stream을 열수 있다. 

그외에 FileXXXXStream을 사용하는 방법은 일반 Java Programming과 동일 함으로 생략.

여기서 한가지 더 필요 했던게, 만든 파일을 어떻게 지울것인가 이다. 

지우는 Method도 Context Class에 있다. 

abstract boolean deleteFile(String name)
Delete the given private file associated with this Context's application package.
뭐 역시나 별로 어려운건 없다 ㅎ

Android Manifest.xml은 Android 앱의 "시작과 끝"이다.
Android Manifest를 잘 들여 다 보면, 이 앱이 어떤 하드웨어를 사용하고, 어떤 기능등을 제공하는지 대략적으로 알 수 있다.

AndroidManifest.xml을 볼때 가장 먼저 보는것이 android-permission 부분이다.

DeskClock에서 사용하고 있는 Permission List는 아래와 같다 

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

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

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

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

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

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

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


해당 설정들은 http://developer.android.com/reference/android/Manifest.permission.html 에서 상세 정보를 볼수 있따.

특히한것만 한번 살펴 보면,

WRITE_SETTING - Android Device의 System Setting을 Read/Write할 수 있는 권한  
DISABLE_KEYGUARD - KEYGUARD를 Disable시키는 건데, KeyGuard란 화면 Lock됐을때의 화면이다.
READ_PHONE_STATE - Phone 번호 정보등 폰에 관련된 정보를 얻기 위한 권한 

Activity 들은 UI 단의 Activity 이기 때문에, 제처두고, 

등록되어 있는 Service, Provider, Receiver쪽을 잠깐 살펴보자..

<provider android:name="AlarmProvider" android:authorities="com.android.deskclock" />


이부분은 해당 App.을 "Content Provider"로 사용하겠다는 선언이다.
android:authorities는 Content Provider의 identification 이라고 생각하면 된다.
자세한 정보는 에서 http://developer.android.com/guide/topics/manifest/provider-element.html 확인할 수 있다.


 <receiver android:name="AlarmReceiver">

            <intent-filter>

               <action android:name="com.android.deskclock.ALARM_ALERT" />

               <action android:name="alarm_killed" />

               <action android:name="cancel_snooze" />

            </intent-filter>

 </receiver>

 <service android:name="AlarmKlaxon">

            <intent-filter>

                <action android:name="com.android.deskclock.ALARM_ALERT" />

            </intent-filter>

 </service>


위와 같이 service/receiver 선언 부분이 몇가지 있는데, 
service 는 Android에서 얘기하는 "BroadCast" 를 발생시키는 녀석이고,
receiver는 "BroadCast"를 받아서 처리 하는 녀석이다.

위의 코드를 보면, DeskClock에서는 Alram을 발생시키고, 그리고 자기가 직접 처리 할수 있게 설정되어 있다.
그외에도 몇가지 Receiver들이 선언 되어 있는데,
BOOTING/TIME_SET/TIMEZONE_CHANGED/등등의 BROADCAST를 처리 할 수 있게 
Receiver들이 선언 되어 있다. 

단순한 것이지만, service를 등록하여 alram을 broadcast하고, receiver를 등록하여 alram을 사용자에게 알려주는 기능을 한다는 것을 
AndroidManifest.XML을 보면서 파악할 수 있었다.

이 Manifest 설정을 보면서 소스 코드를 파악해보도록 하자.


DeskClock ? Google사에서 오픈 소스로 여는 시계 어플리케이션이다.


Android 공부도 할겸해서, 분석해보기로 한 어플리케이션! 

Project URL  : http://android.git.kernel.org/?p=platform/packages/apps/DeskClock.git 

이 소스 분석을 통해 기대 하고 있는 부분은, Alaram Service를 위한 Service Provider 구현.
Alaram을 울리기 위한, 진동/사운드 등등 이다.

Project Page 에서 볼 수 있듯이, 소스 코드는 git 를 통해서 다운로드 받는다.

> git clone git://android.git.kernel.org/platform/packages/apps/DeskClock.git



위와 같이 다운로드 받아 진다.

Google에서 공개 하는 Source Code 는 Android Sample역시, Eclipse 에서 import 하도록 되어 있지 않고,
Eclipse의 "Create Project from exising Source"를 통해서 Eclipse에서 Project를 열도록 되어 있다.


적당한 이름을 써주고, Buid Target을 각자의 환경에 맞게 설정하고, 

Run as "Android Applicaton" 으로 실행하면,

프로젝트 실행이 완료 된것이다.


+ Recent posts