Commonlife's Blog

My daily life

Archive for the ‘Information’ Category

android : ADK 기본 설정

leave a comment »

간만에 안드로이드로 ADK를 붙여보았는데 작동되지 않는다.

* 필요한 것은
1. 안드로이드폰 : Android Accessory가 가능한 것.
2. ADK Board : 아두이노 Mega 2560
* 기본 설정
2. 안드로이드 앱은 Google APIs로 할 것. (Android 2.3/ 4.0/ 4.1 … 말고)
위의 준비들이 모두 끝나면 안드로이드에는 앱을 설치하고, ADK 보드에는 프로그램을 올리자.
(그리고 꼭 ADK 보드에는 Serial을 이용한 로그를 찍도록 하자.)
* 문제
여기서 터진 문제는 케이블을 연결해도 안드로이드가 ADK 보드를 인식 못하는 것이다.
ADK 보드의 로그를 보니 “OSCOKIRQ failed to assert” 라고 뜬다.
* 문제해결
Arduino/libraries/USB_Host_Shield/Max3421e.cpp 를 수정한다.
boolean MAX3421E::reset()
{
  byte tmp = 0;
  regWr( rUSBCTL, bmCHIPRES );     //Chip reset. This stops the oscillator
  regWr( rUSBCTL, 0x00 );          //Remove the reset
  while(!(regRd( rUSBIRQ ) & bmOSCOKIRQ )) {  //wait until the PLL is stable
    tmp++;                         //timeout after 256 attempts
    if( tmp == 0 ) {
      return( false );
    }
  }
  return( true );
}
위의 부분을 아래와 같이 수정한다.
boolean MAX3421E::reset()
{
  regWr( rUSBCTL, bmCHIPRES );    //Chip reset. This stops the   oscillator
  regWr( rUSBCTL, 0x00 );         //Remove the reset
  while(!(regRd(rUSBIRQ) & bmOSCOKIRQ)) ;
}
그리고 나서 다시 ADK 보드에 프로그램을 올리면 해결~!!

Written by tocommonlife

2013/08/24 at 01:38

Adapter Pattern

leave a comment »

1. 상속을 사용한 Adapter Pattern

 AdapterPattern_01
PrintBanner extends Banner implements Print 로 Banner 클래스를 상속하고, Print 인터페이스를 구현한다.
 
1) 실제 기능 구현은 Banner 클래스에 한다.
2) PrintBanner는 구현된 Banner 클래스를 상속하고, 호출되어 사용될 수 있도록 Print 인터페이스를 구현한다.
3) 사용할 땐 Print 인터페이스의 method들을 호출하여 Banner 클래스의 method들이 작동되게 한다.
 
PrintBanner의 method들을 보면 아래와 같이 Banner클래스의 method를 호출하는 Print 인터페이스 method를 구현한다.
public void printWeak(){
    showWithParen();
}
 
public void printStrong(){
    showWithAster();
}
 
그럼 사용을 할 땐
Print print = new PrintBanner()로 생성한 후 print.printWeak(), print.printStrong()으로 사용한다.
 
 
 
 

2. 위임을 이용한 Adapter Pattern

 
AdapterPattern_02
PrintBanner extends Print 로 Print 클래스를 상속하고, Banner 클래스를 멤버변수로 선언한다.
 
1) 실제 기능 구현은 Banner 클래스에 한다.
2) PrintBanner는 Banner를 멤버변수로 선언한다.
3) PrintBanner의 method들은 Banner 클래스의 method들을 호출한다.
3) 사용할 땐 Print 클래스의 method들을 호출하여 Banner 클래스의 method들이 작동되게 한다.

Written by tocommonlife

2013/07/13 at 23:36

Android : ActionBar 사용하지 않을 때 등장 후 사라지는 문제(깜빡임 문제)

leave a comment »

기존 2.X대에서 부터 개발했었고, 당시 만들었던 코드를 가지고 ActionBar와 Fragment, GCM 등을 적용 시킬거라면 많이 혼란스러웠을 것이다.

이에 대한 나의 경험담 중 ActionBar의 경우이다.

 

ActionBar는 Fragment나 GCM과 다르게 support library로 지원되지 않는다. 3.X 이상에서만 사용가능하고, 이 때문에 2.X에서도 쓸 수 있도록 오픈소스로 나온 것이 Sherlock이다.

 

그런데

1. 2.X ~ 4.X까지 지원하고,

2. ActionBar를 사용하고 싶지 않을 때….

 

새로운 프로젝트를 만들고

1. 코드 상에서 getActionBar().hide();를 호출하면 화면에 ActionBar가 나온 후 사라진다.

2. AndroidManifest.xml에서 theme에 NoActionBar 를 추가하면 에러가 뜬다.

-> 2.X대에서는 ActionBar를 사용할 수 없기에 나오는 에러이다.

 

위에서 처럼 ActionBar가 나왔다 사라지는 것도, 에러도 해결하는 방법은 아래와 같다.

 

AndroidManifest.xml에서 application 태그를 보면

<application
    android:icon =“@drawable/ic_launcher”
    android:label =“@string/app_name”
    android:theme =“@style/AppTheme” >

 

AppTheme 스타일을 가져다 쓴다.

프로젝트 디렉토리에서 style.xml을 다음과 같이 3군데에 있다.

res/values/style.xml

res/values-v11/style.xml

res/values-v14/style.xml

 

그리고 보는 것 처럼 공통과 버전별로 따로 관리가 가능하다.

 

style.xml의 내용은

<style name= “AppBaseTheme” parent = “android:Theme.Light” />
<style name= “AppTheme” parent = “AppBaseTheme” />

