Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

String[] projection = new String[] {

String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.PHOTO_ID, ContactsContract.Data.RAW_CONTACT_ID };

Cursor contactCursor = managedQuery(uri, projection, null, null, null);
사진 가져오기 
contactId = ContactsContract.CommonDataKinds.Phone.CONTACT_ID의 값

public Bitmap getPhoto(Long contactId) {
Uri contactPhotoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
InputStream photoDataStream =                                             Contacts.openContactPhotoInputStream(getContentResolver(),contactPhotoUri); 
Bitmap photo = BitmapFactory.decodeStream(photoDataStream);
return photo;
}

연락처 사진 변경.
rawContactId = ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID 의 값

public static void setContactPhoto(ContentResolver c, byte[] bytes, long rawContactId) {

ContentValues values = new ContentValues();
int photoRow = -1;
String where = ContactsContract.Data.RAW_CONTACT_ID + " = " + rawContactId + "                     AND " + ContactsContract.Data.MIMETYPE + "=='" +             ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
Cursor cursor = c.query(ContactsContract.Data.CONTENT_URI, null, where, null, null);
int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID);
if (cursor.moveToFirst()) {
photoRow = cursor.getInt(idIdx);
}
cursor.close();

values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
if (photoRow >= 0) {
c.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null);
} else {
c.insert(ContactsContract.Data.CONTENT_URI, values);
}

}

Posted by 천류성

ICS부터 android.provider.calendar 접근이 가능해 Canlendar DB를 사용하기 쉽다. 

calendar provider를 접근하지 못하는 이전 버전에서의 사용법. 

2.2 이상인 경우 
String targetProvider = "com.android.calendar"
2.2 미만인 경우 
String targetProvider = "calendar" 

ContentResolver contentResolver = getContentResolver();
String eventUri = String.format("content://%s/events", targetProvider);
String selectUri = String.format("content://%s/", targetProvider); 

//검색
Cursor cursor = contentResolver.query(Uri.parser(selectUri+"/calendars"), ......);
 //입력, 수정, 삭제
Uri uri =  ContentUris.withAppendedId(Uri.parse(eventUri), id));
contentResolver.update(uri, ....); 

All day추가 시
UTC 타임으로 추가 되며 당일 00시00분 부터 다음날 00시 00분으로 추가 됨.

 반복 이벤트 추가 시 
 rrule(icalendar 규칙) 과 반복 되는 시간 duration column을 추가.

 반복 이벤트 수정 시 
instance table의 start 시간과 _sync_id 컬럼을 이용해 originalInstanceTime, originalEvent 를 채움.
반복 이벤트 수정, 삭제 동작은 event table에 상황에 맞는 이벤트 추가로 반영 됨.(수정, 삭제 -> event row 추가)
Posted by 천류성


Posted by 천류성


Posted by 천류성


Posted by 천류성


Posted by 천류성
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float step  = e2.getX() - e1.getX();
float dest = (step*2);                          // 좌/우  Flicking 시 +/-로 변경 됨.
return super.onFling(e1, e2, dest, velocityY);
}

붉은 부분의 연산은 상황에 맞도록 수정 하시면 됩니다.
 
Posted by 천류성

프로젝트 초기 배경이 없는 이미지를 Composite에 투명이미지를 올려 놓으면 Composite의 태두리가 남아 투명한 이미지를 사용하지 못했다.

Composite의 시작 좌표부터 크기만큼 Composite이 올라가는 배경이미지를 그린다음 Composite에 투명 이미지를 그려서 투명한 효과를 냈다.

그렇게 사용하다 SWT API를 보니 TRANSPARENT를 발견했다.
SWT 3.4버전 부터 사용가능한 투명화 메소드.

사용방법도 간단하다 SWT style에 SWT.TRANSPARENT를 추가하면 Composite에 한해 투명해지게 된다.

label은 투명이 안된다. 1~2개월 전에 테스트 했으니 지금도 안될 것 같다.

SWT는 Swing과 달리 개발 진행이 한창인 것 같다.

Posted by 천류성

이번 프로젝트를 진행하면서 SWT에 대해 많은 부분을 알게되었다.

많은 삽질을 통해 많은 걸 배웠는데. 정리 할 시간없이 내 기억속에서 사라져간 내용들이 많다.

먼저 동적 이미지 사용하기.

Swing은 동적 이미지 .gif를 불러오면 동적 이미지를 사용 할 수있다.

SWT는 gif파일을 불러오면 정지된 이미지를 불러온 것과 같은 이미지가 나온다. 결론은 움직이는 gif파일이 자기 역활을 못 한다.
이유는 생각 할 시간이 없었다. -_-;; 코피터지는 일정에 안되니까 되는 방법을 찾았다.

이미지를 순차적으로 그려주면 된다.
이걸 파일로 만들어 둔게 움직이는 이미지 파일이니까.

먼저 움직이는 이미지를 표현할 이미지들이 필요하다.

Composite을 상속받은 클래스를 생성하고 

 private void initImg() {
  this.setSize(35, 35);
  setLayout(null);

  img = new Image[6];

  img[0] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_1();
  img[1] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_2();
  img[2] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_3();
  img[3] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_4();
  img[4] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_5();
  img[5] = ImageFile.get_DeviceIcon_CoolingTowar_Run_FAN_6();


  if(!compo.isDisposed()){
   this.addPaintListener(new PaintListener() {
    public void paintControl(PaintEvent e) {
     if (null != frameImage) {
      e.gc.drawImage(frameImage, 0, 0);
     }
    }
   });

  }
 }
 public void setData(int ImageNum){
  if(ImageNum < 7){
   frameImage = img[ImageNum];
  }
 }
<이 코드는 프로젝트 진행중에 작성된 코드의 일부분이다.>

배열이 이미지를 등록해두고 Thread가 동작하면서 frameImage에 차래로 이미지를 끼우고 그 이미지를 Canvas에 있는 gc가 그려준다.

Thread의 모습

 private synchronized void threadExe() {
  while (flag) {
   try {
    Thread.sleep(500);
   } catch (InterruptedException e) {
    
   }
   try{

    if (!_fanMoveImage.isDisposed()) {
     _fanMoveImage.getDisplay().asyncExec(new Runnable() {
      public void run() {

       if (!_fanMoveImage.isDisposed()) {
        _fanMoveImage.setData(j);
        _fanMoveImage.redraw();
       }
       // }
      }
     });
    }
   }catch(SWTException e){
    e.printStackTrace();
   }
    j = j + 1;
    if (j == 6) {
    j = 0;
    }
  }
 }
 
 public void setCoolingTowerFanStatus(boolean flag){
  this.flag = flag;
  
 }

  _fanMoveImage.setData(j); 순차적으로 숫자를 setData에 넣음으로 frameImage에 이미지가 변경된다. 그리고 외부에서 flag를 제어 함으로 Thread를 멈출 수 있게한다.

SWT를 많이 사용해 보고 프로젝트를 진행한게 아니라 프로젝트 진행을 하면서 SWT에 대해서 배우고있다.

아직은 SWT의 장점을 잘 모르겠다. 익숙한 Swing으로 했다면 지금 불편하게 작성한 코드들을 좀더 쉽게 작성했지 않았나라는 생각을 한다.
SWT를 잘 다루는 사람들의 책을 읽고 그들의 방식대로 사용을 해 본후의 생각은 지금의 생각과 다를 거라고 생각을해본다.

Posted by 천류성


     Runnable longJob = new Runnable() {
             boolean done = false;

             int id;

             public void run() {
               Thread thread = new Thread(new Runnable() {
                public void run() {
                   display.syncExec(new Runnable() {
                     public void run() {
                      try{
                       Thread.sleep(5000);
                      }catch(Exception e){
                      
                      }
                     }
                   });

                   done = true;
                   display.wake();
                 }
               });
               thread.start();
               while (!done && !compo.isDisposed()) {
                 if (!display.readAndDispatch())
                   display.sleep();
               }
             }
           };
           BusyIndicator.showWhile(display, longJob);


출처 : Java2s.com
본문에서 약간 수정한 부분이 있습니다.

Posted by 천류성
이전버튼 1 2 3 4 이전버튼

블로그 이미지
.....
천류성

태그목록

공지사항

Yesterday64
Today8
Total15,421

달력

 « |  » 2018.08
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

최근에 달린 댓글

최근에 받은 트랙백

글 보관함


티스토리 툴바