레이블이 android인 게시물을 표시합니다. 모든 게시물 표시
레이블이 android인 게시물을 표시합니다. 모든 게시물 표시

2018년 3월 19일 월요일

Android Studio Gradle 프로젝트 범위에서의 엑스트라 속성 설정

프로젝트 build.gradle 파일에 엑스트라 속성을 추가하기 위해 최상위 뎁스에 ext 블록을 추가하고 키와 값을 입력 합니다.
모듈을 여러개 사용할 경우 유용하게 활용할 수 있습니다.

아래 예시(각종 버전 정보들 기재)

ext {
    compileSdkVersion = 26
    buildToolsVersion = "27.0.3"
    supportLibVersion = "27.0.0"
}


모듈 build.gradle 파일에서 설정된 속성에 엑세스 하려면 다음과 같은 구문을 사용합니다.
rootProject.ext.{property_name}

아래 예시

ext {
    android {
        compileSdkVersion rootProject.ext.compileSdkVersion
        buildToolsVersion rootProject.ext.buildToolsVersion
    }
    dependencies {
        compile 'com.android.support:appcompat-v7:' + rootProject.supportLibVersion
        compile 'com.android.support:cardview-v7:' + rootProject.supportLibVersion
        compile 'com.android.support:recyclerview-v7:' + rootProject.supportLibVersion
        compile 'com.android.support:support-v4:' + rootProject.supportLibVersion
    }
}


2017년 8월 15일 화요일

Unity, android 특정 앱의 설치 여부 확인(AndroidJavaClass사용)

안드로이드 환경에서 특정 앱의 설치 여부를 패키지 이름으로 확인합니다.


using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AndroidUtil : MonoBehaviour 
{
    #if UNITY_ANDROID && !UNITY_EDITOR 

    public static bool IsAppInstalled(string bundleID)
    {
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaObject packageManager = currentActivity.Call<AndroidJavaObject>("getPackageManager");

        AndroidJavaObject launchIntent = null;

        //if the app is installed, no errors. Else, doesn't get past next line
        try
        {
            launchIntent = packageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage", bundleID);
        }
        catch (Exception ex)
        {
            Debug.Log("exception" + ex.Message);
        }

        return (launchIntent == null ? false : true);
    }

    #endif
}



아래처럼 확인 가능
bool existApp = AndroidUtil.IsAppInstalled("com.android.otherApp");


2016년 7월 19일 화요일

adb shell에서 intent를 통해 apk설치하기

am start -a android.intent.action.VIEW -d file:///sdcard/download/app.apk -t application/vnd.android.package-archive

붉은색의 apk패스에 설치하고자 하는 경로를 적어주면 패키지 인스톨러 액티비트가 화면에 나타나게됨

2014년 4월 3일 목요일

android wear sdk preview

모든 설명은 여기에..
https://developer.android.com/intl/ko/wear/preview/start.html


sdk api level 19부터 지원
시뮬레이터로 square, round 2가지 시계를 가지고 놀수 있다.
(아직 한글 안됨)

developer preview signing을 받아 폰에 Android Preview app을 설치하여
폰과 시계(시율레이터 ㅡㅡ;)를 연동하는 테스트를 해볼수 있음.

폰과 시계는 adb 포트포워딩을 통해 tcp연결함.
adb -d forward tcp:5601 tcp:5601

기본기능이 Notification을 통한 waer의 알림과 wear에서의 조작이 폰에 연동되는 기능임.
https://developer.android.com/intl/ko/wear/notifications/creating.html

아직 별거 없지만. 기능들이 점점 늘어날꺼라 기대함.

android용 ffmpeg shared library만들때

생성되는 라이브러리 이름이 libxxxx.so.<version> 라는 형식으로 생성되는경우
이는 안드로이드 빌드 시스템과 호환이 안된다.
아래와 같이 configure 파일의 부분을 찾아 바꿔줘야 함


SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

이것을

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

이렇게


android.mk에는 아래처럼 추가해주고

LOCAL_PATH := $(call my-dir)

# --------------------------------------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libavcodec
LOCAL_SRC_FILES := ./ffmpeg2.0.1/armv7-a/lib/libavcodec-55.so
include $(PREBUILT_SHARED_LIBRARY)

# --------------------------------------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libavformat
LOCAL_SRC_FILES := ./ffmpeg2.0.1/armv7-a/lib/libavformat-55.so
include $(PREBUILT_SHARED_LIBRARY)

# --------------------------------------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libswresample
LOCAL_SRC_FILES := ./ffmpeg2.0.1/armv7-a/lib/libswresample-0.so
include $(PREBUILT_SHARED_LIBRARY)

# --------------------------------------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libswscale
LOCAL_SRC_FILES := ./ffmpeg2.0.1/armv7-a/lib/libswscale-2.so
include $(PREBUILT_SHARED_LIBRARY)

# --------------------------------------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libavfilter
LOCAL_SRC_FILES := ./ffmpeg2.0.1/armv7-a/lib/libavfilter-3.so
include $(PREBUILT_SHARED_LIBRARY)

# --------------------------------------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libavresample
LOCAL_SRC_FILES := ./ffmpeg2.0.1/armv7-a/lib/libavresample-1.so
include $(PREBUILT_SHARED_LIBRARY)

# --------------------------------------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := libavutil
LOCAL_SRC_FILES := ./ffmpeg2.0.1/armv7-a/lib/libavutil-52.so
include $(PREBUILT_SHARED_LIBRARY)


# --------------------------------------------------------------------------------------------------------
include $(CLEAR_VARS)

LOCAL_MODULE    := MyNativeModuleName


LOCAL_CFLAGS := .....
LOCAL_CPPFLAGS := .....

LOCAL_C_INCLUDES :.....
LOCAL_SRC_FILES :.....


LOCAL_LDLIBS := .....
LOCAL_SHARED_LIBRARIES := libavcodec libavformat libswscale libavutil libswresample libavfilter libavresample libavutil


java쪽에서 아래와 같이  dependency에 순서에 맞게 라이브러리를 로딩합니다.

static
{
LOG.d(TAG, "Build.CPU_ABI : " + Build.CPU_ABI);

        System.loadLibrary("avutil-52");
        System.loadLibrary("avcodec-55");
        System.loadLibrary("avformat-55");
        System.loadLibrary("swresample-0");
        System.loadLibrary("swscale-2");
        System.loadLibrary("avresample-1");
        System.loadLibrary("avfilter-3");
        System.loadLibrary("MyNativeModuleName");

}


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)
{

}
}

}

2013년 12월 14일 토요일

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);