본문 바로가기

구글과인터넷/안드로이드

안드로이드 개발 시 참고하면 좋은 정보(개발 정리)

*  WebView Download
  http://sdop.egloos.com/3630690

  setDownloadListener

 

 

 

 

* ListView 선택 후 스크롤 시 전체 리스트 검정 화면으로 바뀌면서 스크롤 되는 현상 문의오프뷔더

http://android-developers.blogspot.com/2009/01/why-is-my-list-black-android.html
요약하면 android:cacheColorHint를 지정하시면 됩니다.

 

 

* 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" />

 

##################################################
# 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 에서 텍스트의 표시량을 글꼴에 무관하게 제어할때 유용


##################################################
# 삼성안드로이드폰 - M100S 리뷰
##################################################

삼성안드로이드폰 리뷰#1 : 삼성안드로이드폰 가격,디자인 및 아이폰과 터치감 비교
  - http://blog.naver.com/clie701/110081285012

삼성안드로이드폰 리뷰#2 : 인터넷 속도 및 안드로이드 안드로이드 어플리케이션의...
  - http://blog.naver.com/clie701/110081381001

 

##################################################
# 도서 리뷰
##################################################

안드로이드 개발, 어떻게 시작하는게 좋을까?
  - http://nopdin.tistory.com/699

 

형화 추전 서적

1. 초급

  시작하세요 안드로이드 프로그래밍

2. 초+중급

  알짜만 골라 배우는 안드로이드 프로그래밍

  프로페셔널 안드로이드 프로그래밍(일명 빨간책)