맥에서도 안드로이드스튜디오를 설치했다.

개발은 맥에서 주로 하니까.



여기서 시작한다.

[Start a new Android Studio project] 을 클릭!


Application name 과 Company Domain 을 설정해주고 [Next] 클릭!

기본적으로 Phone and Tablet 에 체크가 되어있네. Min SDK 를 설정해줘야겠는데, 만들 앱이 어느 버전부터 지원을 할지 결정하는 부분이 되겠다. 위 그림의 선택에 따르면 IceCreamSandwich 이상을 지원하겠다는 뜻일게다. 와우! 그아래 90.4% 라는 글이 보이네.. ICS 이상이 90.4% 라고 알려준다. 다른 버전으로 바꿔보니 실시간 업데이트된다. 좋구나~~


파란색 help me choose 를 클릭해봤다.

거기서 4.1 Jelly Bean 을 클릭해봤다.


4.1 젤리빈까지 82.6%라고 나오고 오른쪽엔 가능한 기능들이 보여진다. 좋구나~


아래 사이트에서 유사 정보와 스크린 사이즈에 대한 정보도 얻을 수 있다.

https://developer.android.com/about/dashboards/index.html?utm_source=suzunone


가보니 아래 정보가 있다.




스튜디오에서 보여주는 값과 약간 차이가 있긴하네.

암튼, 아이스크림샌드위치 이하가 12.5% 네.  젤리빈 이상이 87.5%라는 소리니까 젤리빈부터 적용해도 될 듯하다.

난 ICS 는 이제 버리겠다.ㅋ


API 16: Android 4.1 (Jelly Bean) 선택하고 [Next]!


템플릿이라고 해야하나, 기본적으로 만들어줄 activity 목록이 나타난다.

난 아무것도 모르니까, 일단 Blank Activity 선택하고 Next!

액티비티, 레이아웃 등 이름 정하라는데, 그냥 두고 Finish!


헤~~ 복잡하네~~

일단 Run 시켜보니..



디바이스를 선택하든지, 에뮬레이터로 띄울 건지 선택하는 창이 나오네.

실제 폰은 연결되어있지 않으니 에뮬레이터로 하면 되고... Android virtual device 에 Nexus 5 API 21 x86 이라고 선택되어있네. 다른거 선택할 것도 없고.. 옆에 [...]를 클릭하니까 에뮬레이터가 이용할 가상 기기를 관리하는 창이 뜨네.


그냥 놔두자. 

창 닫고, Nexus 5 그대로 두고 OK 클릭!


관련 정보를 구글에게 보낼것인가??? 선택하고 Proceed!

에뮬레이터가 뜬다.

Backup account 가 필요하다고 뜨는데, 클릭해버리니 Hello world! 가 나타난다. 다시 백업 어카운트를 설정하라고 뜨는데.. 무시..


이게 Blank activity 의 실행화면이다.

흠... 에뮬레이터에서 돌려볼 수 있다는 거고...


실제 기기에서 돌려보려면 어떻게 해야하나...


놀고 있는 갤럭시 S3 가 4.4.4로 업데이트 된게 있는데, 맥에 연결해봤다.


연결 후, Run 을 시키니까 아래처럼 디바이스가 선택되어진다.




안드로이드폰은 개발자 옵션을 켜놔야된다.


근데, 저 UNAUTHORIZED 가 깨림직하네. 역시 [OK] 를 눌러도 폰에서 앱이 실행되지 않는다.



디바이스에서 컨펌 창을 확인하라는데, 폰에 아무것도 안 뜨는데.. 

USB 케이블을 뺏다가 다시 끼우니까 USB 디버깅을 허용할까요? 라는 창이 뜨네.

'항상 이 PC와 연결할 수 있도록 허용'을 체크해주고 확인!




UNAUTHORIZED 가 사라졌다!

이제 Run 시키면 폰에서 실행이 된다.




실행화면은 에뮬에서와 같다. 사진찍기는 생략!




안드로이드 스튜디오로 프로젝트 만들고 실제 기기에서 돌려보는 것 확인완료!


이상!



Posted by 똑똑한 영장류

안드로이드 버전과 API Level


안드로이드는 다양한 버전이 존재한다. 

최초의 버전 1.0에서부터 최신의 버전 4.4 kitkat 까지...

구글은, 이 안드로이드 버전이 하나씩 올라갈 때마다, 업그레이드된 안드로이드의 새로운 기능들을 개발자들이 이용할 수 있도록 각 버전에 맞는 새로운 SDK를 제공해준다.

일반 이용자들에게 새로운 안드로이드가 공개되면, 개발자들에게는 그에 맞는 새로운 SDK 가 하나씩 더 생기는거다.

구글에서는 SDK 버전을 API Level 이라고 하는 것 같다.


아래 표를 보자..구글 안드로이드 개발자 사이트에서 긁어온거다.


Platform VersionAPI LevelVERSION_CODENotes
Android 4.419KITKATPlatform Highlights
Android 4.318JELLY_BEAN_MR2Platform Highlights
Android 4.2, 4.2.217JELLY_BEAN_MR1Platform Highlights
Android 4.1, 4.1.116JELLY_BEANPlatform Highlights
Android 4.0.3, 4.0.415ICE_CREAM_SANDWICH_MR1Platform Highlights
Android 4.0, 4.0.1, 4.0.214ICE_CREAM_SANDWICH
Android 3.213HONEYCOMB_MR2
Android 3.1.x12HONEYCOMB_MR1Platform Highlights
Android 3.0.x11HONEYCOMBPlatform Highlights
Android 2.3.4
Android 2.3.3
10GINGERBREAD_MR1Platform Highlights
Android 2.3.2
Android 2.3.1
Android 2.3
9GINGERBREAD
Android 2.2.x8FROYOPlatform Highlights
Android 2.1.x7ECLAIR_MR1Platform Highlights
Android 2.0.16ECLAIR_0_1
Android 2.05ECLAIR
Android 1.64DONUTPlatform Highlights
Android 1.53CUPCAKEPlatform Highlights
Android 1.12BASE_1_1
Android 1.01BASE

출처는..아래 링크.

http://developer.android.com/guide/topics/manifest/uses-sdk-element.html


이 표 이전에, 내가 안드로이드 버전이라고 표현한 것은 표에서 'Platform Version'이고 SDK 버전이라 표현한 것은 'API Level'이다.


일반 이용자들이 항상 최신 버전을 이용한다면, 개발자들은 고민할 필요없이 최신의 SDK 를 이용해서 개발하면 될거다.

하지만, 실상은... 그렇지 못하다. 최신의 안드로이드가 등장해도 이전 버전을 그대로 사용하는 이용자들의 수가 꽤 된다. 

그러면, 개발자들은 고민하게 된다. 

최신 버전에서만 돌아가는 앱을 만들어서 사용자가 얼마 되지 않는 것보다, 조금 낮은 버전에서도 돌아가는 앱을 만들면 더 많은 사용자들에게 다가갈 수 있다. 

예를 들면, 'OK! 나는 젤리빈 4.1 부터 지원을 하도록 하겠어!' 라고 결정을 내릴 수 있다.


이렇게 결정을 내렸다면, 개발할 때는 API Level 16 을 이용해서 앱을 개발하면 된다.


그렇게 개발된 앱은 API Level 16 이하에서는 존재하지 않았던 새로운 기능을 포함할 수도 있다. 

그럴 경우, API Level 16 보다 적은 값을 가진  Platform 들, 즉, ICS, honeycomb, gingerbread..이하 안드로이드폰에서 실행이 불가능 할 수도 있다.

API Level 16 이상의 Platform, 즉, Jelly Bean, Jelly Bean MR1, MR2, Kitkat 폰에서는 실행이 가능하다. 특별한 경우를 제외하고, 상위 버전의 API 는 하위 버전과 잘 호환이 되도록 만들어지기 때문이다.


정리하면,

지원하고자 하는 Platform version 을 결정하면, 위 표에서 API Level 을 확인한 후, 개발할 때 해당 API 들을 이용해서 개발하면 된다~~는 이야기를 길게 했다.


끝!








Posted by 똑똑한 영장류

본부 사이트는 아래..에서 시작!


https://developers.google.com/mobile-ads-sdk/


참고 > http://wingsnote.com/36


SDK가 따로 있고, google play service 에도 포함되어있다.

google play service 를 이용하는 것이 편리하다.


이클립스에서 SDK Manager 를 통해 google play services SDK 를 설치하도록 합시다.


finder 에서 

SDK 디렉토리 /extras/google/google_play_services/libproject/google-paly-services_lib/ 가 잘 있는지 확인하고...

이클립스에서 해당 디렉토리를 임포트합니다.


MyGame > Properties 가서 Android > Library 에 임포트한 play service project 를 라이브러리로 등록을 합니다.



Android.Manifest.xml 파일에 아래처럼 추가작성을 해 줍니다.

</application > 태그의 자식으로 작성을 합니다.


<meta-data android:name="com.google.android.gms.version"

           android:value="@integer/google_play_services_version" />

        <activity android:name="com.google.android.gms.ads.AdActivity"

             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize"/>

        

    </application>



android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize"/>  항목에서 smallestScreenSize 도 추가하도록 구글 매뉴얼에 되어있는데, sdk 의 버전이 낮으면 오류가 발생하니까 작업중인 버전에 맞춰서 추가 혹은 제거를 합시다.


애드몹이 인터넷 접속을 하니까...아래처럼 권한 설정도 해줘야한답니다.

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>



여기까지 하면, 안드로이드 앱에서 애드몹을 사용할 수 있도록 설정이 된 상태죠.

이제 액티비티 라는 녀석에다가 코딩을 해서 실제 광고 배너가 나타나도록 해줘야겠습니다.


이클립스에서 프로젝트 아래에 src > org.cocos2dx.cpp > AppActivity.java 를 열어서 아래처럼 작성을 합시다.



/****************************************************************************

Copyright (c) 2008-2010 Ricardo Quesada

Copyright (c) 2010-2012 cocos2d-x.org

Copyright (c) 2011      Zynga Inc.

Copyright (c) 2013-2014 Chukong Technologies Inc.

 

http://www.cocos2d-x.org


Permission is hereby granted, free of charge, to any person obtaining a copy

of this software and associated documentation files (the "Software"), to deal

in the Software without restriction, including without limitation the rights

to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

copies of the Software, and to permit persons to whom the Software is

furnished to do so, subject to the following conditions:


The above copyright notice and this permission notice shall be included in

all copies or substantial portions of the Software.


THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

THE SOFTWARE.

****************************************************************************/

package org.cocos2dx.cpp;


import org.cocos2dx.lib.Cocos2dxActivity;


import com.google.android.gms.ads.AdRequest;

import com.google.android.gms.ads.AdSize;

import com.google.android.gms.ads.AdView;


import android.os.Bundle;

import android.widget.LinearLayout;

import android.view.Gravity;

import android.view.WindowManager;


public class AppActivity extends Cocos2dxActivity {


private AdView admobView;

Cocos2dxActivity mActivity;

LinearLayout layout;

LinearLayout mainLayout;

boolean isAdmobInited = false;

 

 /* Your ad unit id. Replace with your actual ad unit id. */

 private static final String AD_UNIT_ID = "a15336339f82fc1";


 /** Called when the activity is first created. */

 @Override

 public void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   

   mActivity = this;

   

   // Create an ad.

   admobView = new AdView(this);

   admobView.setAdSize(AdSize.BANNER);

   admobView.setAdUnitId(AD_UNIT_ID);

   

   showAdmob();

 }

 

 public void showAdmob ()

 {

  if (isAdmobInited || admobView == null) {

  return;

  }


  mainLayout = new LinearLayout (mActivity);

  mainLayout.post (new Runnable () {

 

  @Override

  public void run () {

  AdRequest adRequest = new AdRequest.Builder().build();

 

  WindowManager wm = (WindowManager) mActivity.getSystemService ("window");

 

  WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams ();

  mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;

  mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;

  mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;

  mLayoutParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

  mLayoutParams.gravity = Gravity.TOP;

 

  wm.addView (admobView, mLayoutParams);


  // Enable this if your are testing AdMob, otherwise you'll risk to be banned!

  //adRequest.addTestDevice (AdRequest.TEST_EMULATOR);

  admobView.loadAd(adRequest);

 

  isAdmobInited = true;

  }

  });

 }

 

 @Override

 public void onResume() {

   super.onResume();

   if (admobView != null) {

     admobView.resume();

   }

 }


 @Override

 public void onPause() {

   if (admobView != null) {

     admobView.pause();

   }

   super.onPause();

 }


 /** Called before the activity is destroyed. */

 @Override

 public void onDestroy() {

   // Destroy the AdView.

   if (admobView != null) {

     admobView.destroy();

   }

   super.onDestroy();

 }

}



우여곡절 끝에 광고가 뜨네요..



Posted by 똑똑한 영장류