지식메모




이미지를 캡쳐하는 어플을 만들었는데 저장하기 버튼을 누르면 캡쳐가 되는 기능이었다.


그런데 저장하기를 누르니까


java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
at android.graphics.Bitmap.createBitmap(Bitmap.java:585)
at com.project.app.ResultActivity.onClick(ResultActivity.java:860)

at android.view.View.performClick(View.java:3531)
at android.view.View$PerformClick.run(View.java:14125)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4449)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)


이런 에러가 나타났다. 그래서 해결책을 찾고 있었는데 다 recycle()이거나 BitmapFactory등등 뭔가 복잡했다.

내 실력으로는 잘 이해가 안갔다.

그러다 되게 간단해 보이는 방법을 찾았는데

AndroidManifest.xml 파일에


<application>

....

android:largeHeap="true"

....

</application>


어플리케이션 부분에 이 옵션을 주는 것이었다.  어플리케이션에 메모리할당을 더 크게 늘려주는 옵션이라나... 

아무튼 적용해보니 에러가 발생하지 않았다.

감격 ㅠㅠ

물론 이게 100%해결책은 아니지만 가장 간단한 해결책이 되지 않을까 싶다.




  1. ddd 2014.01.21 09:59

    임시방편이될수있지만 좋은방법은아닙니다.ㅜ

    • yonoo88 2014.01.21 13:39 신고

      저도 급해서 일단 이걸로 했는데

      더 좋은 방법이 있나요?

      궁금합니다.

      http://gyjmobile.tistory.com/entry/%ED%81%B0-%EB%B0%B0%EA%B2%BD%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%82%AC%EC%9A%A9%EC%8B%9C-OutOfMemoryError%EC%9D%98-%ED%99%95%EC%8B%A4%ED%95%9C-%ED%95%B4%EA%B2%B0%EB%B2%95#comment11561742

      이 글도 한번 봐주실 수 있으신가요?

    • asdfasdf 2016.05.26 17:03

      좋은방법이 아닌게 아니라 그렇게 사용하면 안되는 거임.

    • yonoo88 2016.05.26 17:06 신고

      이게 예전에 올린거라 지금은 폰 사양이 좋기도 하구요.. 저 방법 말고 새로운 방법이 있나요?

버튼이 눌렸을때와 안 눌렸을때 각 버튼이미지를 프로젝트에 넣어주고

(res폴더 안에 있는 drawable-hdpi 등등 폴더안에)

res폴더에  drawable 폴더를 만들고 안에다가

눌림효과를 줄 xml 파일을 만들어 준다. ex) button_click.xml


그리고 그 안에 밑에 소스를 추가

 <?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">


 <item android:state_pressed="true" android:drawable="@drawable/after_button" />

<!--   눌린 후 버튼이미지 파일명을 써준다.-->

 <!-- pressed -->  


 <item android:drawable="@drawable/before_button" /> 

<!--  눌리기 전 버튼이미지 파일명을 써준다..-->

 <!-- default -->

</selector>



위와 같이 해주고


이미지버튼 눌림효과를 줄 xml 파일로 가서 이미지버튼 부분에 

 android:background="@drawable/button_click"

이걸 추가해준다. button_click 은 아까 drawable 폴더 안에 만들어둔 xml 파일명이다.


 <ImageButton

        android:id="@+id/button_custom"

        android:layout_width="100sp"

        android:layout_height="wrap_content"

        android:layout_alignParentBottom="true"

        android:layout_centerHorizontal="true"

        android:layout_marginBottom="143dp"

        android:background="@drawable/button_click" />


이렇게 하면 눌림효과가 만들어진다.





public class MainActivity extends Activity{ 

다음에 삽입해주면 끝


private static final int MSG_TIMER_EXPIRED = 1;

	

    private static final int BACKEY_TIMEOUT = 2000;



    private boolean mIsBackKeyPressed = false;



    private long mCurrentTimeInMillis = 0;

    @Override 

