레이블이 SmartPhone Programming인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SmartPhone Programming인 게시물을 표시합니다. 모든 게시물 표시

2011년 1월 15일 토요일

LBSC (Location Based Search Call) Manual

 

 

 

 

소개:

콜 링크 서비스를 이용하여, 현재 위치나 관심 위치로 등록된 위치로부터

업체를 검색하고 무료로 통화를 지원해주는 안드로이드 애플리케이션입니다.

 

사용법:

<북 마크>:

원하는 업체는 신속하게 무료통화 연결을 위해 북 마크 기능을 제공해줍니다.

그리고 사용자만 알 수 있는 정보를 바탕으로 업체 명을 변경 가능합니다.

리스트를 누르게 되면 콜 링크 서비스를 이용 할 수 있습니다.

 

 

 

 

<업체 검색>:

현재 위치, 관심 위치 검색기능

위치가 선택되면 해당 지역의 주소가 시, 구, 동까지 주소란에 표시가 됩니다.

검색은 직접 입력하거나, 음성검색이 가능하고,

검색된 업체의 수는 검색 결과란에 표시되고, 다이얼로그로 결과는 띄어줍니다.

 

 

 

 

 

 

 

 

<업체 검색 결과 목록>:

검색된 업체를 리스트로 보여줍니다.

리스트를 클릭하면 콜 링크 서비스를 이용하실 수 있습니다.

하트에 화살 박힌 버튼을 클릭하면 북 마크 추가가 가능합니다.

 

 

 

<지도 보기>:

지도 보기를 통하여, 지정한 위치와 업체의 위치를 확인 할 수 있습니다.

메뉴 버튼의 메뉴를 이용하여, 현재 위치나 검색위치로 이동 할 수 있습니다.

지도위의 마커를 누르게 되면 그에 해당하는 정보를 다이얼로그로 보여주게 합니다.

 

 

 

<설정>:

본 애플리케이션의 정보나 콜 링크 수신 전화의 번호 설정 및 글씨체 변경 설정

지도 보기에서 위성모드, 줌 오버레이 설정이 가능하고,

에러에 대한 문의 문자를 보낼 수 있습니다.

 

 

 

 

 

 

 

2011년 1월 7일 금요일

[Android] View in Tag (View의 Tag활용 법)

 

 

 

 

 

 

Holder Pattern 사용하면서 알게된 Tag..이럴수가..

나는 그동안 뭘 하고 있었던가...........싶네요..

다음 부터는 태그를 많이 사용해야겟어요 !! -_ -v

 

 

[Intro]

 

오늘은 별거 아닌 팁 하나 포스팅 해봅니다.
정말 별거 없답니다. 아하하...

 


[Data in View]

 

가끔 어플리케이션을 만들다 보면 View안에 어떤 데이터를 집어 넣고 싶을 때가 종종 있습니다.
네... 있지요. 그런 경우 그냥 무작정 떠올릴 수 있는 방법은 extends 해버리는 겁니다.
OOP의 최대 장점이지요.

 

Id, Name, Address 세개의 정보를 View안에 담고 싶다고 한다면
아마 다들 아래와 같이 클래스를 만드실 겁니다.

 


public class CustomView extends View {
   
    private int mId;
    private String mName;
    private String mAddr;

 

    public CustomView(Context context) {
        super(context);
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
   
    public int getId() { return mId; }
    public void setId(int id) { mId = id; }
   
    public String getName() { return mName; }
    public void setName(String name) { mName = name; }
   
    public String getAddress() { return mAddr; }
    public void setAddress(String addr) { mAddr = addr; }
   
}

 


별로 복잡하지 않은 구조입니다.
달랑 필드 세개에 get / set 메소드 하나씩 달려 있는 모양이지요.
사용법은 아래와 같이 그냥 get / set 메소드를 사용 하면 되는 겁니다.

 


CustomView customView = new CustomView(this);
customView.setId(1);
customView.setName("vizpei");
customView.setAddress("somewhere");

 


이와 같은 방법은 단순히 get/set 만 하지 않고 뭔가 좀더 복잡한 operation을 하는 경우에
아주 유용하게 쓰는, 그냥 평범하게 생각 할 수 있는 customization 이지요.

 


[Tag in View]

 

android.view.View, 즉 모든 View들의 상위에 있는 View 클래스에는
getTag() / setTag() 를 사용하여 View에 Tag를 붙일 수 있습니다.
Tag는 Object 타입이라 아무거나 다 들어 갈 수 있지요.
그냥 시시한 값 하나 넣을 수도 있지만 복잡한 클래스 인스턴스도 가볍게 넣을 수 있습니다.

 

아까 넣고 싶었던 데이터들을 일단 하나의 클래스로 만들어 봤습니다.
필드를 private로 만들고 get / set 메소드 만들어도 되지만 그냥 public으로 해버렸습니다.
어차피 그냥 데이터 저장용이니까요.

 


private class PersonInfo {
    public int id;
    public String name;
    public String addr;
}

 


이제 PersonInfo 인스턴스를 만들고 View.setTag()로 집어 넣어주면 땡입니다.

 


PersonInfo pi = new PersonInfo();
pi.id = 1;
pi.name = "vizpei";
pi.addr = "somewhere";
       
View view = new View(this);
view.setTag(pi);

 


사용할때는 View.getTag() 로 가져오면 역시 땡이지요.

 


PersonInfo pi = (PersonInfo) view.getTag();

 


알면 유용하게 쓸 수 있지만, 모르면 맨날 extends만 하고 있을지는 모르는 일입니다.

 


[Appendix]

 

뭐 별로 쓴적은 없지만...
View.findViewWithTag() 를 사용하면 Tag로 View를 찾을 수 있답니다.
View.findViewById()로만 View를 찾을 수 있는건 아니란 것이지요.

 

다만 View.findViewWithTag()는 Object.equals() 비교를 하니
요것만 주의해서 사용 하시면 될 것 같습니다.

 

 

 

 

[출처] - http://blog.vizpei.kr/86999387

 

 

 

 

 

 

 

[Android] Worker Thread AND ProgressDialog Veiw

 

 

 

 

 

private ProgressDialog loagindDialog; // Loading Dialog

//스레드

