반응형
안드로에드에서 버튼에 대한 효과를 주는 방법이 있습니다.
ImageButton에 효과를 주는 방법인데... 구글 안드로이드 개발 사이트에서도 명시 되어 있습니다.
그런데 보면서 좀... 혼라?? 스러웠다고 해야 할까요... 그래서 좀 정리를 해볼려고 합니다.

To indicate the different button states (focused, selected, etc.), you can define a different image for each state. E.g., a blue image by default, an orange one for when focused, and a yellow one for when pressed. An easy way to do this is with an XML drawable "selector."

영어는 잘 못하지만.. 대충 내용은 focused, selected, normal 상태의 버튼을 정의하고 싶으면 xml에다 selector라는 것을 사용해서 미리 정의라하는... 그런 내용이죠... 버튼 색상이 나오는데... 그것에 대한 내용은 
이 두 곳에 가시면 설명을 볼 수 있습니다.

그리고는 설명에서는 이렇게 xml을 정의하라고 나옵니다.
      
                
                
            

그리고는 res/drawable/ 폴더에다가 만들어서 사용하라는 내용은 있는데... 저의 짧은 지식으로는 정확하게 이해하기가 힘들더군요... 

예전에는 안드로이드 개발할 때 /res 밑에 drawable 폴더가 1개밖에 없었던 기억이 있었는데... 지금은 기본 프로젝트를 생성해도 /res 밑에 drawable 폴더가 "/res/drawable-hdpi", "/res/drawable-mdpi", "/res/drawable-ldpi" 이렇게 3개가 존재합니다. 구글 document에서는 /res/drawable/ 에다가 xml을 만들라고 합니다...
그럼 그렇게 하면 됩니다... ㅜㅜ/// 정말 말 그대로 하면 되는데... 괜히 /res/drawable-hdpi... mdpi... ldpi... 이런데다가 만들어봐서 했는데 안되더군요 ㅋㅋ

그림에서 보는 것 처럼.. /res/drawable/ 폴더를 만들고 그 곳에 원하는 xml파일을 만듭니다... 예를 들어서 
"play_button.xml"이라는 파을을 만들고 안의 내용을
      
                
                
            

이렇게 안의 내용을 정의 해 두고...
play_button_pressed와 play_button_focused.. 그리고 play_button_normal은... drawable-hdpi, mdpi, ldpi에 paly_button_pressed.png, play_button_focused.png, play_button_noraml.png 로 된 이미지 파일이 있어야 합니다. 

그런 다음에... Layout에서 ImageButton을 만들고 그곳에서 ImageButton의 property의 "Background"에다가
@drawable/play_button 이라고 입력하면 끝납니다.

이 방법때문에... 좀 힘들게 진행했네요... 어떻게 보면...정말 간단한건데...

이젠... 이생각이 듭니다... 그럼 ImageButton마다 일일이 이런 xml을 파일을 만들어 줘야 하는건지... 그럼 하나의 Activity안에 ImageButton이 10개면... 버튼 10개에 대한 xml을 따로 만들어 줘야 하는건지... ㅎㅎ
더 쉽게 하는 방법이 있는지 찾아 봐야 겠습니다... ㅜㅜ///
허접한 설명이였습니다 ㅎ


반응형
반응형

음악을 스트리밍 하다가..볼륨을 조절 할 일이 생기게 되었을 경우.
안드로이드에 볼륨 조절하는 버튼이 있지만...
스트리밍 중에 화면에서 SeekBar를 통해서 조절을 하는 방법도 있다.
AudioManager 클래스에 있는 메소드를 이용하면 가능.

1. 볼륨 조절 버튼으로 조절 하기.

public boolean onKeyDown(int keyCode, KeyEvent event) {                  
        AudioManager mAudioManager = 
            (AudioManager)getSystemService(AUDIO_SERVICE);
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP :
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                                             AudioManager.ADJUST_RAISE, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_LOWER, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_BACK:
            return true;
        }

        return false;
   }

    public boolean onKeyUp(int keyCode, KeyEvent event) {
        AudioManager mAudioManager = 
           (AudioManager)getSystemService(AUDIO_SERVICE);
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_UP :
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_SAME, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, 
                                             AudioManager.ADJUST_SAME, 
                                             AudioManager.FLAG_SHOW_UI);
                return true;
        case KeyEvent.KEYCODE_BACK:
            this.finish();
            return true;
        }
        return false;
    }
2. 화면에서 SeekBar를 통해서 조절하기
seekVolumn = (SeekBar) findViewById(R.id.SeekBar_Volumn);
		final AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
		int nMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
		int nCurrentVolumn = audioManager
				.getStreamVolume(AudioManager.STREAM_MUSIC);

		seekVolumn.setMax(nMax);
		seekVolumn.setProgress(nCurrentVolumn);

		seekVolumn.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
						progress, 0);
			}
		});

반응형
반응형

http에 request를 보냈는데.. 서버에서 url주소를 redirect해서 보내주는 경우가 있지요. 그럼 개발자가 입력한 주소로는
요청이 안되는 경우가 생깁니다. 이걸 해결하기위해서는 javaj에서 redirect된 주소로 다시 요청을 해줘야 합니다.
방법은

private InputStream openConnectionCheckRedirects(URLConnection c) throws IOException 
{
   boolean redir;
   int redirects = 0;
   InputStream in = null;
   do 
   {
      if (c instanceof HttpURLConnection) 
      {
         ((HttpURLConnection) c).setInstanceFollowRedirects(false);
      }
      in = c.getInputStream(); 
      redir = false; 
      if (c instanceof HttpURLConnection) 
      {
         HttpURLConnection http = (HttpURLConnection) c;
         int stat = http.getResponseCode();
         if (stat >= 300 && stat <= 307 && stat != 306 &&
            stat != HttpURLConnection.HTTP_NOT_MODIFIED) 
         {
            URL base = http.getURL();
            String loc = http.getHeaderField("Location");
            URL target = null;
            if (loc != null) 
            {
               target = new URL(base, loc);
            }
            http.disconnect();
            if (target == null || !(target.getProtocol().equals("http")
               || target.getProtocol().equals("https"))
               || redirects >= 5)
            {
               throw new SecurityException("illegal URL redirect");
            }
            redir = true;
            c = target.openConnection();
            redirects++;
         }
      }
   } 
   while (redir);
   return in;
}

public void makeConnection(URL url){
   URLConnection conn = url.openConnection();
   InputStream is = openConnectionCheckRedirects(conn);

   /* request에 대한 결과 처리 부분*/

   is.close();
}

이런식으로 하면 되겠습니다. 서버에서 제공하는 api가 redirect된 주소로 해서 보내주는 경우가 많기에... 이 방법을 써서 해결하게 되었습니다.




반응형
반응형


안드포이드 어플 안에서 키보드를 보이게 할 때와 보이지 않게 할 때가 있습니다.
간단히 검색을 하기 위헤서 EditText에 글자를 입력하고 Enter를 입력하고 나서는 바로 키보드가 보이지 않게 한다던지 할때... 없애주면 좋겠지요... 그렇게 하기 위해서는 아래와 같은 방법으로 하게 되면 됩니다.

키보드 보이게 하기

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


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




반응형
반응형


안드로이드도 아이폰처럼 기기를 옆으로 돌렸을 때 화면이 따라 회전하는 기능을 갖고 있습니다. 어떨 때 보면 좋은 기능이기도 하지만, 어떨 때에는 필요치 않는 기능이기도 합니다. 세로의 화면 상태에서만 기능을 사용하고 싶다면 "portrait"으로 설정해 두어야 하는데, AndroidManifest.xml 파일안에 Activity 설정 정보를 수정해 주어야만 합니다.

설정방법은 AndroidManifest.xml파일을 선택하시고 난 다음에
탭부분에서 Application을 선택하게 됩니다.
그러고 난 다음 그림과 같이 해당 Activity를 선택하고 나서 Screen orientation에서 portrait을 선택해 주시고 저장하시면 됩니다.

xml의 내용을 보시게 되면
android:screenOrientation="portrait"

이 내용이 추가된 것을 확인하실 수 있습니다.



반응형
반응형


java에서 http에 request를 요청할때 post방법과 get방법이 있는데..
그중에서 post방법으로 요청을 하게 될 때 필요한 방법입니다.
핵심은
conn.setDoOutput(true);
이렇게 해 주면 됩니다.

get방식으로 하게 된다면
conn.setDoInput(true);
로 하게 되면 get방식이 됩니다.

try {
    // Construct data
    String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
    data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");

    // Send data
    URL url = new URL("http://address/");
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
    wr.write(data);
    wr.flush();

    // Get the response
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null) {
        // Process line...
    }
    wr.close();
    rd.close();
} catch (Exception e) {
}



반응형
반응형


안드로이드 개발을 하게 되면서...
웹과의 통신을 하거나.. 스트리밍을 하게 될 때 처음에 이런 에러를 접하게 될 경우가 있습니다.
머 그냥 간단하게 permission 설정을 해주지 않아서 생긴 에러입니다. 이것을 해결 하게 위해서는
manifest파일에 android.permission.INTERNET을 추가해 주면 됩니다.

에러 화면은 이렇습니다. LogCat에 나와 있는 상태가

이런 모습으로 보일 것이고... permission 설정은


현재 진행중인 프로젝트에서 AndroidManifest.xml파일을 열어줍니다.
그리고 나서는


Permissions 탭을 선택하고 나서


Add버튼을 투르게 되면 다이얼로그 창이 하나 나타나게 됩니다.


Uses Permission을 선택하고 OK를 누르고 나갑니다.


마지막으로 Name의 콤보박승에서 android.permission.INTERNET을 선택하고 저장하게 되면 됩니다.
xml파일의 내용을 확인하게 되면

이런식으로 추가된 내용을 확인할 수 있습니다.

이렇게 되면 문제 없이 원하는 대로 실행이 될 것입니다.

반응형
반응형


다른 사람들이 만든 안드로이드 어플을 에뮬레이터에 설치하는 방법을 모르고 있다가 이제서야 알게 되었네요...
우선 자신이 피요한 .apk 파일을 받아서는 원하는 위치에 둡니다.. 아니면 SDK가 설치된 곳의 tools 폴더이 파일을 이동 시켜 둡니다.
SDK의 tools폴더가 환경변수에 path설정이 되어 있다면 아무 위치에 두어도 상관 없습니다.
그리고 나서 에뮬레이터가 실행되어 있는 상태에서
adb install 파일이름.apk
이렇게 해주게 되면  설치가 됩니다.

설치가 성공되었을 때의 화면 입니다.

삭제하는 방법은
adb uninstall 파일이름.apk
이렇게 하면 삭제가 되고

재설치 하는 방법은
adb install -r 파일이름.apk
하시게 되면 됩니다.




반응형

+ Recent posts