Commonlife's Blog

My daily life

Archive for the ‘Android’ 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 보드에 프로그램을 올리면 해결~!!
Advertisements

Written by tocommonlife

2013/08/24 at 01:38

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 , , , ,

2개 이상의, 복수개의 레이아웃을 가진 ListView에서 ViewHolder 사용하기

leave a comment »

ListView를 활용하다 보면 거의 대부분이 두 개이상의 아이템 레이아웃을 활용할 때가 많다.

그럴 때면 ViewHolder를 활용하기가 참 난감하다. 하지만 메모리를 생각하면 ViewHolder를 활용해야 할텐데, 그게 잘 되지 않으니 고민이 깊어진다.

하지만 아래와 같이 활용하면 가능하다.

if (type == LIST_TYPE_01) {
    if (convertView == null) {
        separatorHolder = new SeparatorViewHolder();
        convertView = mInflater.inflate(R.layout.layout_01, null);
        separatorHolder.text = (TextView) convertView.findViewById(R.id.header_name);
        convertView.setTag(separatorHolder);
    } else {
        if (convertView.getTag() instanceof SeparatorViewHolder) {
            separatorHolder = (SeparatorViewHolder) convertView.getTag();
        } else {
            separatorHolder = new SeparatorViewHolder();
            convertView = mInflater.inflate(R.layout.layout_01, null);
            separatorHolder.text = (TextView) convertView.findViewById(R.id.header_name);
            convertView.setTag(separatorHolder);
        }
    }
    // layout 구현
} else {
    if (convertView == null) {
        secondViewHolder = new SecondViewHolder();
        convertView = mInflater.inflate(R.layout.layout_2, null);
        secondViewHolder.frameLayout = (FrameLayout) convertView.findViewById(R.id.frame_layout);
        secondViewHolder.text = (TextView) convertView.findViewById(R.id.text_view);
        secondViewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.check_box);
        convertView.setTag(secondViewHolder);
    } else {
        if (convertView.getTag() instanceof SecondViewHolder) {
            secondViewHolder = (SecondViewHolder) convertView.getTag();
        } else {
            secondViewHolder = new SecondViewHolder();
            convertView = mInflater.inflate(R.layout.layout_2, null);
            secondViewHolder.frameLayout = (FrameLayout) convertView.findViewById(R.id.frame_layout);
            secondViewHolder.text = (TextView) convertView.findViewById(R.id.text_view);
            secondViewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.check_box);
            convertView.setTag(secondViewHolder);
        }
    }
    // layout 구현
}

convertView.getTag()를 호출하기 전에 getTag()에 의해 return되는 객체가 사용하려는 ViewHolder가 맞는 지 체크하고 아닌 경우엔 새롭게 ViewHolder를 만드는 것이다.

Written by tocommonlife

2012/08/03 at 09:16

Android에 게시됨

Tagged with ,