2014년 3월 9일 일요일

cocos2dx를 이용한 live wallpaper만들기

cocos2dx 안드로이드 프로젝트의 기본 main activity를 라이브웰 페이퍼 구성을 위해 아래와 같이 WallpaperService로 변경하는 것으로 구현이 가능합니다.
(cocos2d-x 2.x버전에서 테스트)

import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxHelper;
import org.cocos2dx.lib.Cocos2dxHelper.Cocos2dxHelperListener;
import org.cocos2dx.lib.Cocos2dxRenderer;

import android.content.Context;
import android.content.SharedPreferences;
import android.opengl.GLSurfaceView.Renderer;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

public class WallpaperCocos2dxService extends WallpaperService
{

static
{
System.loadLibrary("cocos2dcpp");
}

@Override
public Engine onCreateEngine()
{
        return new Cocos2dxWallpaperEngine();
}

public class Cocos2dxWallpaperEngine extends Engine implements Cocos2dxHelperListener,
SharedPreferences.OnSharedPreferenceChangeListener
{

protected class WallpaperCocos2dxGLSurfaceView extends Cocos2dxGLSurfaceView 
{
            WallpaperCocos2dxGLSurfaceView(Context context) 
            {
                super(context);
            }

            @Override
            public SurfaceHolder getHolder() 
            {
                return getSurfaceHolder();
            }

            public void onDestroy() 
            {
                super.onDetachedFromWindow();
            }
}

protected class WallpaperCocos2dxRenderer extends Cocos2dxRenderer
{
// prevent the cocos2dxRenderer from calling nativeInit
@Override
public void onSurfaceCreated(final GL10 pGL10, final EGLConfig pEGLConfig)
{
}

@Override
public void onSurfaceChanged(final GL10 pGL10, final int pWidth, final int pHeight)
{
setScreenWidthAndHeight(pWidth, pHeight);
super.onSurfaceCreated(null, null);
}

}

private WallpaperCocos2dxGLSurfaceView m_WallpaperCocos2dxGLSurfaceView;
@Override
public void onCreate(SurfaceHolder surfaceHolder)
{
super.onCreate(surfaceHolder);
//setTouchEventsEnabled(true);
            m_WallpaperCocos2dxGLSurfaceView = new WallpaperCocos2dxGLSurfaceView(WallpaperCocos2dxService.this);
            m_WallpaperCocos2dxGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
            
            //mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
            
            setRenderer(getNewRenderer());
            Cocos2dxHelper.init(WallpaperCocos2dxService.this, this);
}

@Override
public void onVisibilityChanged(boolean visible)
{
            super.onVisibilityChanged(visible);
            if (visible) 
            {
                Cocos2dxHelper.onResume();
                m_WallpaperCocos2dxGLSurfaceView.onResume();
            } 
            else 
            {
                Cocos2dxHelper.onPause();
                m_WallpaperCocos2dxGLSurfaceView.onPause();            
            }
}

@Override
public void onDestroy()
{
            super.onDestroy();

            Cocos2dxHelper.end();

            m_WallpaperCocos2dxGLSurfaceView.onDestroy();
}

protected void setRenderer(Renderer renderer) 
{
            m_WallpaperCocos2dxGLSurfaceView.setCocos2dxRenderer((Cocos2dxRenderer) renderer);
}
   
Renderer getNewRenderer()
{
            Cocos2dxRenderer renderer = new WallpaperCocos2dxRenderer();
            return renderer;
}

@Override
public void showDialog(String pTitle, String pMessage)
{
// TODO Auto-generated method stub
}

@Override
public void showEditTextDialog(String pTitle, String pMessage, int pInputMode, int pInputFlag, int pReturnType, int pMaxLength)
{
}

@Override
public void runOnGLThread(Runnable pRunnable)
{
m_WallpaperCocos2dxGLSurfaceView.queueEvent(pRunnable);
}

@Override
public void onTouchEvent(MotionEvent event)
{
            m_WallpaperCocos2dxGLSurfaceView.onTouchEvent(event);
}

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String sKey)
{

}
}

}

2014년 1월 25일 토요일

android ADB에서 미디어 스캐너 구동시키기..

adb shell에 들어가서..

am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///mnt/sdcard



2013년 12월 14일 토요일

[ios] AVAudioSessions이 active상태인지 확인..


아래처럼 썻었으나.. ios7.0부터 deprecated되버렸다..
7.x버전 이상에서 값이 넘어오지 않음.

UInt32 otherAudioIsPlaying = 0;
UInt32 propertySize = sizeof (otherAudioIsPlaying);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &otherAudioIsPlaying);

if(kAudioSessionNoError == status)
{
    NSLog(@"%u", (unsigned int)otherAudioIsPlaying);

}


ios 6.0이상부터 아래처럼 사용가능 함.

BOOL bOtherPlaying = [[AVAudioSession sharedInstance] isOtherAudioPlaying];

android.mk의 LOCAL_SRC_FILES에 wildcard 사용하기.

android.mk에서 LOCAL_SRC_FILES에 일일이 소스 파일을 적어 넣기 귀찮을 수 있다.
와일드 카드가 적용 가능하다는거..


android.mk파일안에 아래와 같이 ppp패스안에  5개의 파일이 들어가 있고
그 5개의 파일을 모드 컴파일 하려 한다면. 아래와 같이 할 것임..

LOCAL_SRC_FILES := $(LOCAL_PATH)/ppp/a1.c \
$(LOCAL_PATH)/ppp/a2.c \
$(LOCAL_PATH)/ppp/a3.c \
$(LOCAL_PATH)/ppp/a4.c \
$(LOCAL_PATH)/ppp/a5.c

아래와 같이 와일드 카드로 바꿔 처리할 수 있다.

PPP_C_FILE_LIST := $(wildcard $(LOCAL_PATH)/ppp/*.c)
LOCAL_SRC_FILES := $(PPP_C_FILE_LIST:$(LOCAL_PATH)/%=%) 

직접 만든 소스라면 사용할일이 별로 없을듯 하지만. 대량(?)으로 가져다 붙이는 경우라면
나름 편할지도..

android Accessing Private Methods

안드로이드의 Private메소드에 접근하는 방법..

package package1;


public class ABC {
    
ABC(){
        System.out.println("constructor");
    }
}



위 같은 코드가 있을때 아래와 같이 접근 가능하단다..


Class<?> c = Class.forName("package1.ABC");//full package name

Constructor<?> constructor = c.getDeclaredConstructor();
constructor.setAccessible(true);
Object o = constructor.newInstance(null);


내부클래스를 생성할 경우는.. 이렇게 접근하면 된단다.
Class<?> clazz = Class.forName("package1.Outer$Inner");



Private Method에 접근하는 방법도 있다.
아래와 같은 클래스가 있는데....

public class ABC {

  private String string = null;

  public ABC(String string) {
    this.string = string;
  }

  private String getString(){
    return this.string;
  }
}


getString함수에 접근해서 실행하고자 한다면~~
아래를 참고하자~

ABC abc = new ABC("The Private Value");

Method abcMethod = ABC.class.getDeclaredMethod("getString", null);

abcMethod.setAccessible(true);

String value = (String)abcMethod.invoke(abc, null);
    
System.out.println("value = " + value);





Screen Dim WakeLock Deprecated as of API 17

기본 코드..
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, getPackageName());



대신, 아래처럼..
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

C++컴파일 경우 -Wreorder 의미

컴파일 옵션을 -Wall하면 간혹 나타나는 오류임.
생성자의 초기화 순서는 헤더에서 선언된 순서와 일치하여야 한다는 의미임.
생성자에서 초기화 할때 상수가 아닌 변수로 초기화를 해버리면 그 순서때문에
초기값이 꼬일 수 있다는 거임..

struct A {
    int i;    int j;
    A(): j (0), i (1) // here
    {
    }
};