    public void onBackPressed() { 

        if(mIsBackKeyPressed == false){ 

            mIsBackKeyPressed = true; 

              

            mCurrentTimeInMillis = Calendar.getInstance().getTimeInMillis(); 

              

            Toast.makeText(this, "뒤로 버튼을 한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT).show(); 

            startTimer(); 

        } else { 

            mIsBackKeyPressed = false; 

              

            if(Calendar.getInstance().getTimeInMillis() <= (mCurrentTimeInMillis + (BACKEY_TIMEOUT))){ 

                finish(); 

            } 

        } 

    } 

      

    private void startTimer(){ 

        mTimerHander.sendEmptyMessageDelayed(MSG_TIMER_EXPIRED, BACKEY_TIMEOUT); 

    } 

      

    private Handler mTimerHander = new Handler(){ 

        public void handleMessage(Message msg){ 

            switch(msg.what){ 

                case MSG_TIMER_EXPIRED: 

                { 

                    mIsBackKeyPressed = false; 

                } 

            break; 

            } 

        } 

    };







루트 권한 폴더를 내 계정권한으로 바꾸기

sudo chown -R 내계정:내계정 해당폴더

ex) sudo chown -R jeong:jeong test_auth


test_auth 폴더가 현재 root root로 되어있는데 이걸 내 계정 권한으로 바꿔보겠다.


jeong jeong으로 바뀐 모습





해당 프로젝트로 가서 

play

해서 플레이 콘솔창으로 들어간 다음

test

하면 모든 테스트 진행

test-only 폴더명.패키지명.클래스명

상황에 따라

test-only 패키지명.클래스명 

test-only 클래스명

면 특정 클래스만 테스트 진행


플레이프레임워크 사이트에서 설명




'지식메모 > PlayFramework 2' 카테고리의 다른 글

자바에서 쉘스크립트 실행하기  (0) 2013.07.22
PlayFramework 2 테스트 방법  (0) 2013.07.17

파일 경로 찾기

2013.07.17 14:38

리눅스에서 해당 파일이 어딨는지 궁금하다면


locate 파일명


이라고 쳐주면 어딨는지 나온다.


apache2.conf 라는 파일을 찾기위해

locate apache2.conf 를 수행한 모습.

2가지 파일의 경로가 나온다.


만약 새로 프로그램을 깔고 어딨는지 찾으려고 했는데 안 나온다면


updatedb


를 한번 수행해주고 다시 locate 파일명 을 해주면 나타난다.





리눅스에서 콘솔에서 작업할때 root 계정이 아니면 명령어를 칠 때마다 sudo 를 쳐줘야 한다.


그래서 root계정으로 바꿔서 작업하면 편하다


su -


라고 명령어를 입력하면 계정이 바뀌는 걸 볼 수 있다.


스샷


jeong 에서 root로 바뀐 걸 볼 수 있다.






사용자로부터 숫자를 입력 받을때 그 값을 검사하고 싶을때 사용한다.

예를 들면 1부터 5까지만 입력을 받고 싶다면 사용자가 5 보다 큰 수를 입력했을때 

값을 초기화 해버리면서 토스트메세지를 즉시 띄우게 된다.


EditText et=(EditText)findViewById(R.id.num); //해당 에디트텍스트 선언

et.addTextChangedListener(new TextWatcher() {

@Override

public void onTextChanged(CharSequence s, int start, int before, int count) {

// TODO Auto-generated method stub

if(s.toString().length() > 0){ //문자열s의 길이가 0보다 크면

if(Integer.parseInt(s.toString()) > 5){ //문자열s를 int형으로 파싱해서 5보다 크면

et.setText(null);  //에디트텍스트 값을 null로 초기화 해버리고

Toast.makeText(getApplicationContext(), "1부터 5까지만 입력해주세요", Toast.LENGTH_LONG).show();

//토스트메세지를 띄운다.

}

}

}



EditText et=(EditText)findViewById(R.id.num); //해당 에디트텍스트 선언

et.addTextChangedListener(new TextWatcher() {			

@Override

	public void onTextChanged(CharSequence s, int start, int before, int count) {

	// TODO Auto-generated method stub

	if(s.toString().length() > 0){ //문자열s의 길이가 0보다 크면

	if(Integer.parseInt(s.toString()) > 5){ //문자열s를 int형으로 파싱해서 5보다 크면

	et.setText(null);  //에디트텍스트 값을 null로 초기화 해버리고

	Toast.makeText(getApplicationContext(), "1부터 5까지만 입력해주세요", Toast.LENGTH_LONG).show();

//토스트메세지를 띄운다.

		}

	}

}


+ Recent posts