처럼 AppBaseTheme을 상속받아 사용하고 해당 AppBaseTheme은 res/values/style.xml, res/values-v11/style.xml과 res/values-v14/style.xml에서 따로 정의하여 사용가능하다.

 

그렇기 때문에 res/values-v11/style.xml, res/values-v14/style.xml에서

<style name = “AppBaseTheme” parent = “android:Theme.Holo.Light.NoActionBar” >

로 선언하면 된다.

Written by tocommonlife

2013/07/07 at 06:14

Android에 게시됨

Tagged with , ,

android : FaceDetector

leave a comment »

FaceDetector : Api Level 1 : http://developer.android.com/reference/android/media/FaceDetector.html

*  Bitmap.Config.RGB_565 으로 decoding 되어야만 가능.

BitmapFactory.Options bitmapLoadingOptions = new BitmapFactory.Options();
bitmapLoadingOptions.inPreferredConfig = Bitmap.Config.RGB_565;
mBitmap = BitmapFactory.decodeFile(imageLocalPath, bitmapLoadingOptions);

// Ready
private int maxfaces = 10;     // 최대로 찾을 얼굴 갯수
FaceDetector myFaceDetector = new FaceDetector(mBitmap.getWidth(), mBitmap.getHeight(), maxfaces); //
FaceDetector.Face detectedFace = new FaceDetector.Face[maxfaces];
PointF faceMidPoint = new PointF();

// Find
int number_of_faces = myFaceDetector.findFaces(mBitmap, detectedFace);     // 여기서 얼굴을 찾음.
if(number_of_faces <= 0) {
} else {
    for(int i=0; i < number_of_faces; i++){
        FaceDetector.Face tempFace = detectedFace[i];
        tempFace.getMidPoint(faceMidPoint);
        int eyes_distance = tempFace.eyesDistance();
    }
}

* detectedFace에 찾은 얼굴들이 저장된다.

Written by tocommonlife

2013/01/29 at 06:59

Android에 게시됨

Tagged with ,

android : Facebook SDK 3.0 연동하기

leave a comment »

= 사전에 필요한 부분 =

– facebook에 앱을 만들고 hash key 등록하기 :

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64

= 기존의 방식 =

– new Facebook()와 Facebook.authorize()

= 바뀐 방식 =

UiLifecycleHelper과 widget.LoginButton 클래스의 이용

1. Session.StatusCallback 변수 선언 후 call 메소드를 @Override 한다.(parameter에 Session 클래스가 있는데 이걸 통해 AccessToken을 가져온다.)

2. LoginButton을 가지고 있는 Activity의 onCreate 메소드에서 UiLifecycleHelper를 1번에서 만든 call 변수를 parameter로 만든다.

3. 해당 activity에 onCreate, onResume, onPause, onDestroy, onActivityResult, onSaveInstanceState를 @Override하여 UiLifecycleHelper.onCreate, UiLifecycleHelper.onResume, UiLifecycleHelper.onPause, UiLifecycleHelper.onDestroy, UiLifecycleHelper.onActivityResult, UiLifecycleHelper.onSaveInstanceState를 호출한다.

@Override

public void onCreate(Bundle savedInstanceState){

    UiLifecycleHelper.onCreate(savedInstanceState);
}

= 바뀐 권한 정책 =

* LoginButton에서는 setReadPermissions 메소드를 통해서 페이스북 접근 권한을 설정할 수 있다.

* The LoginButton can only be associated with either read permissions or publish permissions, but not both. Calling both setReadPermissions and setPublishPermissions on the same instance of LoginButton will result in an exception being thrown unless clearPermissions is called in between. ==> 결국 read 와 publish 둘 다 권한을 줄 수가 없다. 둘 중 하나만 가능.

* 결국 읽기 권한을 먼저 획득 후 쓰기 권한을 요청한다.

http://developers.facebook.com/docs/concepts/login/permissions-login-dialog/

– publish 권한은 필요할 때만 요청하기 위해서 둘을 나눠놓고 6번 이상의 권한을 유저에게 물으면 로그인을 끝까지 수행하지 않는다고 합니다.

Written by tocommonlife

2013/01/23 at 11:16

Android에 게시됨

Tagged with , , , ,

iOS : NSAssert

leave a comment »

자바에서 본다면 try / catch 역할이다. 하지만 다른 점은 특별한 예외처리가 없으면 멈추거나 앱이 종료된다.

사용방식은 NSAssert(조건, 실행);

ex)

int index = 5;

NSAssert(index == 5, @”Stop”);

NSLog(@”Next Step”);

이럴 경우 Next Step 만 찍힌다.

index = 6 일 경우 조건이 false가 되고 Stop이 찍히고 Next Step은 찍히지 않는다.

*** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘Stop’

라고 로그가 뜨고 앱은 멈춘다.

예외처리는 NSAssertionHandler를 통해처리한다.

Written by tocommonlife

2012/10/30 at 03:18

iOS에 게시됨

Tagged with

iOS : iOS6 연락처에서 정보 가져오기

leave a comment »

기존의 앱을 유지 보수 하던 도중 연락처에서 전화번호를 못가져오는 사태가 발생되고 있었다.

찾아보니 문제는 iOS6의 개인 보안 정책 때문이었다.

ABAddressBookRef addressBook;
float thisVersion = [[[UIDevicecurrentDevice] systemVersion] floatValue];

if(thisVersion >= 6.0){
    addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
    __block BOOL accessGranted = NO;
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error){
        accessGranted = granted;
        dispatch_semaphore_signal(sema);
    });
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_release(seam);
} else {
    addressBook = ABAddressBookCreate();
}
  •  __block은 메모리 할당을 stack이 아닌 heap에서 한다.

Written by tocommonlife

2012/10/09 at 01:19

iOS에 게시됨

Tagged with , ,