 void createThreadAndDialog() {
        // ProgressDialog //
        loagindDialog = ProgressDialog.show(this, "Connecting",
                "Loading. Please wait...", true, false);
       
        Thread thread = new Thread(new Runnable() {
            public void run() {
                // 시간걸리는 처리
                handler.sendEmptyMessage(0);
            }
        });
        thread.start();
    }

 

//핸들러
  private Handler handler = new Handler() {
         public void handleMessage(Message msg) {
             loagindDialog.dismiss(); // 다이얼로그 삭제
             // View갱신
         }
     };
     
 
 createThreadAndDialog(); // 진행바 호출

 

 

 

 

 

 

 

 

 

2011년 1월 5일 수요일

[Android] Custom Toast

 

 

 

 

커스터 마이징한 토스트 만들기..

은근 쉽다는..

 

//함수 바디 부분

 

//커스터마이징된 토스트를 띄우는 부분
 private void customToastShow(int img, CharSequence text) {
  TextView tv = new TextView(this.getApplicationContext());
  tv.setText("\t" + text + "\n");
  tv.setTextSize(15);
  tv.setTextColor(Color.BLACK);
  LinearLayout ll = new LinearLayout(this.getApplicationContext());
  ll.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  //NOTICE 그림
  if(img == 1) {
   ll.setBackgroundResource(R.drawable.notice);
  }
  ll.setGravity(Gravity.CENTER);
  ll.addView(tv);
  Toast t = Toast.makeText(this.getApplicationContext(), "", Toast.LENGTH_LONG);
  t.setGravity(Gravity.CENTER, 0, 0);
  t.setView(ll);
  t.show();
 }

 

 

//함수 호출 부분

 

 customToastShow(1, "쏼라쏼라~");

 

 

 

 

 

 

 

 

 

2011년 1월 3일 월요일

[Android] Geocoder and Reverse Geocoding

 

 

1. Geocoder
- 주소를 가지고 latitude와 longitude를 얻어내는 방법

 

 

 

2. Reverse Geocoding
- latitude와 longitude를 가지고 주소를 얻어내는 방법

 

 

 

 

 

 

 

 

 

 

 

 

2011년 1월 2일 일요일

[Android] MapView에 나침반 띄우는 방법

 

 

 

 

안드로이드에 API를 너무 잘 제공해 주기에..

OnResume()에 다음 부분을 넣고,

 

  /* 맵뷰에 나침반 띄우기 */
  MyLocationOverlay mylocationoverlay = new MyLocationOverlay(this, mapView);
  List<Overlay> listOfOverlays.add(mylocationoverlay);
  mylocationoverlay.enableCompass();
  mylocationoverlay.enableMyLocation(mapView.getMapController());

 

 

OnPause()부분에 나침반을 종료하는 코드를 넣어주도록 한다.

mylocationoverlay.disableMyLocation();

mylocationoverlay.disableCompass();

 

이런식으로 구현완료 -_ -v

 

 

 

 

 

 

 

 

 

2010년 12월 26일 일요일

[Android] TextView 긴 문장 움직여서 보여주기

 

 

 

 

 

안드로이드 개발하다보면 TextView 의 사이즈보다 Text가 더 길 경우가 생기게 됩니다

 

그럴때 특정 영역에 Text를 모두 보여줄 수 가 있는데 텍스트를 왼쪽으로 움직이면서

 

전체 Text를 보는 방법을 알아 보도록 하겠습니다.

 

사용 예)

xml의 속성값으로

 

android:singleLine="true"
android:ellipsize="marquee"
를 주고

 

자바 코드에서는

 

TextView text = (TextView)findViewById(R.id.text);
text.setSelected(true);

 

이런식으로 선택을 해줘야 합니다.

선택되어진 TextView여야 제대로 동작한다는 걸 알 수 있습니다^^

 

 

 

 

 

 

 

 

 

 

 

2010년 12월 20일 월요일

[Android] 화면전환 막기, 가로 세로 화면 설정하기

 

 

 

 

 

 

가로, 세로 화면전환시 실행되고 있는 어플이 초기화 onCreate를 불러들여서,

스레드 돌리다가 뻑나는 경우가 생긴다.



매니페스트 파일내에서 화면전환 방향을 변경할 수 있다.
portrait를 선택하면 세로보기만 된다.



 
 


아니면 Activity 내에서 아래 코드로 화면전환시 할일을 정해주면 된다.


public void onConfigurationChanged(Configuration newConfig) {
		// TODO Auto-generated method stub
		super.onConfigurationChanged(newConfig);
		if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
				할일들.....
		}
	}





[출처] - http://stbaeya.com/tc/240?category=45
 

2010년 12월 16일 목요일

[Android] Selector 사용하기

 

 

 

 

버튼에 대한 이벤트마다 이미지를 변경 시켜주기위해

각각의 터치이벤트에 따라 변경 해주는 귀찮은 작업을

좀더 수월하게 처리해주는 것이 있는데 그건 바로 Selector !

 

res -> drawable-hdpi 폴더에 파일을 하나 생성한다

여기서 파일은 xml확장자를 주어야 한다.

 

 

//on_selector.xml 파일

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- Non focused states -->
    <item android:state_focused="false"
        android:state_selected="false"
        android:state_pressed="false"
        android:drawable="@drawable/off" />
 
 <!-- Focused states -->
     <item android:state_focused="false"
        android:state_selected="true"
        android:state_pressed="false"
        android:drawable="@drawable/on" />
    <item android:state_focused="true"
        android:state_selected="false"
        android:state_pressed="false"
        android:drawable="@drawable/on" />
    <item android:state_focused="true"
        android:state_selected="true"
        android:state_pressed="false"
        android:drawable="@drawable/on" />

 

 <!-- Pressed -->
    <item android:state_pressed="true"
     android:drawable="@drawable/on" />
</selector>

 

 

각각 아이템마다 3가지 형태에 따라 이미지를 지정해주고

 

<Button
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:background="@drawable/on_selector"
     />

 

 

나중에 버튼에 대한 백그라운드 이미지에 xml파일을 지정해주면 된다.

셀렉터 너무 좋다 +_+;;ㅋㅋ

 

 

 

 

 



 

 

[Android] failed to install .apk on device Unable to open sync connection! 오류

 

 

 

 

 

이런 에러가 뜨는경우

디바이스적 문제가 있다고 보면 된다

해결법으론 어떤분들은 전면에 꼽힌 USB를 후면에 꽂으니까 없어졌다.

그렇게 말씀하시는데 간단하게 USB를 뺏다 꽂으면 해결 되는거 같다!

 

 

 

 

 

 

2010년 12월 12일 일요일

[Android] GPS 위도/경도를 이용한 두지점 거리계산 총집합!

 

 

 

 

 

 

GPS를 이용한 두지점간 거리계산 방법입니다.

 

안드로이드에서 기본적으로 제공해주는 직선거리 구하는 방법

지구는 타원으로 되어있기에 가까운지역인 경우 오차가 없지만,

거리가 멀어지면 오차가 발생하는걸 알 수 있습니다.

 

방법1.

 

double distance;
 
Location locationA = new Location("point A");
 
locationA.setLatitude(latA);
locationA.setLongitude(lngA);
 
Location locationB = new Location("point B");
 
locationB.setLatitude(latB);
LocationB.setLongitude(lngB);
 
distance = locationA.distanceTo(locationB);

 

 

 

방법2.

float[] results = new float[3];
Location location = new Location("start");
location.distanceBetween(
startLatitude, 
startLongitude, 
endLatitude,
endLongitude,
results);
Sring mes = Float.toString(results[0]);
 
===============================================================================
The computed distance is stored in results[0]. 
If results has length 2 or greater, the initial bearing is stored in results[1].
If results has length 3 or greater, the final bearing is stored in results[2].
 
 
국토지리원에서 공개한 거리계산 함수 사용하기.
지구는 완전한 구라는 가정하에 지구를 GRS80타원체로 봤을경우
두지점간 거리와 방위각 구하는 소스
 
//거리 구하는 부분
 public double distance(double P1_latitude, double P1_longitude,
   double P2_latitude, double P2_longitude) {
  if ((P1_latitude == P2_latitude) && (P1_longitude == P2_longitude)) {
   return 0;
  }
  double e10 = P1_latitude * Math.PI / 180;
  double e11 = P1_longitude * Math.PI / 180;
  double e12 = P2_latitude * Math.PI / 180;
  double e13 = P2_longitude * Math.PI / 180;
  /* 타원체 GRS80 */
  double c16 = 6356752.314140910;
  double c15 = 6378137.000000000;
  double c17 = 0.0033528107;
  double f15 = c17 + c17 * c17;
  double f16 = f15 / 2;
  double f17 = c17 * c17 / 2;
  double f18 = c17 * c17 / 8;
  double f19 = c17 * c17 / 16;
  double c18 = e13 - e11;
  double c20 = (1 - c17) * Math.tan(e10);
  double c21 = Math.atan(c20);
  double c22 = Math.sin(c21);
  double c23 = Math.cos(c21);
  double c24 = (1 - c17) * Math.tan(e12);
  double c25 = Math.atan(c24);
  double c26 = Math.sin(c25);
  double c27 = Math.cos(c25);
  double c29 = c18;
  double c31 = (c27 * Math.sin(c29) * c27 * Math.sin(c29))
    + (c23 * c26 - c22 * c27 * Math.cos(c29))
    * (c23 * c26 - c22 * c27 * Math.cos(c29));
  double c33 = (c22 * c26) + (c23 * c27 * Math.cos(c29));
  double c35 = Math.sqrt(c31) / c33;
  double c36 = Math.atan(c35);
  double c38 = 0;
  if (c31 == 0) {
   c38 = 0;
  } else {
   c38 = c23 * c27 * Math.sin(c29) / Math.sqrt(c31);
  }
  double c40 = 0;
  if ((Math.cos(Math.asin(c38)) * Math.cos(Math.asin(c38))) == 0) {
   c40 = 0;
  } else {
   c40 = c33 - 2 * c22 * c26
     / (Math.cos(Math.asin(c38)) * Math.cos(Math.asin(c38)));
  }
  double c41 = Math.cos(Math.asin(c38)) * Math.cos(Math.asin(c38))
    * (c15 * c15 - c16 * c16) / (c16 * c16);
  double c43 = 1 + c41 / 16384
    * (4096 + c41 * (-768 + c41 * (320 - 175 * c41)));
  double c45 = c41 / 1024 * (256 + c41 * (-128 + c41 * (74 - 47 * c41)));
  double c47 = c45
    * Math.sqrt(c31)
    * (c40 + c45
      / 4
      * (c33 * (-1 + 2 * c40 * c40) - c45 / 6 * c40
        * (-3 + 4 * c31) * (-3 + 4 * c40 * c40)));
  double c50 = c17
    / 16
    * Math.cos(Math.asin(c38))
    * Math.cos(Math.asin(c38))
    * (4 + c17
      * (4 - 3 * Math.cos(Math.asin(c38))
        * Math.cos(Math.asin(c38))));
  double c52 = c18
    + (1 - c50)
    * c17
    * c38
    * (Math.acos(c33) + c50 * Math.sin(Math.acos(c33))
      * (c40 + c50 * c33 * (-1 + 2 * c40 * c40)));
  double c54 = c16 * c43 * (Math.atan(c35) - c47);
  // return distance in meter
  return c54;
 }
//방위각 구하는 부분
 public short bearingP1toP2(double P1_latitude, double P1_longitude,
   double P2_latitude, double P2_longitude) {
  // 현재 위치 : 위도나 경도는 지구 중심을 기반으로 하는 각도이기 때문에
  //라디안 각도로 변환한다.
  double Cur_Lat_radian = P1_latitude * (3.141592 / 180);
  double Cur_Lon_radian = P1_longitude * (3.141592 / 180);
  // 목표 위치 : 위도나 경도는 지구 중심을 기반으로 하는 각도이기 때문에
  // 라디안 각도로 변환한다.
  double Dest_Lat_radian = P2_latitude * (3.141592 / 180);
  double Dest_Lon_radian = P2_longitude * (3.141592 / 180);
  // radian distance
  double radian_distance = 0;
  radian_distance = Math.acos(Math.sin(Cur_Lat_radian)
    * Math.sin(Dest_Lat_radian) + Math.cos(Cur_Lat_radian)
    * Math.cos(Dest_Lat_radian)
    * Math.cos(Cur_Lon_radian - Dest_Lon_radian));
  // 목적지 이동 방향을 구한다.(현재 좌표에서 다음 좌표로 이동하기 위해서는 
  //방향을 설정해야 한다. 라디안값이다.
  double radian_bearing = Math.acos((Math.sin(Dest_Lat_radian) - Math
    .sin(Cur_Lat_radian)
    * Math.cos(radian_distance))
    / (Math.cos(Cur_Lat_radian) * Math.sin(radian_distance)));
  // acos의 인수로 주어지는 x는 360분법의 각도가 아닌 radian(호도)값이다.
  double true_bearing = 0;
  if (Math.sin(Dest_Lon_radian - Cur_Lon_radian) < 0) {
   true_bearing = radian_bearing * (180 / 3.141592);
   true_bearing = 360 - true_bearing;
  } else {
   true_bearing = radian_bearing * (180 / 3.141592);
  }
  return (short) true_bearing;
 }
 
 
이외 거리 구하는 참고자료는 첨부파일 참고해주세요~
 
 
 
 
 

2010년 12월 8일 수요일

[Android] 폰트(글씨체)변경 하기 (FontType Change)

 

 

 

 

 

 

안드로이드를 개발하다보면 제공해주는 글씨체가 3개밖에 없습니다.

그래서 보다 더 깔끔하고 이쁘게 꾸미기 위해

폰트를 변경하는 방법을 적어보도록 하겠습니다.

C:\WINDOWS\Fonts폴더에 보시면 윈도우에 제공해주는 폰트들이 있습니다.

그중에 아래 그림의 아이콘이 안드로이드에서 사용가능한 폰트파일 입니다.

 

 

 

 

 

 

원하시는 폰트를 복사해서

안드로이드 프로젝트에 assets/fonts 폴더 아래 넣어주게 합니다.

그리고

 

자바파일:
TextView tv=(TextView)findViewById(R.id.custom);
Typeface face=Typeface.createFromAsset(getAssets(), "fonts/폰트이름.ttf");

main.xml 파일:

<TextView
            android:id="@+id/custom"
            android:text="Hello, world!"
            android:textSize="20sp" />

 

 

이런식으로 폰트를 변경 할 수 있습니다.

현재는 TextView 단일 위젯만 변경이 가능하지만, 혹시 클래스나

레이아웃 전체를 변경 하실 수 있는 방법을 아시는 분은 좀 알려주세요 ㅠ.ㅠ

 

 

 

 

ps. 안드로이드로 사용가능한 폰트 몇개 올려둡니다.

 

 

 

 

 

 

 

 

 

 

 

 

[Android] 음성 인식 API 소스

 

 

 

 

구글링중에 음성인식 API를 사용해서 음성인식 하는 방법을 찾았다.

나름 인식률 80프로 이상 인거 같다..

인식률이 잘나오는 만큼 다방면에 사용될거 같은..

음성 입력후 패턴분석된 결과 리스트가 나열되는 소스이다.

 

 

voiceDemo.java 파일

 

 

public class voiceDemo extends Activity implements OnClickListener {
 private static final int REQUEST_CODE = 1234;
 private ListView mList;
 private ListView mDebug;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Button speakButton = (Button) findViewById(R.id.btn_speak);
  speakButton.setText("음성입력");
  mList = (ListView) findViewById(R.id.list);
  PackageManager pm = getPackageManager();
  List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
    RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
  if (activities.size() != 0) {
   speakButton.setOnClickListener(this);
  } else {
   speakButton.setEnabled(false);
   speakButton.setText("Recognizer not Present");
  }
 }

 public void onClick(View v) {
  if (v.getId() == R.id.btn_speak) {
   startVoiceRecognitionActivity();
  }
 }

 private void startVoiceRecognitionActivity() {
  try {
   Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
   intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
     RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
   intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
     "Free Form Language Model Demo");
   startActivityForResult(intent, REQUEST_CODE);
  } catch (ActivityNotFoundException ex) {
   Toast
     .makeText(voiceDemo.this, "Activity Not Found",
       Toast.LENGTH_LONG).show();
  }
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
   ArrayList<String> matches = data
     .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
   mList.setAdapter(new ArrayAdapter<String>(this,
     android.R.layout.simple_list_item_1, matches));
  }
  super.onActivityResult(requestCode, resultCode, data);
 }
}

 

 

 

 

 

 

main.xml 파일

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
 <TextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:paddingBottom="4dip" />
 <Button
 android:id="@+id/btn_speak"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/speak_button" />
 <ListView
 android:id="@+id/list"
 android:layout_width="fill_parent"
 android:layout_height="0dip" android:layout_weight="1" />
</LinearLayout>

 

 

 

2010년 12월 7일 화요일

[Android] 2.3 Platform SDK Update!!!

 

 

 

오늘 새벽에 2.3 생강빵 올라왓네요

 

http://developer.android.com/sdk/android-2.3.html

 

조금전에 확인하고 바로 SDK 업데이트 시켯지만..

 

잘못 햇는지 이런 오류뜨네요//

 

뭐 sdk폴더 위치 지정이 잘못된거 같은데.. 흠...

 

시간도 그렇고 자고 내일 일어나서 해야겟음..

 

여러분도 조심해서 업데이트 하시길..

 

 

 

 

 

 

 

 

 

Could not find
C:\..\tools\adb.exe!
Please check the Android plugin's preferences.

 

 

// 에러 원인을 찾았다..

문제는 이클립스 플러그인 (ADT)를 업데이트 하지 않았기 때문..

 

 

 

Eclipse 3.5 (Galileo) and 3.6 (Helios)
  1. Start Eclipse, then select Help > Install New Software....
  2. Click Add, in the top-right corner.
  3. In the Add Repository dialog that appears, enter "ADT Plugin" for the Name and the following URL for the Location:
    https://dl-ssl.google.com/android/eclipse/

    Note: If you have trouble acquiring the plugin, try using "http" in the Location URL, instead of "https" (https is preferred for security reasons).

    Click OK.

  4. In the Available Software dialog, select the checkbox next to Developer Tools and click Next.
  5. In the next window, you'll see a list of the tools to be downloaded. Click Next.
  6. Read and accept the license agreements, then click Finish.
  7. When the installation completes, restart Eclipse.

 

 

 

 

[Android] 어플리케이션 Process 를 얼추 죽이는 새로운 방법

 

 

 

프로세스를 정상종료 하려고 구글링 하다가 발견한 방법..

기존의 프로세스 죽이는 방법은 2.1까지만 지원되다가

2.2 부터는 아직까지 정확하게 프로세스를 정상종료 시키는 방법이 없다고 합니다.

하지만 거의(얼추) 죽이는 방법이 있다고 해서 포스팅 해봅니다.

 

 

 

 

public void requestKillProcess(final Context context){
	
	//#1. first check api level.
	int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
	if (sdkVersion < 8){
		//#2. if we can use restartPackage method, just use it.
		ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		am.restartPackage(getPackageName());
	}else{
		//#3. else, we should use killBackgroundProcesses method.
		new Thread(new Runnable() {
			@Override
			public void run() {
				ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
				String name = getApplicationInfo().processName;
				RunningServiceInfo si;
				
				//pooling the current application process importance information.
				while(true){
					List<RunningAppProcessInfo> list = am.getRunningAppProcesses();
					for(RunningAppProcessInfo i : list){
						if(i.processName.equals(name) == true){
							//#4. kill the process,
							//only if current application importance is less than IMPORTANCE_BACKGROUND
							if(i.importance >= RunningAppProcessInfo.IMPORTANCE_BACKGROUND)
								am.restartPackage(getPackageName());	//simple wrapper of killBackgrounProcess
							else
								Thread.yield();
							break;
						}
					}
				}
			}
		}, "Process Killer").start();
	}
}

 

안드로이드 프로요 2.2 아래 버젼 일경우 ..

1.메니페스트 파일에 RESTART_PACKAGES 권한을 사용한다고 선언한다.
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>

2.ActivityManager 의 restartPackage API 를 호출한다.
ActivityManager am
             = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
am.restartPackage(getPackageName());

이것도 말끔히 종료 되진 않지만 그래도 얼추 죽일 수 있다고 하네요..

 

 

 

 

안드로이드 프로요 2.2 윗 버젼 일경우 ..

 

SDK 버전과 관계없이 프로세스를 종료할 때 사용할 수 있는 requestKillProcess() 라는 메서드를 구현하였습니다. 프로요 이전 버전인 경우, 기존에 사용하던 방법이 그대로 별다른 생각없이 restartPackage() 메서드를 호출 하도록 구현되어 있습니다.


 프로요 이 후 버전인 경우가 조금 골치 아픈데, 어느 시점에 해당 어플리케이션 프로세스의 우선 순위가 변경될지 알아내는 방법을 잘 몰라서, 주기적으로 프로세스 상태 정보를 폴링하도록 구현되었습니다. 스레드를 하나 생성한 후, 프로세스의 상태를 반복 체크하다가, 프로세스 중요도가 IMPORTANCE_BACKGROUND 보다 낮아지는 순간, restartPackage() 를 호출 하도록 되어있습니다.

 어째, 구현 내용이 좀 꺼림직 하긴 합니다만, 어플리케이션 내에서 사용하는 어플리케이션 컴포넌트 (Service / Activity / BroadcastReceiver ) 관리에만 신경을 써 준다면 (시작한 Service 는 잊지 않고 정지 시켜주는 등), 기존 restartPackage() 와 같이 어플리케이션 어느 시점에 호출에도 얼추 비슷하게 동작하는 것은 확인 하였습니다. (스레드가 계속 도니까;;;;)

 

 

 

[출처] - http://huewu.blog.me/110089551997

2010년 12월 6일 월요일

[Android] 자신의 전화번호 가져오기

 

 

 

TelephonyManager telManager = (TelephonyManager)context.getSystemService(context.TELEPHONY_SERVICE);
String phoneNum = telManager.getLine1Number();

 

이렇게 하면 가져올 수 있습니다..

 

그리고

manifest 파일에 uses-permission 을 설정 해야 되겠습니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE" />





2010년 11월 23일 화요일

[Android] 한 줄에서 몇 줄로 되는 필요한 잡코드들

 

 

 

17. Android 키보드 숫자형으로 시작하게 하기
edittext.setInputType(InputType.TYPE_CLASS_NUMBER);

16. Android listview 검정화면 없애기
android:cacheColorHint="#00000000"

15. Android 화면 고정하기
AndroidManifest.xml의 activity 속성중 screenOrientation을 다음과 같이 지정해준다.

//화면을 세로로 유지
<activity android:name=".Powermeter"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">
//화면을 가로로 유지
<activity android:name=".Powermeter"
                  android:label="@string/app_name"
                  android:screenOrientation="landscape">
자바 소스에서
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

14. Android Handler example
  // 시간주고 바로 뜨게 하기 20이 최소 가능 값..
        new Handler().postDelayed(new Runnable() {
            public void run() {
                openOptionsMenu();
            }
        }, 20);

13. Android 소프트 키보드 끄기 및 보이기 및 숨기기
  // 키보드 오프시키는 소스..
  EditText et = (EditText)findViewById(R.id.menu6_e_number);
  et.setInputType(0); //가상키보드 오프

1. 보이게 하기

EditText et = (EditText)findViewById(R.id.moneyEdit);
et.setInputType(0); //가상키보드 오프
       
        et.setOnClickListener(new OnClickListener() {  
   public void onClick(View arg0) {    
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
          imm.showSoftInput(input, 0);
   }         
        });

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, 0);

2. 숨기기
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);


12. Android  Edittext Hint, 흐리게 보이기
android:hint="ex) 안드로이드"


11. Android  EditText 숫자키만 허용하기

DigitsKeyListener digit =
new DigitsKeyListener(true, true); // first true : is signed, second one : is decimal
digit.setKeyListener( MyDigitKeyListener );

위와같이 하거나 xml 에서

android:inputType="number"


10. Android  Option menu 실행 소스
openOptionsMenu();


9. Android Menu 만들기
- xml 소스
res/menu/menu.menu

<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:id="@+id/adjust"
  android:title="수정"
  android:orderInCategory="1" >
 </item>
 <item
  android:id="@+id/delete"
  android:title="삭제"
  android:orderInCategory="2" >
 </item>
</menu>

- 자바 소스
 // OptionMenu
 public boolean onCreateOptionsMenu(Menu menu){
  getMenuInflater().inflate(R.menu.del_adjust, menu);
  return true;
 }

    // OptionMenu click event
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
   case R.id.adjust:
    finish();
    return true;
   
   case R.id.delete:
    finish();
    return true;
  }
  return false;
 }

8. Android Dialog 만들기 (Android.Dialog.Builder())

기존에는 Activity에서 showAlert(()를 제공해줬나보다. (예제를 보니...)
더 이상 지원하지 않기 때문에 AlertDialog.Builder()를 이용하여 Dialog를 생성하였다.

*onClickLister() 생성시 반드시 DialogInterface.OnClickListener()라고 클래스를 적어줘야 한다.
 (Activity에서 button 클릭 이벤트를 처리하기 위해 import한 View 클래스에 OnClickListener 메소드가 있다.)

a. Android  yes or no - 버튼 2개짜리
new AlertDialog.Builder(LoginMainActivity.this)
.setTitle("Login Data")
.setMessage("rosa : test") //줄였음
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {                                        
        //...할일
    }
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        //...할일
    }
})
.show();

b. Android  ok (or cancel)
new AlertDialog.Builder(LoginMainActivity.this)
        .setTitle("Login Data")
        .setMessage("rosa : test") //줄였음
        .setNeutralButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {                                        
                //...할일
            }
        })        
        .show();

c. Android   다른 layout 출력
new AlertDialog.Builder(LoginMainActivity.this)
.setTitle("list 예제")        
.setItems(R.array.listBtnArray, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int selectedIndex) {        
        String[] list = getResources().getStringArray(R.array.listBtnArray);        
        new AlertDialog.Builder(LoginMainActivity.this)
        .setTitle("선택한 리스트 아이템")
        .setMessage(list[selectedIndex])
        .setNeutralButton("OK", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub                        
            }                    
        });                
    }
    })
.show();

--
value 값으로 array 추가
<string-array name="listBtnArray">
        <item>One</item>
        <item>Two</item>
        <item>Three</item>
    </string-array>



7. Android  뒤로 가기 키
 onBackPressed();

6. Android  바이브레이터
Vibrator vibe = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibe.vibrate(500);
// 퍼미션        
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>

5. Android  밝기 셋팅
Window w = getWindow();
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = 0~1까지의 float 값;
w.setAttributes(lp);

-1.f를 주면 default 밝기로 세팅됩니다.

4. Android  화면 꺼지는것 막기
현재 Activity가 보여지고 있는 동안은 시간이 지나도
화면이 자동으로 꺼지지 않도록 합니다.
즉 단말이 슬립상태로 들어가지 않고 계속 화면을 켜놓습니다.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

3. Android  toast
1-Type
Toast.makeText.(this, "토스트 메세지", Toast.LENGTH_SHORT).show();

2-Type
Context context = getApplicationContext();
String msg = "";
int duration = Toast.LENGTH_SHORT;
Toast.makeText(context, b, duration).show();


2. Android  View 백그라운드 색 변경
TextView a = null;
a.setBackgroundColor(Color.WHITE);

1. Android  timer 이용
http://docs.androidside.com/docs/reference/java/util/TimerTask.html
--------------------------------------------------------------------------------------------------
모토로이 볼륨 올리고 내리는 버튼 키값을 알아내서
edittext 에 원하는 값을 넣는 방법 볼룸 위아래 버튼을 누르면
화면에 벨로시 볼륨 조절하는 창이 나타나는데 완전히 키값을 가로채는 방법

et_editText.setOnKeyListener(new OnKeyListener() {
       
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
           // TODO Auto-generated method stub
           if(event.getAction() == KeyEvent.ACTION_DOWN){
              if(keyCode == 24 || keyCode == 25){
              et_editText.setText("1234567890");
             
              return true;
              }
           }
           return false;
        }
       
     });


- 전체적으로 필요한 기능
// 종료 후 재 부팅시 기능이 죽지않고 유지되게 하는 방법들..
http://www.androidpub.com/android_dev_qna/189549

- 박사마 만드는데 필요한 기능
// view에서  페이지 넘기는 기능
API Demos에서 Animation에 간단하게 Fade in, Zoom in 효과가 있네요.

내가 만드는 부분에 필요한 부분들
// 강제로 클릭을 발생시키는 이벤트
dispatchTouchEvent
// 좌표관련들..
getWidth()랑 getHeight()로 전체 좌표값을 얻어오고 %로 비율 정해서 좌표값 설정하세요






[출처] - http://winchester.tistory.com/tag/%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%EC%83%89%20%EB%B3%80%EA%B2%BD



2010년 11월 20일 토요일

[JAVA] int, float, double ↔ String 형변환 / 진수 변환

 

 

 

 

숫자를 문자열로 바꾸기
int i = 1234;
String s = String.valueOf(i);     문자열 "1234"로 변환
String s = Integer.toString(i);   문자열 "1234"로 변환
String s = ””+i;                문자열 "1234"로 변환
String s = “”+12.34;            문자열 "12.34"로 변환
String s = “”+0;                문자열 "0"로 변환

 

문자열을 숫자로 바꾸기
String str = "1234";
int i = Integer.valueOf(str).intValue();
int i = Integer.parseInt(str);
long i = Long.parseLong(str)
double i = Double.valueOf(str).doubleValue();
Byte.parseByte(str)        바이트형 정수로 변환
Short.parseShort(str)      short형 정수로 변환
Integer.parseInteger(str)  int형 정수로 변환
Long.parseLong(str)        long형 정수로 변환
Float.parseFloat(str)      float형 부동 소수로 변환
Double.parseDouble(str)    double형 부동 소수로

 

 

문자 16진수 → 숫자 10진수

String strHexValue = "A";
System.out.println(Integer.parseInt(strHexValue, 16));

>> 10

 

숫자 10진수 → 문자 16진수

System.out.println(Integer.toString(intHexValue, 16));

>> a

 

소문자 → 대문자

String strSmallA = "a";
String strLargeA = strSmallA.toUpperCase();

 

문자 비교

"a".equals("A") → false
"a".equalsIgnoreCase("A") → ture

 

 

 

 

 

 

 

 

2010년 11월 19일 금요일

Android의 TableLayout 의 코너를 둥글게

 

 

 

 

 

iPhone 의 UI 를 보면 다음의 이미지와 같이 테이블의 네귀퉁이 각 모서리가

둥글게 둥글게 처리되어 있는것을 볼수 있다.




이와같은 둥근 모서리를 안드로이드에서 구현을 해보려고 한다.
처음엔 9Patch image 를 쓰려했지만 검색결과 Drawable XML 을 가지고 편하게
둥근 모서리를 구현시킬수 있었다.
나는 TableLayout 에 적용해보았지만 백그라운드에 적용시키는것이기 때문에
다른곳에도 적용할수 있을 것이다.

먼저 Reaource (res) 안의 drawable 폴더에 다음과 같은 XML 을 생성한다.
나는  com_rounded_corner.xml  이라고 저장 하였다.

<?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>


그리고 layout 의 적용할 부분의 background 에 해당 XML 을 넣어준다.

<TableLayout android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="@drawable/com_rounded_corner"

android:padding="10dip"

android:orientation="vertical">


...


</TableLayout>


그러면 다음과 같이 둥글게 깍인 백그라운드를 쉽게 가질수 있다 :-)

2010년 11월 9일 화요일

[Android] 웹페이지 소스 텍스트파일로 저장하기

 

//넘겨주는 url인데 한글을 넘겨줄때 인코딩을 해서 넘겨줘야 한다는것!

String url_str = "http://map.naver.com/local/search.nhn?query=";
String searchName = URLEncoder.encode("부산 남구  감만2동 경명중국관");
   
    try {
     InputStream inputStream = new URL(url_str+searchName).openStream();
     InputStreamReader isr = new InputStreamReader(inputStream, "UTF-8");
     BufferedReader br = new BufferedReader(isr);
     
     File file = new File("/mnt/sdcard/url.txt");
     OutputStream out = new FileOutputStream(file);
     writeFile(br, out);
     out.close();
    }
    catch (Exception e) {
     
    }
    finally {
     Toast.makeText(parsingtest.this, "저장완료", Toast.LENGTH_SHORT).show();
    }

 

 

 

//AndroidManifest.xml에 권한 추가하기

<!-- 외부메모리에 저장할때 작성 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />