Android/Android TIP 2015. 7. 2. 11:00

1. 패키지 매니저 이용하는 방법

PackageManager m = getPackageManager();

String path = getPackageName();

try {

PackageInfo p = m.getPackageInfo(s, 0);

path = p.applicationInfo.dataDir;

} catch (PackageManager.NameNotFoundException e) {

}


2. ApplicationInfo 이용하는 방법

getApplicationInfo().dataDir;


3. /file 디렉토리에서 parent로 알아내는 방법

getApplicationContext().getFilesDir().getParentFile());

posted by 젊은쎄오
:
Android/Android TIP 2015. 4. 9. 13:48
- 클릭한 뷰의 context를 가지고 온다는 것과 new task 플래그 추가



holder.ll_row.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {


        Intent intent = new Intent(v.getContext(), NewActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        v.getContext().startActivity(intent);


     }
});


posted by 젊은쎄오
:
Android/Android TIP 2014. 7. 15. 17:49

private int dpToPx(Context context, int dp) {

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();

int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));

return px;

}


private int pxToDp(Context context, int px) {

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();

int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));

return dp;

}



소스 외 계산하고 싶다면


posted by 젊은쎄오
:
Android/Android TIP 2014. 7. 15. 17:27

자동으로 오버라이드 되는 함수로 애를 먹은 적이 많다. 


예를들어 BaseAdapter를 상속받아 오버라이드 되는 getCount()의 리턴값이 자동으로 0이 들어가지며


아무리 데이터를 넣어도 getCount를 찍어보면 리스트 사이즈가 0이 찍히는 경우 말이다.



이런경우를 미연에 방지할 수 있는 방법중 하나는 UnsupportedOperationException을 이용하는 것이다. 


UnsupportedOperationException은 개발자가 미처 신경쓰지 못한 함수를 crash까지 내주며 알려준다. ㄷㄷ


사용방법은 


Windows > Preferences > Java > Code Style > Code Templates > Code > Method body 로 이동 후


아래 박스에 


1
2
// ${todo} Auto-generated method stub
 ${body_statement}

이렇게 써있는 부분을 지운 후 


1
throw new UnsupportedOperationException();

이렇게 바꿔준다.


그럼 개발자가 만들던 오버라이드로 만들어지던 매소드 안엔 UnsupportedOperationException()이 자동으로 들어가지며


만약 신경쓰지 못하여 그대로 실행한다면 crash창이 뜨며 알려준다. 

posted by 젊은쎄오
:
Android/Android TIP 2014. 2. 20. 09:42

xml에서 


<string name="think">I can't believe</string>


 라고 입력하게 되면, 


error: Apostrophe not preceded by \ (in Can't delete the file) 이렇게 오류가 납니다.


특수문자를 사용하기 위해선 


<![CDATA["삽입할 특수문자"]]>  


이런식으로 사용해야 합니다.




ex ) <string name="think">I can<![CDATA["'"]]>t believe</string>


posted by 젊은쎄오
:
Android 2014. 2. 16. 21:37
FTP는 MainThread에서는 수행되지 않는다.

별도의 thread나 asynctask를 이용한다
try {

     FTPClient mFTP = new FTPClient();

     mFTP.connect("123.123.123.123", 21);  // ftp로 접속 
     mFTP.login("ftpuser", "password"); // ftp 로그인 계정/비번
     mFTP.setFileType(FTP.BINARY_FILE_TYPE); // 바이너리 파일
     mFTP.setBufferSize(1024 * 1024); // 버퍼 사이즈 
     mFTP.enterLocalPassiveMode(); 패시브 모드로 접속



    // 업로드 경로 수정 (선택 사항 )

     mFTP.cwd("public"); // ftp 상의 업로드 디렉토리
     mFTP.mkd("files"); // public아래로 files 디렉토리를 만든다 
     mFTP.cwd("files"); // public/files 로 이동 (이 디렉토리로 업로드가 진행)


     File path = new File("/sdcard/dcim/camera/"); // 업로드 할 파일이 있는 경로(예제는 sd카드 사진 폴더)
     if (path.listFiles().length > 0) { // 폴더를 가지고와 폴더 내부 파일 리스트를 만든다
          for (File file : path.listFiles()) {
               if (file.isFile()) {
                    FileInputStream ifile = new FileInputStream(file)

                    mFTP.rest(file.getName());  // ftp에 해당 파일이있다면 이어쓰기

                    mFTP.appendFile(file.getName(), ifile); // ftp 해당 파일이 없다면 새로쓰기
               }
          }
     }

     mFTP.disconnect(); // ftp disconnect 

     } catch (SocketException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
     } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
     }
}


posted by 젊은쎄오
:
Android/Android TIP 2014. 2. 9. 23:33
* data/ 경로로 들어가려면 폰이 루팅이 되어있어야 합니다.


1.터미널창에 adb shell 

2. 내가 디버깅할 프로젝트 패키지명이 com.example.test 라면 
run-as com.example.test
(package명 has currupt inst.... 이런게 뜬다면 폰 리붓 후 재시도)

3. ls 명령어도 되고 cat명령어로 preference 파일은 열기도 가능하다.

4. su (루트권한얻기)

5. db파일을 sd카드로 복사 한다.
cp /data/data/패키지명/databases/디비명.db /sd카드경로

6. exit (root > adb)

7. exit (adb > C:)

8. sd카드 db파일 D드라이브로 가져오기
adb pull /sd카드경로/디비명.db d:\

9. SQLite Database Browser 로 열기 


posted by 젊은쎄오
:
Android/Android TIP 2014. 2. 4. 17:05
터미널을 실행 한 후 순서대로 명령어를 입력한다.

1. adb shell

2. logcat -c

3. 앱 실행 > 크래쉬 

4. logcat -d > log.txt 
(read only  관련 에러 나온다면 디렉토리를 sd카드로 이동한 후 다시 시도한다 ex : cd /sdcard/) 


posted by 젊은쎄오
:
Android/Android TIP 2013. 12. 23. 12:34

안드로이드 프로젝트를 APK로 뽑으려는 순간 아래와 같은 오류가 발생 할 때가 있습니다.






안드로이드 16 버전부터 나온 기능인데 프로젝트 내에 레이아웃, 문자열 등을 검사하여 문제가 발생 할 만한 곳을 


미리 경고메시지로 알려주는 기능입니다. 


예를 들어 en, ko 스트링 폴더를 나눠놨는데 en에는 있는 리소스가 ko에는 없다던가 식의 알림입니다. 


이 경고가 뜨면 컴파일 조차 안되는데 아래는 해결 방법입니다.








ADT Preferences > Android > Lint Error Checking > Correntness:Messages > MissingTranslation 선택 후 


Severity 를 Warning 으로 바꾸면 됩니다.




posted by 젊은쎄오
:
Android/Android TIP 2013. 9. 10. 15:12

Activity가 아닌 곳 , 


Service , BroadcastReceiver , baseAdapter 등에서 Intent로 새로운 Activity를 열려고 하면 



E/AndroidRuntime(27318): android.util.AndroidRuntimeException: 

Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. 

Is this really what you want?


라는 런타임 에러가 나옵니다. 


안드로이드에서 간단한 toast를 띄울 때 '어디다 띄울거냐' 를 판별하는 this 또는 클래스명.this 와 같이 


어느 Task에 Activity를 띄울건지 모르겠다는 에러입니다. 


Task는 Activity를 관리하는 것으로 Activity를 띄우려면 해당 Task에 띄워야 하는데 


Service , BroadcastReceiver , baseAdapter  등 은 Activity가 아니므로 새로운 Activity를 띄우려면 


에러에서의 설명과 같이 


	Intent intent = new Intent(mContext, BlackBoxVideoPlayActivity.class);
	intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
	mContext.startActivity(intent);


Intent에 속성을 넣어 새로운 Task를 만들겠다고 해야합니다.



posted by 젊은쎄오
: