Android Permission 종류

Program/Android 2011.04.04 18:16
Permission 종류
ACCESS_CHECKIN_PROPERTIES     체크인데이터베이스의_속성테이블로_액세스                        
ACCESS_COARSE_LOCATION         코스_로케이션_액세스_(Cell-ID/WiFi)                             
ACCESS_FINE_LOCATION           파인로케이션_액세스(GPS)                                        
ACCESS_LOCATION_EXTRA_COMMANDS 로케이션_옵션_커맨드_액세스                                     
ACCESS_MOCK_LOCATION           목_로케이션_프로바이더_생성_(테스트용)                          
ACCESS_NETWORK_STATE           네트워크_상태_접근                                              
ACCESS_SURFACE_FLINGER         서피스_플링거_접근                                              
ACCESS_WIFI_STATE             WiFi상태_접근                                                   
ADD_SYSTEM_SERVICE             시스템서비스_추가                                               
BATTERY_STATS                 배터리_상태                                                     
BLUETOOTH                     블루투스                                                        
BLUETOOTH_ADMIN               블루투스_어드민                                                 
BRICK                         디바이스_실효성_지정                                            
BROADCAST_PACKAGE_REMOVED     제거된_패키지에_대한_notification_브로드캐스트                  
BROADCAST_SMS                 SMS에_대한_브로드캐스트                                         
BROADCAST_STICKY               인텐트_브로드캐스트                                             
CALL_PHONE                     통화                                                            
CALL_PRIVILEGED               통화(긴급전화_포함)                                             
CAMERA                         카메라                                                          
CHANGE_COMPONENT_ENABLED_STATE 컴포넌트의_실효성_변경                                          
CHANGE_CONFIGURATION           컨피그_변경                                                     
CHANGE_NETWORK_STATE           통신상태_변경                                                   
CHANGE_WIFI_STATE             WiFi상태_변경                                                   
CLEAR_APP_CACHE               어플리케이션_캐시_클리어                                        
CLEAR_APP_USER_DATA           어플리케이션의_유저데이터_클리어                                
CONTROL_LOCATION_UPDATES       위치정보_갱신                                                   
DELETE_CACHE_FILES             캐시파일_제거                                                   
DELETE_PACKAGES               패키지_제거                                                     
DEVICE_POWER                   전원상태에_대한_로우레벨_접근                                   
DIAGNOSTIC                     진단리소스_읽고쓰기                                             
DISABLE_KEYGUARD               키_가드_끄기_DUMP_덤?                                          
EXPAND_STATUS_BAR             상태표시줄_확장                                                 
FACTORY_TEST                   팩토리_테스트                                                   
FLASHLIGHT                     플래시라이트                                                    
FORCE_BACK                     포스백                                                          
GET_ACCOUNTS                   어카운트_획득                                                   
GET_PACKAGE_SIZE               패키지_획득                                                     
GET_TASKS                     태스크_획득                                                     
HARDWARE_TEST                 하드웨어테스트                                                  
INJECT_EVENTS                 유저이벤트_키/트랙볼                                            
INSTALL_PACKAGES               패키지_인스톨                                                   
INTERNAL_SYSTEM_WINDOW         내부_시스템윈도_활용                                            
INTERNET                       인터넷                                                          
MANAGE_APP_TOKENS             어플리케이션_토큰관리                                           
MASTER_CLEAR                   마스터_클리어                                                   
MODIFY_AUDIO_SETTINGS         오디오설정_편집                                                 
MODIFY_PHONE_STATE             전화상태_편집                                                   
MOUNT_UNMOUNT_FILESYSTEMS     파일시스템_편집                                                 
PERSISTENT_ACTIVITY           액티비티_지속                                                   
PROCESS_OUTGOING_CALLS         전화_발신처리_접근                                              
READ_CALENDAR                 캘린더_읽어오기                                                 
READ_CONTACTS                 주소록_읽어오기                                                 
READ_FRAME_BUFFER             프레임버퍼_읽어오기                                             
READ_INPUT_STATE               입력상태_읽어오기                                               
READ_LOGS                     로그_읽어오기                                                   
READ_OWNER_DATA               owner_data읽어오기                                              
READ_PHONE_STATE               통화상태_읽어오기_READ_SMS_SMS읽어오기                          
READ_SYNC_SETTINGS             동기설정_읽어오기                                               
READ_SYNC_STATS               동기상태_읽어오기                                               
REBOOT                         reboot                                                          
RECEIVE_BOOT_COMPLETED         boot완료                                                        
RECEIVE_MMS                   MMS수신                                                         
RECEIVE_SMS                   SMS수신                                                         
RECEIVE_WAP_PUSH               WAP수신                                                         
RECORD_AUDIO                   오디오_수신                                                     
REORDER_TASKS                 태스크_Z오더                                                    
RESTART_PACKAGES               패키지_리스타트                                                 
SEND_SMS                       SMS송신                                                         
SET_ACTIVITY_WATCHER           액티비티_왓쳐지정                                               
SET_ALWAYS_FINISH             액티비티_전체_종료                                              
SET_ANIMATION_SCALE           스케일_애니메이션_지정                                          
SET_DEBUG_APP                 디버그어플리케이션_지정                                         
SET_ORIENTATION               스크린_로테이션지정                                             
SET_PREFERRED_APPLICATIONS     자주_사용하는_어플리케이션_지정                                 
SET_PROCESS_FOREGROUND         포어그라운드_처리지정                                           
SET_PROCESS_LIMIT             제한처리_지정                                                   
SET_TIME_ZONE                 타임존_지정                                                     
SET_WALLPAPER                 배경화면_지정                                                   
SET_WALLPAPER_HINTS           배경화면_힌트_지정                                              
SIGNAL_PERSISTENT_PROCESSES   지속처리_시그널_지정                                            
STATUS_BAR                     상태표시줄_지정                                                 
SUBSCRIBED_FEEDS_READ         서브스트립드_피즈_읽어오기                                      
SUBSCRIBED_FEEDS_WRITE         서브스트립드_피즈_쓰기                                          
SYSTEM_ALERT_WINDOW           알림_윈도우                                                     
VIBRATE                       진동                                                            
WAKE_LOCK                     알람                                                            
WRITE_APN_SETTINGS             APN설정_쓰기                                                    
WRITE_CALENDAR                 캘린더_쓰기                                                     
WRITE_CONTACTS                 주소록_쓰기                                                     
WRITE_GSERVICES               G서비스_쓰기                                                    
WRITE_OWNER_DATA               owner_data쓰기                                                  
WRITE_SETTINGS                 설정_쓰기                                                       
WRITE_SMS                     SMS쓰기                                                         
WRITE_SYNC_SETTINGS           동기설정_쓰기       


<uses-permission android:name="android.permission.xxxxxx"/> 
저작자 표시 비영리 변경 금지
신고

안드로이드 개발 참고 사이트 모음입니다.

Program/Android 2011.03.16 10:04
* 안드로이드펍의 회색님이 올려주신 사이트 입니다. 

안드로이드 개발 참고 사이트 모음입니다. 

AndroidPub : 안드로이드펍 한국 안드로이드 사용자 및 개발자 커뮤니티. 
  소개       : 한국 안드로이드 커뮤니티
  홈페이지 : http://www.androidpub.com

공식 안드로이드 공식 홈페이지들
  소개글        : 안드로이드의 전체 소스를 다운받을 수 있음
  홈페이지     : 소스 http://source.android.com
                     공식 http://www.android.com
                     마켓 http://market.android.com
                     개발자 http://developer.android.com

- 안드로이드 써드파티 마켓 사이트 모음
  소개글        : 안드로이드의 다양한 써드파티 마켓 정보 모음
  홈페이지     : http://www.androidpub.com/22520


Android Code Snippets
  소개       : 간단한 안드로이드 코드 모음
  홈페이지 : http://www.androidsnippets.org

StackOverflow Android 
  소개       : 안드로이드 질문과 답 (영문)

구글의 안드로이드 개발자들이 만든 애플리케이션 모음 (Apps for Android )
  소개        : 주로 구글의 실제 안드로이드 개발자들이 만든 샘플 애플리케이션들로 안드로이드의 구조를 잘 이해하고
                  작성한 애플리케이션들이라서 주옥같은 예제가 많이 들어있음. PhotoStream는 웹서버와의 통신에서
                  참고하기 좋은 애플리케이션.

안드로이드 플랫폼 스터디 모임
  소개       : 안드로이드 애플리케이션 프로그래밍을 공부하는 것이 아니라, 안드로이드 플랫폼의 자체 이해를 목적으로 합 
                       니다. 이를 통해 안드로이드 프레임워크의 설계 및 동작 원리를 이해하고, 나아가 안드로이드의 내부 구조를 파악 
                      함으로써 효율적인 안드로이드 프로그램의 설계 및 구현 할 수 있는 지식을 쌓는 것이 저희 스터디의 목표입니다.  
  홈페이지 : http://andstudy.springnote.com/

Eyes Free TTS 텍스트 음성 변환 라이브러리
  소개       : 안드로이드 애플리케이션에서 공유해서 사용할 수 있는 TTS 라이브러리 (안드로이드 1.6에 기본 탑재될 것으로 
                 알려짐)

-  SMALI Dex assembler/disassembler
  소개       : JF 가 작업중인 Dex 어셈블러/디스어셈블러

The open mob for android
  소개       : 안드로이드 개발 관련 위키
  홈페이지 : http://wiki.andmob.org/

안드로이드 스크립트 환경 (ASE : Android Scripting Environment)
  소개       : http://www.androidpub.com/11518

Live CD for Android
  소개       : PC에서 안드로이드를 구동시키자? x86 으로 컴파일된 안드로이드 이미지를 CD에 구워서 PC에서 구동.

HTC 안드로이드 개발자 폰 지원 사이트. 
  소개       : 최신 시스템 이미지등을 다운받을 수 있음

MotoDev 모토로라 개발자 사이트
  소개       : 모토로라의 개발자 사이트 최근 안드로이드를 중심으로 구성되고 있음. PodCast등 쓸만한 정보가 제법 올라옴
  홈페이지 : http://developer.motorola.com/

차이나모바일 OMS 개발자 사이트
  소개       : 차이나 모바일 OMS SDK 정체를 드러내다. 
  홈페이지  : http://www.ophonesdn.com 

일본 안드로이드회 기술자료
  소개         : 일본의 안드로이드 개발자 협회의 기술자료 다양한 자료가 잘 정리되어있다.

본 글은 퍼가셔도 좋으나 안드로이드펍 출처를 정확히 명기해주시기 바랍니다. :) 종종 업데이트 하도록 하겠습니다. 쓸만한 링크가 있으면 댓글로 알려주세요 추가시켜놓도록 하겠습니다.

출처: 안드로이트펍

http://www.androidpub.com/android_dev_info/89895 
저작자 표시 비영리 변경 금지
신고

[안드로이드 무료 게임 추천] 점프점프 Jump Jump - android Game

Program/Android 2011.02.24 14:09
안드로이드 게임 무료 다운 추천

무료 다운

점프점프 (무료 버전 포함)
 <-- 다운다운

android game jumpjump


국내 T스토어와 KT올레 마켓에 있는 국내 게임인 "점프점프" 입니다.

무료 버전도 배포 하고 있습니다.  첨부파일 다운 받아서 바로 설치 하셔도 됩니다.



티스토어 추천 1위에 올랐네요..






T스토어 점프점프 무료 받기..



T스토어 점프점프 유료 받기..



KT 올레마켓 유료 받기

KT는 현재 무료 버전이 없기 때문에 그냥 점프파일 apk 다운 받으셔서 설치 하셔도 됩니다.  (무료버전)



<-- 다운다운
저작자 표시 비영리 변경 금지
신고

(안드로이드 게임 점프점프 다운)JumpJump [Android Game] 추천

Program/Android 2011.02.24 11:07
안드로이드 게임 무료 다운 추천

무료 다운

점프점프 (무료 버전 포함)

android game jumpjump


국내 T스토어와 KT올레 마켓에 있는 국내 게임인 "점프점프" 입니다.

무료 버전도 배포 하고 있습니다.  첨부파일 다운 받아서 바로 설치 하셔도 됩니다.






T스토어 점프점프 무료 받기..






T스토어 점프점프 유료 받기..



KT 올레마켓 유료 받기

KT는 현재 무료 버전이 없기 때문에 그냥 점프파일 apk 다운 받으셔서 설치 하셔도 됩니다.  (무료버전)



저작자 표시 비영리 변경 금지
신고

memory leak 회피하기

Program/Android 2010.11.12 11:55
안드로이드펍에서 이재영 님의 글을 복사 해 왔습니다.

문제 되면 삭제 하겠습니다.

http://www.androidpub.com/?mid=android_dev_info&page=3&document_srl=818409

안드로이드 어플을 개발할 때 허용되는 힙 사이즈는 디바이스마다 다르긴 하지만 대략 15메가 내외로 제한적입니다.
이 상황에서 카메라 어플이나 포토에딧 어플과 같은
큰 이미지를 제어한다던지, 겔러리나 리스트 뷰에서 다량의 이미지를 제어하는 경우,
거의 대부분 out of memory 문제를 접하게 됩니다.

이런 경우에 대해서 잘 정리된 사이트가 있어서 먼저 소개 합니다.
http://cking4w.tistory.com/455 
http://www.ibm.com/developerworks/kr/library/j-jtp11225/ 

대부분의 메모리 문제의 경우, Bitmap recycle 과 Drawable callback 을 null 로 맞추어서 해결할 수 있습니다만,
겔러리나 리스트뷰의 경우 ListAdapter 에서 생성하는 View 를 제대로 unbind 를 해주지 않는다면 메모리 문제가 발생할 수 있습니다.

특히 BitmapDrawable 과 NinePatchDrawable 을 명확하게 구분해서 사용해야 하는데,
메모리를 많이 사용하는 어플의 경우 힙 사이즈 제한으로 인해 bitmap 을 개발자가 create / recycle 하면서 메모리를 관리하게 되는데,
NinePatchDrawable 을 사용한 경우 해당 bitmap 을 개발자가 recycle 할 수 있는 방법이 없기 때문에
bitmap create / recycle 이 필요한 경우 BitmapDrawable 을 사용해야 하는 경우가 있습니다.

또한 ListAdapter 의 경우, 항상 view 를 새로 생성하는 방식은 피해야 하며,
일반적으로 convertView 를 사용하지만, 때에 따라서 개발자가 직접 view instance 를 관리하는게
메모리 관리에 있어서는 더 명확해 보일 수도 있습니다.

또한 activity 의 onPause 에서 메모리를 해제할 것들과 onDestroy 에서 메모리를 해제할 것들을 구분해야 하며,
activity 를 start 할 때 flag 를 어떻게 줄 것인지도 같이 고민을 해야
background 에 있는 activity 의 메모리로 인해, 현재 activity 에서 out of memory 가 발생하는 문제도 해결 할 수 있을 것입니다.

감사합니다.
http://floo.co.kr


저작자 표시 비영리 변경 금지
신고

JAVA - Android Audio record and playback is corrupt

Program/Android 2010.11.11 16:28

음성 받아 드려서 어느 정도의 소리 이상일 경우 이벤트를 발생 하려고 구글링 해서 본 소스 입니다.



I am trying to record a pcm sound file and play it back. When I play it back, it sounds slow and takes longer than it did to record. I'm not sure if the error is in the record or play code. Any ideas what the problem is?

I largely copied code from this example: http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

Here is the record code (isRecording flag is set by stop button in gui thread).

 android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
       
int sampleRateInHz = 8000;//8000 44100, 22050 and 11025 
       
int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
       
int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
 
       
File sd = Environment.getExternalStorageDirectory(); 
       
File file = new  File(sd, "msg.wav"); 
 
       
if (file.exists()) 
            file
.delete(); 
 
       
try { 
            file
.createNewFile(); 
       
} catch (IOException e) { 
           
Log.e("create file:", e.toString()); 
       
} 
 
       
try { 
 
           
OutputStream os = new FileOutputStream(file); 
           
BufferedOutputStream bos = new BufferedOutputStream(os); 
           
DataOutputStream dos = new DataOutputStream(bos); 
 
           
int bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz,channelConfig, audioFormat); 
           
short[] buffer = new short[bufferSize]; 
            audioRecord
= new AudioRecord(MediaRecorder.AudioSource.MIC,  
                    sampleRateInHz
,channelConfig, audioFormat,bufferSize); 
 
            audioRecord
.startRecording(); 
 
            isRecording
= true; 
           
while (isRecording) { 
               
int bufferReadResult = audioRecord.read(buffer, 0, bufferSize); 
               
for (int i = 0; i < bufferReadResult; i++)  
               
{ 
                    dos
.writeShort(buffer[i]); 
               
} 
           
} 
            dos
.close(); 

This is the play code.

  File file = new File(SendAlert.voiceFile); 
         
// Get the length of the audio stored in the file (16 bit so 2 bytes per short) 
         
// and create a short array to store the recorded audio. 
         
int musicLength = (int)(file.length()/2); 
         
short[] music = new short[musicLength]; 
 
 
         
try { 
           
// Create a DataInputStream to read the audio data back from the saved file. 
           
InputStream is = new FileInputStream(file); 
           
BufferedInputStream bis = new BufferedInputStream(is); 
           
DataInputStream dis = new DataInputStream(bis); 
 
           
// Read the file into the music array. 
           
int i = 0; 
           
while (dis.available() > 0) { 
              music
[i] = dis.readShort(); 
              i
++; 
           
} 
 
 
           
// Close the input streams. 
            dis
.close();      
 
 
           
// Create a new AudioTrack object using the same parameters as the AudioRecord 
           
// object used to create the file. 
           
AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,  
                                                   
8000,  
                                                   
AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                                                   
AudioFormat.ENCODING_PCM_16BIT,  
                                                   musicLength
,  
                                                   
AudioTrack.MODE_STREAM); 
           
// Start playback 
            audioTrack
.play(); 
 
           
// Write the music buffer to the AudioTrack object 
            audioTrack
.write(music, 0, musicLength); 


buffer[i] 를 log 찍어 보시면 소리 db 따라 값이 출력 됩니다.


출처 - http://efreedom.com/Question/1-3604419/Android-Audio-Record-Playback-Corrupt

저작자 표시 비영리 변경 금지
신고

안드로이드 얼굴 인식

Program/Android 2010.10.08 11:16
FaceDetector.Face[] faces = new FaceDetector.Face[10];     // 최대 인식할 얼굴수 설정
02.FaceDetector detector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), faces.length);
03.int numFaces = detector.findFaces(bitmap, faces);     // 얼굴 인식 실행
04.for(FaceDetector.Face face : faces) {
05.PointF midPoint = new PointF();
06.face.getMidPoint(midPoint);            //눈과 눈사의 가운데 지점
07.float eyesDistance = face.eyesDistance();    //눈과 눈사이의 거리
08.//처리.
09.}
android 에 faceDetector


sample
http://d.hatena.ne.jp/bols-blue/20090818/1250562668
http://blog.livedoor.jp/deeds_not_words/archives/624855.html
http://www.anddev.org/quick_and_easy_facedetector_demo-t3856.html
저작자 표시 비영리 변경 금지
신고

안드로이드 단말(기기) 모델(기종) 정보 뽑아 오기

Program/Android 2010.08.27 11:20
안드로이드 폰의 기기 모델별 정보 뽑아 오기


private void DeviceInfo(){
Log.e("BOARD", Build.BOARD);
Log.e("BRAND", Build.BRAND);
Log.e("CPU_ABI", Build.CPU_ABI);
Log.e("DEVICE", Build.DEVICE);
Log.e("DISPLAY", Build.DISPLAY);
Log.e("FINGERPRINT", Build.FINGERPRINT);
Log.e("HOST", Build.HOST);
Log.e("ID", Build.ID);
Log.e("MANUFACTURER", Build.MANUFACTURER);
Log.e("MODEL", Build.MODEL);
Log.e("PRODUCT", Build.PRODUCT);
Log.e("TAGS", Build.TAGS);
Log.e("TYPE", Build.TYPE);
Log.e("USER", Build.USER);
}
저작자 표시 비영리 변경 금지
신고

[Android] BitmapDrawable과 Bitmap

Program/Android 2010.05.20 10:34

 

출처 : http://blog.vizpei.kr/105116344 

 

[Intro]

 

보통 BitmapFactory의 decode 함수들은 메모리 Leak이 존재한다고 알려져 있습니다.

(2.1에서 수정이 되었는지 아직도 그대로인지는 잘 모르겠습니다.)

 

실제로 안그럴지 몰라도,

decode를 하면 할 수록 메모리 Leak의 위험부담은 더 커지기 마련이죠.

제가 처음에 Drawable을 Bitmap으로 바꿀 때 BitmapFactory를 사용 했었습니다.

 

정확히 말하면 Drawable을 Bitmap으로 바꾼 것이 아니라

RawResourceInputStream으로 얻어와서 BitmapFactory로 decode한 것이었죠.

Bitmap bitmap;
InputStream stream;
stream = context.getResources().openRawResource(resource);
try {
    bitmap = BitmapFactory.decodeStream(stream);

finally {
    try { stream.close(); } 
    catch(IOException e) {}
}

하지만 위의 코드는 계속 BitmapFactory를 호출 하기 때문에

잠재적인 위험을 가지고 있습니다.

 

그렇다면 리소스로 부터 Bitmap을 얻어내고 싶다면 어떻게 해야 할까요?

 

 

[Googling...]

 

일단 포스팅 하기전에 구글링을 좀 해봤습니다.

상위 몇개의 검색 결과를 살펴보니...

 

구글링으로 살펴본 결과들은 대부분 아래와 같이 되어있었습니다.

Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, w, h);
drawable.draw(canvas);

1. 빈 Bitmap을 만들고

2. Canvas를 연결 한 뒤

3. Drawable의 draw메소드를 통해 Bitmap과 연결된 Canvas에 Drawable의 내용을 그립니다.

 

물론 이 방법이 틀린 것은 아닙니다.

하지만 만들어 줘야 하는것이,

 

1. Drawable 크기만한 빈 Bitmap

2. Bitmap에 연결할 Canvas

3. 크기를 가지는 Width, Height 변수

 

Drawable 객체를 제외하고 두개의 객체두개의 변수를 더 만들어야 합니다.

중간에 setBounds() 메소드도 호출 해야 겠죠.

 

근데 여기서 한가지 잘 생각해 봐야 할 것이 있습니다.

View안에서는 Drawable을 잘 사용해서 이미지를 표시해 주고 있다는 점입니다.

Layout XML 파일 안에서 ImageView의 이미지를 지정해 줄 때

Drawable을 잘~ 사용해왔다는 것이 하나의 예가 될 수 있겠네요.

 

그렇다면 Drawable이 당연히 Bitmap을 가지고 있어야 하지 않을까요?

 

 

[BitmapDrawable]

 

질문에 대한 답은 바로 BitmapDrawable에 담겨있습니다.

아래의 코드를 보시죠!

BitmapDrawable drawable =
            (BitmapDrawable) getResources().getDrawable(R.drawable.icon);
Bitmap bitmap = drawable.getBitmap();

읭...? 이게 끝입니다.

BitmapDrawable을 사용하면 Bitmap을 손쉽게 얻어 올 수 있습니다.

위의 길고 긴 코드가 단 두 줄로 줄어 들었습니다.

 

따로 Bitmap을 만들지 않아도 됩니다.

그냥 Drawable안에 있는 Bitmap을 사용하기만 하면 됩니다.

 

 

[주의사항!]

 

BitmapDrawable을 사용하면 손쉽게 Bitmap을 얻을 수는 있지만,

Drawable이 꼭 BitmapDrawable만 존재 하는 것은 아닙니다.

대표적인 예로 ShapeDrawable이 있을 수 있겠네요.

ShapeDrawable을 사용하면 원하는 도형(Shape 객체)을 Drawable로 사용 할 수 있습니다.

 

하지만 getBitmap() 메소드가 없기 때문에

ShapeDrawable로 부터 Bitmap을 얻어 올 수는 없습니다.

굳이 도형을 Bitmap으로 바꾸고 싶다면 위에서 봤던 빈 Bitmap과 Canvas를 만들어서

draw() 메소드를 통해 그리는 방법 밖에는 없습니다.

 

아마도 대부분의 경우 drawable 디렉토리에 있는 이미지들을 Bitmap으로 사용하려고 하지,

Shape을 Bitmap으로 사용하려고 하지는 않을 거라 생각합니다.

네네... 그럴겁니다...

 

 

[BitmapDrawable Bitmap의 특징]

 

BitmapDrawable에서 얻어온 Bitmap 객체는 보통녀석이 아닙니다.

특징을 한번 살펴 봅시다.

 

1. 우선, Bitmap을 얻어 올 때는 final 입니다.

 

레퍼런스에 보면 final로 선언되어 있습니다.

즉, 변경하지 않겠다는 의지를 표현 한 것이죠.

사실 리턴에 final을 붙여봤자 대입되는 변수와는 아무 상관이 없습니다... 네... 넘어가죠.

 

2. Immutable 입니다.

 

좀 더 강력한 녀석이 나왔습니다. Immutable, 즉, 변경 불가입니다.

Canvas canvas = new Canvas(bitmap);

만약 위와 같은 시도를 한다면, 아래와 같은 Exception이 발생 할겁니다.

Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor

3. 절대 recycle() 메소드를 호출 해서는 안됩니다!

 

Bitmap을 얻어와서 그릴거 다 그렸다고 무의식적으로 recycle() 메소드를 호출 했다...

그럼 아래와 같은 메세지를 볼 수 있습니다.

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@43774438

위의 상황은 ImageView 같은데서 사용하고 있던 Drawable의 Bitmap 객체를 얻어와서

그 Bitmap 객체에 recycle() 메소드를 호출 한 상황입니다.

한마디로 Bitmap 객체를 공유해서 사용한다고 볼 수 있겠죠.

 

 

[One more Tip - Bitmap copy]

 

그렇다면 BitmapDrawable로 부터 얻어낸 Bitmap 객체를

마음대로 바꾸고, 쓰고, 버리고 싶다면 어떻게 해야 할까요?

 

그냥 copy() 하면 됩니다.

Bitmap bitmap = drawable.getBitmap().copy(Config.ARGB_8888, true);

Mutable로 복사하면 마음대로 변경해서 사용 할 수 있습니다!

 

 

[Outro]

 

이번에는 BitmapDrawable과 Bitmap에 대해서 살짝 살펴보았습니다.

 

앞에서는 BitmapDrawable을 Bitmap으로 바꾸는 이야기만 했었지만,

반대로 Bimap을 Drawable로 바꾸고 싶다면

BitmapDrawable의 생성자를 사용하면 간단히 Drawable로 만들 수 있습니다.

 

물론 구글링해서 찾은 방법이 틀린 방법은 아닙니다.

이미지와 관련이 없는 Drawable을 다루고자 할 때는

번거롭게도 draw() 메소드를 이용 해야 하는것이 맞지만,

이미지와 관련된 Drawable을 다루고자 할 때는 분명 BitmapDrawable을 사용하는 것이 더 편합니다.

 

네... 제가 하고 싶은말은 그겁니다.

이미지 파일 힘들게 바꾸지 맙시다!

저작자 표시 비영리 변경 금지
신고