안드로이드 잡 지식
Android/Tips 2014. 7. 24. 17:58 |# 메모리 정보
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 에서 텍스트의 표시량을 글꼴에 무관하게 제어할때 유용
'Android > Tips' 카테고리의 다른 글
[TypedValue] DP, pixel간 변환 (0) | 2014.08.26 |
---|---|
[ADB] 어플리케이션의 cache 지우기 (0) | 2014.08.12 |
Java 코멘트를 위한 테그정리 (0) | 2014.07.24 |
[Eclipse] Tags 활용법 (TODO, FIXME, XXX....) (0) | 2014.07.24 |
JavaDoc 주석 만들기 (0) | 2014.07.24 |