Google Play Services를 사용하기 위한 준비

우선 Android SDK Manager를 실행하고

Extras > Google Play services 를 install 합니다.

Install이 되었으면 android-sdk\extras\google\google_play_services 폴더가 생성되었을 것입니다. 

Eclipse에서 File > Import 또는 Package Explorer 에서 마우스 오른쪽 버튼을 눌러 Import를 선택합니다.

Android > Existing Android Code Into Workspace 를 선택하고

Root Directory에서 android-sdk\extras\google\google_play_services\libproject\google-play-services_lib 폴더를 선택해 줍니다.

google-play-services_lib 프로젝트가 workspace에 추가되면 google play services를 사용하기 위한 준비가 된것입니다. 

google_play_servieces를 사용하는 프로젝트는 이 library를 추가해야 합니다.

프로젝트 오른쪽 버튼 > Properties 또는 Alt+Enter를 눌러 Project Properties를 열어

Android 를 선택하고 오른 하단에 있는 Add 버튼을 눌러 google_play_services_lib 를 선택하면 google play services를 사용하기 위한 준비 끝.


[ 정리 ]

  1. Android SDK에서 Google Play Services Install
  2. google_play_services_lib import
  3. Android 프로젝트 만들고 project properties 에서 2 에서 import한 Library 추가



[출처]

http://choijiho.tistory.com/30

Posted by 모과이IT
,

출처 : http://ramses8.tistory.com/455


이클립스 시작시 Workspace Lancher가 나타난다.
계속 그냥 두고 사용했는데 어느날인가 귀찮아서 다시 묻지않는걸 체크하고 사용하게 되었는데 이것저것 하려니 매번 Workspace Launcher가 나타나는게 좋을것 같아서 셋팅을 하려니 한 참 헤맸다.

혹. 저 같은 사용자가 있을까해서 적습니다.

사용자 삽입 이미지

Use this as the default and do not ask again에 체크를 하면 추후 이클립스 실행시 Workspace Lancher창이 뜨지 않는다.


다시 Workspace Launcher가 나타나게 하려면 아래와 같이 합니다.

사용자 삽입 이미지

이클립스 메뉴바의 Window > Preferences


사용자 삽입 이미지

General 탭의 Startup and Shutdown > Workspaces 의 Prompt for workspace on startup 체크


이상 입니다.

끝.



'개발지식창고 > Android_Java' 카테고리의 다른 글

Android용 Google+ 로그인  (0) 2014.11.02
Google Play Services 사용하기  (0) 2014.11.02
안드로이드 Toast로 디버그하기  (0) 2014.07.04
ADT 테마 적용  (0) 2014.04.21
Google XMPP site  (0) 2013.12.21
Posted by 모과이IT
,

안녕하세요~^^
안드로이드...개발하다가 정말 지쳐서 디버깅을 어떻게 할까 하다 하다 못해
Toast 를 고정적으로 띄워놓고, 값을 변경 시켜버리기로 하였습니다.

결국 Logcat 에서 100개 정도 뜨다가 안뜨는 그런 버그... 찾기도 힘들고 귀찮아서 -_-ㅋ
토스트로 해결을 해보자. 하였습니다.

물론 디버깅하는데 개발환경 및 등등등 에 따라서 저의 디버깅 방법이 맞지 않을 수 있으나,

뭐 저두 저 나름대로 편한대로 한거니깐. 써보시길,



글을 작성하겠습니다.
(스크린샷은 찍기 귀찮네요 ㅎㅎㅎㅎ)


1. Toast 를 화면의 고정적으로 띄우도록 하자.


Handler m_handler = new Handler() {
    public void handleMessage( Message msg ){
        if( msg.what == 0 ){
            Toast.makeText( m_context, "Init Orientation Mode", Toast.LENGTH_SHORT).show();
        }
        else if( msg.what == 1 ){
            int angle = (int)msg.arg1;
             
            if( m_Msg == null ){                   
                //m_Msg = Toast.makeText( m_context, "Angle = " + angle, Toast.LENGTH_SHORT);                   
                m_Msg = Toast.makeText( m_context, (String)msg.obj, Toast.LENGTH_SHORT);
            }
            else{
                m_Msg.setGravity(Gravity.BOTTOM | Gravity.RIGHT, 0, 0);                   
                //m_Msg.setText( "Angle = " + angle );             
                m_Msg.setText( (String)msg.obj );
                m_Msg.show();
            }
        }   
    }
};

 

Toast 의 return 되는 값을 저장해두고 값이 없어지는지 아닌지 확인을 합니다.

그리고 Toast 의 메시지를 setText() 함수를 사용하여 내용을 변경하도록 합니다.


자세한 설명은 소스가 짧기 때문에 안합니다~^^


// test Toast Message
String str = "init : " + (int)SensorInitAzimuth + ", Present : " + (int)SensorPresentAzimuth + ", diff : " + diff;
Message msg = Message.obtain();
msg.what = 1;
msg.arg1 = (int)angle[2];//(int)(-presentImgAzimuth);
msg.obj = (Object)str;
m_handler.sendMessage(msg);


토스트내용 출력이야 당연히 아실꺼구...


그냥 그렇게 하면 됩니다. 


Posted by 모과이IT
,

https://github.com/guari/eclipse-ui-theme



Posted by 모과이IT
,

http://blog.naver.com/keg1254?Redirect=Log&logNo=60202586529

Posted by 모과이IT
,

출처 : http://theeye.pe.kr/538

Android상에서 웹뷰를 사용하면서 Javascript 인터페이스를 사용하여 웹과 네이티브 코드간에 통신을 할 수 있습니다. 하지만 Android 4.2부터는 정상적으로 동작하지 않고 오류가 발생하는것을 발견하였습니다. 다음은 오류를 확인할 수 있는 간단한 코드입니다.

this.webView.getSettings().setJavaScriptEnabled(true);
this.webView.setWebChromeClient(new WebChromeClient());
this.webView.addJavascriptInterface(new Object() {
   
public void handshake() {
       
Log.d("JS", "handshake no params");
   
}

   
public void handshake(String json) {
       
Log.d("JS", "handshake with params: " + json);
   
}
}, "Android");


Javascript에서는 다음과 같이 위의 handshake()를 호출할 수 있습니다.

Android.handshake();


하지만 logcat에 다음과 같은 오류가 발생합니다.

E/Web Console: Uncaught TypeError: Object [object Object] has no method 'handshake'

여기서 중요한점은 4.2 이전버전들에서는 매우 잘 동작하는 API라는것입니다. 확인해본 결과 4.2(API 17)부터 Javascript에서 접근하려는 메소드에는 어노테이션을 추가해주어야 하도록 변경되었습니다. [확인]

결과적으로 위의 코드는 다음과 같이 @JavascriptInterface를 추가해주면 정상적으로 동작합니다. 물론 빌드 타켓을 API 17이상으로 해줄 필요가 있습니다.

this.webView.getSettings().setJavaScriptEnabled(true);
this.webView.setWebChromeClient(new WebChromeClient());
this.webView.addJavascriptInterface(new Object() {
   
public void handshake() {
       
Log.d("JS", "handshake no params");
   
}

   
@JavascriptInterface
   
public void handshake(String json) {
       
Log.d("JS", "handshake with params: " + json);
   
}
}, "Android");



참고 : http://stackoverflow.com/questions/14031635/android-4-2-1-webview-and-javascript-interface-breaks

Posted by 모과이IT
,


출처 : http://cafe.naver.com/sunschool/4400


HttpClient의 HttpPost 메서드를 사용하여 로그인을 처리한 예제.

[실행결과]

로그인이 성공한 경우 화면                     로그인이 실패한 경우 화면

   

 

[login_layout.xml]

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/layout01"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical"
     android:visibility="visible">
    <LinearLayout
         android:orientation="horizontal"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:gravity="center_horizontal">
        <TextView android:text="  아이디: "
             android:id="@+id/TextView02"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"/>
        <EditText android:text=""
             android:id="@+id/id"
             android:layout_width="200px"
             android:layout_height="wrap_content"/>
     </LinearLayout> 
     <LinearLayout
             android:orientation="horizontal"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:gravity="center_horizontal">
        <TextView android:text="패스워드: "
             android:id="@+id/TextView01"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"/>
       <EditText android:text=""
             android:id="@+id/passwd"
             android:layout_width="200px"
             android:layout_height="wrap_content"
             android:password="true"/>
      </LinearLayout> 
 <LinearLayout
      android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal">
 <Button android:text="로그인"
  android:id="@+id/loginButton"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:gravity="center_horizontal"/>
    </LinearLayout> 
</LinearLayout>

 

[LoginActivity.java]

 

  package kim.android.test;

  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.util.ArrayList;

  import org.apache.http.HttpEntity;
  import org.apache.http.HttpResponse;
  import org.apache.http.NameValuePair;
  import org.apache.http.client.ClientProtocolException;
  import org.apache.http.client.HttpClient;
  import org.apache.http.client.ResponseHandler;
  import org.apache.http.client.entity.UrlEncodedFormEntity;
  import org.apache.http.client.methods.HttpPost;
  import org.apache.http.impl.client.DefaultHttpClient;
  import org.apache.http.message.BasicNameValuePair;
  import org.apache.http.params.HttpConnectionParams;
  import org.apache.http.params.HttpParams;
  import org.xmlpull.v1.XmlPullParser;
  import org.xmlpull.v1.XmlPullParserFactory;

  import android.app.Activity;
  import android.app.ProgressDialog;
  import android.graphics.Color;
  import android.os.Bundle;
  import android.os.Handler;
  import android.os.Message;
  import android.util.Log;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.LinearLayout;
  import android.widget.Toast;

 

  public class LoginActivity extends Activity implements OnClickListener {
    private EditText id;
    private EditText passwd;
    private ProgressDialog pDialog;
    private LinearLayout layout01;
    private Button button;
 
 
   @Override
    protected void onCreate(Bundle savedInstanceState) {
     // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
         setContentView(R.layout.login_layout);
         id=(EditText)findViewById(R.id.id);
         passwd=(EditText)findViewById(R.id.passwd);
         button=(Button)findViewById(R.id.loginButton);
         button.setOnClickListener(this);
         layout01=(LinearLayout)findViewById(R.id.layout01); 
    }

 

   @Override
   public void onClick(View v) {
      // TODO Auto-generated method stub
      loginProcess();      //로그인 버튼이 클릭되면 로그인 처리를 시작한다.
    }
 

   // 네트웍 처리결과를 화면에 반영하기 위한 안드로이드 핸들러

   // responseHandler에 의해 처리된 결과가 success인 경우 바탕화면을 초록색으로 바꾸고

   // 로그인이 성공했다는 메시지를 토스트로 출력

   // 로그인이 실패한 경우 바탕화면을 빨강색으로 바꾸고 로그인실패 메시지를 토스트로 출력
   private final Handler handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
            pDialog.dismiss();
            String result=msg.getData().getString("RESULT");
            if ( result.equals("success") ) {
                  layout01.setBackgroundColor(Color.GREEN);
                  Toast.makeText(LoginActivity.this, "성공적으로 로그인하였습니다.",
                                         Toast.LENGTH_LONG).show() ;     
            } else {
                  layout01.setBackgroundColor(Color.RED);
                  Toast.makeText(LoginActivity.this, "로그인 실패",
                                         Toast.LENGTH_LONG),show() ;    
             }
       } 
    };
 

    //서버에서 전송된 XML 데이터를 파싱하기 위한 메서드

    //이 예제에서는 서버에서 로그인이 성공하는 경우(id=kim&passwd=111)하는 경우 <result>success</result>

    //실패하는 경우 <result>failed</result>를 반환하도록 설정해 두었다. 
    public String parsingData(InputStream input){
        String result=null;
        try {
             XmlPullParserFactory factory= XmlPullParserFactory.newInstance();
             XmlPullParser parser = factory.newPullParser();
             parser.setInput(new InputStreamReader(input));
             while ( parser.next() != XmlPullParser.END_DOCUMENT) {
                 String name=parser.getName();
                  if ( name != null && name.equals("result"))
                         result=parser.nextText();
              }
         }catch(Exception e){e.printStackTrace();}
         return result;
     }
 

    //로그인 버튼이 클릭되면 수행되는 메서드

    //  responseHandler는 Http요청에 대한 HttpResponse가 반환되면 결과를 처리하기 위한

     //  콜백메서드를 정의하고 있는 객체이다.

     //  Response를 받게 되면 parsingData()메서드를 호출하여 서버로 부터 받은 XML 파일을 처리하여

     // 그결과를 result 문자열로 반환받는다.

     // 이렇게 반환받은 result문자열을 화면에 반영하기위해 안드로이드UI핸들러인 handler를 통해 값을 전달한다.
    public void loginProcess() {
          final ResponseHandler<String> responseHandler=
               new ResponseHandler<String>() {

                 @Override
                 public String handleResponse(HttpResponse response)
                                                  throws ClientProtocolException, IOException {
                         String result=null;
                         HttpEntity entity=response.getEntity(); 
                         result=parsingData(entity.getContent());
                         Message message=handler.obtainMessage();
                         Bundle bundle=new Bundle();
                         if ( result.equals("success") )
                                      bundle.putString("RESULT", "success");
                         else
                                      bundle.putString("RESULT", "failed");
                         message.setData(bundle);
                         handler.sendMessage(message);
                         return result;
                 }
    };

 

     // 로그인이 처리되고 있다는 다이얼로그를 화면에 표시한다.
     pDialog=ProgressDialog.show(this, "", "로그인 처리중....");

 

     // 서버에 HTTP 처리 요청은 새로운 스레드를 생성하여 비동기식으로 처리하는것이 효율적이다.
     new Thread() {

           @Override
            public void run() {
                 String url = "http://192.168.10.2:8080/login.jsp";
                 HttpClient http = new DefaultHttpClient();
                 try { 
                     // 서버에 전달할 파라메터 세팅   
                     ArrayList<NameValuePair> nameValuePairs =
                                                              new ArrayList<NameValuePair>();
                     nameValuePairs.add(new BasicNameValuePair("id", id.getText().toString()));
                     nameValuePairs.add(new BasicNameValuePair("passwd", passwd.getText().toString()));
            

                   //     응답시간이 5초가 넘으면 timeout 처리하려면 아래 코드의 커맨트를 풀고 실행한다.
                   //     HttpParams params = http.getParams();
                   //     HttpConnectionParams.setConnectionTimeout(params, 5000);
                   //     HttpConnectionParams.setSoTimeout(params, 5000);

 

                  // HTTP를 통해 서버에 요청을 전달한다.

               // 요청에 대한결과는 responseHandler의 handleResponse()메서드가 호출되어 처리한다.

                  // 서버에 전달되는 파라메터값을 인코딩하기위해 UrlEncodedFormEntity() 메서드를 사용한다.

                  HttpPost httpPost = new HttpPost(url);
                  UrlEncodedFormEntity entityRequest =
                                       new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
                  httpPost.setEntity(entityRequest);
                  http.execute(httpPost,responseHandler); 
                }catch(Exception e){e.printStackTrace();}
           }
      }.start();    //스레드를 실행시킨다.
 }

}

 

 

LoginActivity를 실행하기 위해 테스트서버를 만들었고, 테스트서버에는  로그인을 처리하기위한 login.jsp, 결과로 반환될 success.xml, failed.xml,을 다음과 같이 만들어 테스트 하였다. ㅎㅎ

 

 

[login.jsp]

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <% System.out.println("login.jsp가 호출됨");  %>
   <c:if test="${param.id=='kim'}" >
       <c:if test="${param.passwd=='111'}" >
            <jsp:forward page="success.xml"/>
       </c:if>
   </c:if>
   <jsp:forward page="failed.xml"/>
</body>
</html>

[success.xml]

<?xml version="1.0" encoding="UTF-8"?>
<result>success</result>

 

[failed.xml]

<?xml version="1.0" encoding="UTF-8"?>
<result>failed</result>

 

 

웹요청에 대한 처리결과를 html 로 받아서 화면에 브라우저를 이용하여 출력하게 하려면 WebView 위젯을 사용하면 간단하게 처리할수 있다.

WebView는 예제를 올려놓은 게시물이 있으니 그걸 참조 하면 될듯 ^^


Posted by 모과이IT
,

http://stbaeya.com/tc/361?category=45

Posted by 모과이IT
,
아시다시피 안드로이드에서의 리소스 관리는 R.java 파일에서 이루어지고 있다.

개발자가 매번 추가하지 않아도, int 정수자료형으로 재생성 되고 있다.

그렇타면...
xml내의 수많은 view들의 리소스 아이디를 찾기 위해서

for문 내에

for( int i =0; i<99; i++){
findViewById(R.id.+"textview"+i);
}

이런식으로 선언하면 로직은 에러가 안나지만... 리소스를 찾지를 못한다.

그래서 안드로이드 리소스 함수중에 getIdentifier를 이용하면 비슷한 형태로 적용할 수 있다.

getIdentifier()함수 내에 인자로 아래 3개의
리소스 아이디(문자열), id/drawable 정의타입, 패키지명 을 넘기면 된다.

for(int i = 0; i< 99; i++){

 int resId = getResources().getIdentifier("textview"+i, "id", "com..");
...
}

버튼에 이벤트를 적용하려고 할때 리스너를 거는 방법 또한 동일하게 적용하면 된다.

 

출처 :  http://stbaeya.com/tc/352

 

Posted by 모과이IT
,

xml에서 설정하는 방법은요

android:visibility="visible"      << 버튼을 보이고 싶을때
android:visibility="invisible"  << 버튼을 안보이고 싶을때(공간 차지함)

android:visibility="gone"  << 버튼을 안보이고 싶을때(공간 차지하지않음)

//////////////////////////////////////////////////////
자바코드에서도 설정할수 있는데요

만약에 버튼아뒤가  bt1 = (Button) findbyViewId(R.id.bt01);   << 이런식이라면

bt1.setVisibility(View.VISIBLE);   // 화면에보임
bt1.settVisibility(View.INVISIBLE);  // 화면에 안보임

이런식으로

View 설정을 할수있네요 ^-^ 

 

Posted by 모과이IT
,