# 메모리 정보

http://snowbora.com/539

실제 메모리의 전체 크기 : Runtime.getRuntime().totalMemory()

사용 가능한 실제 메모리의 크기 : Runtime.getRuntime().freeMemory()

가상 메모리의 전체 크기 : Runtime.getRuntime().maxMemory()

 


 


# 안드로이드에서 폰트 처리 확인..


gNanumGothic = Typeface.createFromAsset(context.getAssets(), "fonts/heum.ttf");

Typeface.createFromFile()




 

# Asset Folder 내용


Asset folder는 특정확장자를 제외한 화일들은 안드로이드가 내부적으로 모두 압축을 합니다. 

그러므로 대용량을 분할하지 않을려면 압축이 자동으로 되지 않는 화일확장자를 가지면 됩니다.

이런 확장자가 mp3,mp4 등등 몇개 있습니다. 

대용량 sqlite화일이 그대로 복사가 안되는 이유는 sqlite화일을 안드로이드가 압축을 해서 가지고 있는데, 이를 다시 풀려고 할 때 , 특정 사이즈 이상은 처리가 안되게 되어 있다고 합니다. 즉 압축문제입니다. 

 

 


# android 에서 json 사용하기


참고 : http://zerokiss.tistory.com/50


     "title":"TEST", 

     "title_img":"title.png", 

      "buttons":[ 

           { 

                 "id":"home01", 

                 "title":"테스트버튼", 

                 "icon_img":"test_btn.png", 

                 "text_img":"text_img.png" 

           }, 

           { 

                 "id":"home02", 

                 "title":"테스트버튼2", 

                 "icon_img":"test_btn2.png", 

                 "text_img":"text_img2.png" 

           } 

       ] 

}


//JSONObject 얻어 오기 

JSONObject  jsonObject =  new JSONObject(jString);


//json value 값 얻기 

Stirng title = jsonObject.getString("title").toStirng();   //결과값 TEST 

 

//이미지 사용법에 대해서는 이미 아시리라 믿고 패스 할께요;;


//JSONArray 사용법 

JSONArray jArr = new JSONArray(jsonObject.getStirng("buttos")); 

 

 

# GPS 좌표간 거리 계산

 

android.location.Location.distanceBetween(prelat, prelng, lat, lng, distance);

 

distance[0] 의 값이 좌표간 거리임


distanceBetween 해서 나오는 값은 meter 입니다.

즉 m/s 단위입니다.  10.5가 나왔다면 10.5 m/s 입니다. 

이것을 km/h로 바꿀려면 1000을 나누라는 분이 계시는데 ㅡㅡ

3.6(3600/1000)을 곱하는게 맞습니다.


 

 

# 코너를 둥글게 하기


<?xml version="1.0" encoding="UTF-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#99FFFFFF"/>

    <corners android:radius="15dip"/>

    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />

</shape>

 

 

* Android 에서 서버의 mysql db 정보 연동하기

Connecting to MySQL database

  http://www.android-center.com/TB/?P=11871

1. MySQL 테이블 생성

2. PHP or JSP 로 JSON 객체 생성하여 출력

3. Android 에서 JSONArray 객체를 생성하여 사용

끝 ^^

 

 


 

# key 파일의 내용보기

 

keytool -list -v -keystore app_v10.key

 

 

 

# usim, 전화번호(MDN) 구하기

android.telephony 패키지 참고

http://d.android.com/reference/android/telephony/TelephonyManager.html#getLine1Number() 참고

READ_PHONE_STATE 퍼미션이 필요합니다

 


# TelephoneyManager

http://icess.egloos.com/3279459

 


 

# 화면 크기


mWinMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 

int displayWidth = mWinMgr.getDefaultDisplay().getWidth(); 

 


# wifi, 3G 에 대한 Network change 


<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

 

 

 


# ExpandableListView


extends ExpandableListActivity

 

android:drawSelectorOnTop

  true  : 선택이 되면 selector 가 전체 적용이 된다.

  false : 선택 처리를 사용하지 않는다.

 

android:groupIndicator

  그룹아이템이 열리기전의 화살표 아이콘을 바꿔줄 수 있다

 

 


# android.graphics.Camera

 

3d flip 효과

  http://blog.paran.com/fanfare%40hitel/34356715


Transformation Matrix 설명

  http://www.senocular.com/flash/tutorials/transformmatrix/


Camera.save() : 스택에 maxtrix 를 넣는다.

Camera.restore() : 현재 transformation 을 없애고,

  마지막 저장된 상태(스택에서 꺼냄)로 돌아가 계속 진행한다.

순서

  1. canvas.save(); 

  2. transform matrix; 

  3. draw; 

  4. canvas.restore();


Canvas.save, Canvas.restore; Camera.save, Camera.restore

  http://maohao.wordpress.com/category/graphics/


## Etc

Android Coverflow Widget V2 

  http://www.inter-fuser.com/2010/02/android-coverflow-widget-v2.html

 

 

 

 


# SMS

 

#### 수신되는 SMS 를 따로 처리하는 broadcast receiver 

  <intent-filter>

      <action android:name="android.provider.Telephony.SMS_RECEIVED" />

     </intent-filter>


BroadcastReceiver 클래스를 사용하면

 

#### 참고

SMS에 반응하는 프로그램(안드로이드)

  http://flytop.tistory.com/62


SMS Messaging in Android (외국)

  http://mobiforge.com/developing/story/sms-messaging-android


Inbox 내 SMS 문자 삭제하기

  aphone 에서 검색

 


# ViewFlipper


: In/Out 속성을 지정하여 View 의 이동을 animation 처리한다.


1. 레이아웃 구성

  ViewFlipper 에 포함될 View 를 정의

2. 애니메니션 구성

  res/anim 에 원하는 애니메이션 구성

3. 코드 구성

mFilpper = (ViewFlipper)this.findVeiwById(R.id.flipper)

mFilpper.startFlipping();

mFilpper.setInAnimation(...);

mFilpper.setOutAnimation(...);


* 선언한 뷰를 class로 매핑

    flipper = (ViewFlipper)findViewById(R.id.flipper);

    title = (Title)flipper.getChildAt(0);

    menu = (Menu)flipper.getChildAt(1);

    game = (Game)flipper.getChildAt(2);

* 원하는 뷰를 화면에 나타내기

    flipper.setDisplayedChild(2);

* 참고사항

setContentView혹은 layoutinflate를 하는 시점에 모든 뷰가 생성이 되고 화면에 보이는 여부와 상관없이

종료할때까지는 계속 살아 있기 때문에 특정 view를 보일때 초기화를 한다든지 하는건 알아서 해줘야함

(별도의 overriding할 method같은건 당연히 제공되지 않음)




 

# 이벤트 처리


http://tigerwoods.tistory.com/23

OnTouchListener 인터페이스의 구현

화면에 일어나는 touch를 감지하기 위해서는 android.view.View.OnTouchListener interface를 구현하여야 한다.

OnTouchListener 인터페이스는 다음과 같은 abstract callback method를 포함 함으로 구현해 주어야 한다.


Animation 리소스의 사용 

  push_left_in.xml: 새로운 view가 왼쪽 방향으로 밀려 들어옴. 

  push_left_out.xml: 기존 view가 왼쪽 방향으로 밀려 나감. 

  push_right_in.xml: 새로운 view가 오른쪽 방향으로 밀려 들어옴. 

  push_right_out.xml: 기존 view가 오른쪽 방향으로 밀려 나감.


<translate> 

상하좌우 이동 animation을 지정하며. TranslateAnimation 클래스에 대응한다.

<alpha> 

투명함을 조정하며, AlphaAnimation 클래스에 대응한다.


Java code에서 ViewFlipper 객체의 사용

  View:addView(View): layout xml 문서 내부의 ViewFlipper element에 nest된 view 이외에 새로운 view를 동적으로 추가한다. 

  ViewAnimator:setInAnimation(Context, int): 새로운 view가 화면에 진입시의 animation 설정 

  ViewAnimator:setOutAnimation(Context, int): 기존 view가 화면에서 퇴장시의 animation 설정 

  ViewAnimator:showNext(): ViewFlipper에 등록된 view중 현재 view의 다음 view를 화면에 보이게 함

  ViewAnimator:showPrevious(): ViewFlipper에 등록된 view중 현재 view의 전 view를 화면에 보이게 함 

  ViewFlipper:setFlipInterval(int): 자동 flipping시 적용할 시간간격 (1/1000초 단위 사용)

  ViewFlipper:startFlipping(): 설정된 시간간격을 적용해 자동 flipping 시작 함 

  ViewFlipper:stopFlipping(): 자동 flipping을 정지 함


ViewSwitcher : ViewFlipper와 동일




# Thread 


안드로이드 021: Thread 구현하기 2/2 (with AsyncTask & ProgressBar)

  http://tigerwoods.tistory.com/28

  

Thread - Handler and Looper

  http://skyswim42.egloos.com/3546223


[번역완료]Talking about Android Message Queue

  http://blog.naver.com/osk1004?Redirect=Log&logNo=50068938534


안드로이드 Key/Touch event dispatch 과정 

  http://cafe.naver.com/05cmusa2.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=385


 

==> 추가 내용

android UI thread, painless threading 

  http://sdop.egloos.com/3600978

  UI 관련 행위는 UI Thread(Main Thread)에서 수행해야한다

Android - UI Thread와 Handler 

  http://www.cyworld.com/thespeedofpain/2653453

  'view 구조를 생성한 쓰레드에서만 그 view를 건드릴 수 있다

  'android.os.Handler' class를 활용한다

    - job queue 로 서로 주고 받음


Android App - Using threads and ProgressDialog 참고

 


 

# Networking with Android 


http://blog.naver.com/davincigo?Redirect=Log&logNo=60103780004

    public class Requester extends Thread {

        Socket requestSocket;

        String message;

        StringBuilder returnStringBuffer = new StringBuilder();

        Message lmsg;

        int ch;

        @Override

        public void run() {

            try {

                this.requestSocket = new Socket("remote.servername.com", 13);

                InputStreamReader isr = new InputStreamReader(this.requestSocket.

getInputStream(), "ISO-8859-1");

                while ((this.ch = isr.read()) != -1) {

                    this.returnStringBuffer.append((char) this.ch);

                }

                this.message = this.returnStringBuffer.toString();

                this.lmsg = new Message();

                this.lmsg.obj = this.message;

                this.lmsg.what = 0;

                h.sendMessage(this.lmsg);

                this.requestSocket.close();

            } catch (Exception ee) {

                Log.d("sample application", "failed to read data" + ee.getMessage());

            }

        }

    }



Android - Updating UI On UI Thread


  http://escomic.net/211

Android에서도 UI관련 행위는 UI Thread위에서 해야한다 

그렇지 않으면 아래와 같은 Exception이 발생한다

   android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created .....


Swing의 SwingUtilities.invokeLater(Runnable r)와 같은 역할을 하는 아래의 방법을 사용하여 해결할수 있다


  Activity.runOnUiThread(Runnable action)

  

  View.post(Runnable action)

  

  View.postDelayed(Runnable action, long delayMillis)

  

  Handler.post(Runnable action)

 


# Android에서의 TCP/IP 통신


  http://blog.naver.com/davincigo?Redirect=Log&logNo=60103774153

 

 

 

 

 

 

 

Grab a URL Source with ProgressDialog and AsyncTask 

  http://www.androidsnippets.org/snippets/116/


Handler를 써야 합니다. 

http://www.androidpub.com/_filter=search&mid=android_dev_info&search_target=title&search_keyword=Handler&document_srl=57470


미디어 갤러리

  http://developer.android.com/reference/android/content/Intent.html#ACTION_SEND

  http://modian.tistory.com/entry/Gallery-Camera-사용

 

Intent.ACTION_MEDIA_SCANNER_SCAN_FILE : Broadcast Action: Request the media scanner to scan a file and add it to the media database.

 

 


# SurfaceView



[ 안드로이드 개발 2.0 ] 그래픽 2D 1 - 안드로이드 아이콘 띄우기, 커스텀뷰 활용

  http://moozi.tistory.com/80

[ 안드로이드 개발 2.0 ] 그래픽 2D 2 - SurfaceView 활용 1

  http://moozi.tistory.com/81

[ 안드로이드 개발 2.0 ] 그래픽 2D 3 - SurfaceView 활용 2 

  http://moozi.tistory.com/82

  * 스크린 사이즈 변경시 Call Back 함수를 호출함


View 에서 그리기

  1) View 상속 클래스 생성

  2) onDraw() 오버라이딩

  3) invalidate() 호출

SurfaceView 에서 그리기

  1) SurfaceHolder.lockCanvas() 와 SurfaceHolder.unlockCnavasAndPost() 를 

     이용하여 화면을 갱신함

 

 


# Android 사용자 커스텀뷰


android에서 이미지뷰 Drag 해보기

  http://blog.naver.com/eriteia?Redirect=Log&logNo=10077769956

Create Custom Widget : http://developer.android.com/guide/topics/ui/custom-components.html (원문)


기본적인 접근

  1. View또는 기존 생성한 클래스를 상속(Extends) 받는다.

  2. 상위 클래스(Super Class)의 메소드(onXXX …) 를 오버라이드 한다. Ex) onDraw(), onKeyDown(), onMeasure()…

  3. 이제 클래스를 새롭게 확장한 이후 이 클래스를 바탕으로 좀더 확장해 나간다.

참조

  onDraw ()   : 2D 그래픽을 그리기 위한 메소드

  onMeasure() : Widget의 크기(영역 : 폭, 높이)을 지정하는 메소드

기존 존재하는 클래스 확장 예시

1. 정의

  public static class MyEditText extends EditText

2. 클래스 초기화

  Super를 사용하여 상위 클래스를 초기화 한다 이후 xml 을 통해 레이아웃을 초기화 할 수 있다.

3. 메소드 오버라이드

  onDraw(), onMeasure() 등을 오버라이딩 하여 원하는 형태로 꾸며준다.

4. 커스텀 컴포넌트 사용

      <view

        class="com.android.notepad.NoteEditor$MyEditText"

        id="@+id/note"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:background="@android:drawable/empty"

        android:padding="10dip"

        android:scrollbars="vertical"

        android:fadingEdge="vertical" />

 

 

 


 

# IMSI, 핸드폰 번호 알아오기


TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 

String imsi = mTelephonyMgr.getSubscriberId(); 

String imei = mTelephonyMgr.getDeviceId(); 

String phoneNumber = mTelephonyMgr.getLine1Number();

 


[안드로이드] Toast View 만들기

  http://blog.daum.net/hopefullife/79

 

 



# 전체화면 사용하기 (Status bar, Title bar 숨기기)


  - 타이틀바 및 상태바 숨기기

  * Fullscreen 의 경우 Annon 영역이 없어짐 (32pixel)

 

참고 : http://www.androidpub.com/4710

* AndroidManifest.xml 에서 처리

  <activity android:name=".MyActivity"

 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  >


* java 에서 처리

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  

  // setContentView 전에 호출

  requestWindowFeature(Window.FEATURE_NO_TITLE);

  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  

     WindowManager.LayoutParams.FLAG_FULLSCREEN);

 

  setContentView(...);

 


# 기타

 

* View 컨테이너로 쓰이는 ViewGroup 들

  ViewGroup 은 Layout 과 비슷하지만

  자기 자신도 어느 정도의 기능을 제공한다.

  - Gallery, GridView, ImageSwitcher, ScrollView, TabHost, ListView 등 ..

 

 

 

 


# 바코드 처리


안드로이드 바코드 인식기(OCR) 오픈소스 zxing 분석(by wono77) 

  http://blog.naver.com/wono77?Redirect=Log&logNo=140101427842

 

 

  import com.google.zxing.*;

  import com.google.zxing.common.ByteMatrix;

  import com.google.zxing.qrcode.QRCodeWriter;

  

  QRCodeWriter writer = new QRCodeWriter();

  try {

   

   Hashtable hints = new Hashtable();  

    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

   ByteMatrix matrix = writer.encode("한글입력", BarcodeFormat.QR_CODE, 230, 230, hints);

   MatrixToImageWriter.writeToFile(matrix , "png", new File("d:/test1.png"));

  

  } catch (WriterException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }


  

안드로이드 바코드 인식기(OCR) 오픈소스 zxing 분석(by wono77) 

  http://blog.naver.com/wono77?Redirect=Log&logNo=140101427842

 


1. ByteMatrix 를 구한다.

2. int[] pixels = new int[width * height]; 를 만든다.

3. android.graphics.Bitmap 으로 저장한다.


        ByteMatrix result = new MultiFormatWriter().encode(contents, format,

            pixelResolution, pixelResolution);

        int width = result.getWidth();

        int height = result.getHeight();

        byte[][] array = result.getArray();

        int[] pixels = new int[width * height];

        for (int y = 0; y < height; y++) {

          for (int x = 0; x < width; x++) {

            int grey = array[y][x] & 0xff;

            // pixels[y * width + x] = (0xff << 24) | (grey << 16) | (grey << 8) | grey;

            pixels[y * width + x] = 0xff000000 | (0x00010101 * grey);

          }

        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

        

 

 


# 개발 규칙

 

* member 변수에 prefix  로 m 을 붙이는건 어떨지?

* SQLite

  - 기본키는 필드 이름에 _(언더라인)을 붙인다.

  ex) notes 테이블 : _id, title, body 의 3개 필드로 구성됨

 

* 이미지는 영문 소문자, 숫자, 언더라인(_) 만 가능함

* 투명 이미지는 png 나 gif 로 저장할 것

 



# View  크기(Dimension) 지정 단위


px (pixels) : 실제 화면 픽셀

sp (scaled pixels - best for test size) : 가변 글꼴 표시에 최적임

pt (points) : 글자 크기 단위

dip (device independent pixels) : 160dpi 화면을 기준으로 한 픽셀 단위

  - 버튼, 메뉴등 width 지정

in (inches) : 물리적 길이

mm (millimeters) : 물리적 길이

 

em : TextView 에서 텍스트의 표시량을 글꼴에 무관하게 제어할때 유용

Posted by 소망아기
: