2014.06.25 20:11

서비스 하던 앱의 사용자 분(G3 사용자)이 문득 이미지 첨부가 안된다고 메일을 주셨더라구요.


하여간 버전 업데이트가 되면 꼭 LG폰이 말썽입니다. 후..


그래서 알아보니 킷캣 버전부터는 Intent.ACTION_GET_CONTENT 가 안먹더라구요.


이유는 기존에 사용하던 ACTION_GET_CONTENT 


Storage access framework에 통합되었기 때문라고 하네요.


그런데 간단한 해결 방법이 있었습니다.


Intent.ACTION_GET_CONTENT  을 Intent.ACTION_PICK 으로 바꾸면 된다는 거.. ㅋㅋ


원래도 Intent.ACTION_PICK 을 써도 됐거든요.


이렇게 한줄 수정하니 다시 잘 되더군요. ^^


intent = new Intent(Intent.ACTION_PICK ,      

android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);


신고
Posted by 그린블로그 DEV그린
2014.06.20 17:00


package com.XmlFileCreator;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;


import org.xmlpull.v1.XmlSerializer;


import android.app.Activity;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.util.Xml;

import android.widget.TextView;


public class XmlFileCreator extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        //create a new file called "new.xml" in the SD card

        File newxmlfile = new File(Environment.getExternalStorageDirectory()+"/new.xml");

        try{

                newxmlfile.createNewFile();

        }catch(IOException e){

                Log.e("IOException", "exception in createNewFile() method");

        }

        //we have to bind the new file with a FileOutputStream

        FileOutputStream fileos = null;        

        try{

                fileos = new FileOutputStream(newxmlfile);

        }catch(FileNotFoundException e){

                Log.e("FileNotFoundException", "can't create FileOutputStream");

        }

        //we create a XmlSerializer in order to write xml data

        XmlSerializer serializer = Xml.newSerializer();

        try {

                //we set the FileOutputStream as output for the serializer, using UTF-8 encoding

                        serializer.setOutput(fileos, "UTF-8");

                        //Write <?xml declaration with encoding (if encoding not null) and standalone flag (if standalone not null)

                        serializer.startDocument(null, Boolean.valueOf(true));

                        //set indentation option

                        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);

                        //start a tag called "root"

                        serializer.startTag(null, "root");

                        //i indent code just to have a view similar to xml-tree

                                serializer.startTag(null, "child1");

                                serializer.endTag(null, "child1");

                               

                                serializer.startTag(null, "child2");

                                //set an attribute called "attribute" with a "value" for 

                                serializer.attribute(null, "attribute", "value");

                                serializer.endTag(null, "child2");

                       

                                serializer.startTag(null, "child3");

                                //write some text inside 

                                serializer.text("some text inside child3");

                                serializer.endTag(null, "child3");

                               

                        serializer.endTag(null, "root");

                        serializer.endDocument();

                        //write xml data into the FileOutputStream

                        serializer.flush();

                        //finally we close the file stream

                        fileos.close();

                       

                TextView tv = (TextView)this.findViewById(R.id.result);

                        tv.setText("file has been created on SD card");

                } catch (Exception e) {

                        Log.e("Exception","error occurred while creating xml file");

                }

    }

} 


결과는 다음과 같습니다.


<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>

<root>

  <child1 />

  <child2 attribute="value" />

  <child3>some text inside child3</child3>

</root>


출처 : http://www.anddev.org/write_a_simple_xml_file_in_the_sd_card_using_xmlserializer-t8350.html


신고
Posted by 그린블로그 DEV그린
2014.05.25 22:45

안드로이드 위젯을 짤 때 


1x1, 2x2, 3x3 .. 이런 위젯들의 dp 값이 궁금하다면 아래 표를 참조하면 됩니다.


셀 크기

 DP 사이즈

1

 72dp

2

 146dp

3

 220dp

4

 294dp


위젯의 크기는 res - xml 폴더 안의 widget_provider.xml에 넣어주시면 됩니다.



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

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"

    android:initialLayout="@layout/widget_2x2"

    android:minHeight="146dp"

    android:minWidth="146dp"

    android:updatePeriodMillis="100000" />

(2x2 위젯 사이즈인 경우)


Cell

4 X 1

320 x 100 

3 X 3

240 x 100

2 X 2

160 x 200



즉 가로 길이는 1 에 ==> 80세로 길이는 1 에 ==? 100

 가로 / 세로

 1

2

3

 1

 80 x 100 

 80 x 200 

 80  x 300

 80 x 400 

 2

 160 x 100

 160 x 200 

 160 x 300 

 160 x 400 

 3

 240 x 100

 240 x 200 

 240 x 300

 240 x 400 

 4

 320 x 100

 320 x 200 

 320 x 300 

 320 x 400 


이 크기는 세로모드일때의 크기이며 가로모드일때는

가로 길이 1 에 ==> 106 세로 길이 1 에 ==> 74



신고
Posted by 그린블로그 DEV그린
2014.05.08 15:09

pixel과 dp를 자연스럽게 바꿀 수 있는 코드입니다.


예를 들어 이미지를 코드로 넣을 경우 매우 유용하게 사용될 것입니다. ^^


    /**

    * This method converts dp unit to equivalent pixels, depending on device density.

    *

    * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels

    * @param context Context to get resources and device specific display metrics

    * @return A float value to represent px equivalent to dp depending on device density

    */

    public static float convertDpToPixel(float dp, Context context){

        Resources resources = context.getResources();

        DisplayMetrics metrics = resources.getDisplayMetrics();

        float px = dp * (metrics.densityDpi / 160f);

        return px;

    }

 

    /**

     * This method converts device specific pixels to density independent pixels.

     *

     * @param px A value in px (pixels) unit. Which we need to convert into db

     * @param context Context to get resources and device specific display metrics

     * @return A float value to represent dp equivalent to px value

     */

    public static float convertPixelsToDp(float px, Context context){

        Resources resources = context.getResources();

        DisplayMetrics metrics = resources.getDisplayMetrics();

        float dp = px / (metrics.densityDpi / 160f);

        return dp;

    }


출처 : http://stackoverflow.com/questions/4605527/converting-pixels-to-dp



신고
Posted by 그린블로그 DEV그린
2014.05.08 14:59

개발하면서 Drawable과 Bitmap을 왔다갔다 할 경우가 있습니다.


이 둘을 자유 자재로 바꾸는 방법을 알아봅시다.


1. Bitmap to Drawable


 Drawable d = new BitmapDrawable(getResources(), bitmap);



2. Drawable to Bitmap


public static Bitmap drawableToBitmap (Drawable drawable) {

        if (drawable instanceof BitmapDrawable) {

            return ((BitmapDrawable)drawable).getBitmap();

        }

 

        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);

        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());

        drawable.draw(canvas);

 

        return bitmap;

    }



신고
Posted by 그린블로그 DEV그린
2014.03.12 22:29

안드로이드 SQL은 따로 지원하는 API가 있습니다.


그래서 직접 다 쿼리를 치지 않아도 메소드로 대신 할 수 있지요.


 db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);


대충 이런 식으로 많이 짭니다.


그런데 어떤 컬럼이 중복되지 않게 SELECT하고 싶을 때 distinct를 넣어야 할 때가 있습니다.


안드로이드 API는 그것 또한 고려한 메소드를 제공합니다.


 db.query(distinct, table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);


위의 것과 동일하지만 여기서 새로 추가된 distinct의 값을 true로 주면 중복을 걸러내겠다는 말입니다.


limit에는 null을 주면 됩니다.



신고
Posted by 그린블로그 DEV그린
2013.12.26 15:49

이클립스 Graphical layout에서 


This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in


이런 말이 뜨면서 안보이는 경우가 있습니다.


이럴땐 말그대로 ADT 업데이트를 해주어야 하는데요,


이클립스 Help - Install New SoftWare.. 를 클릭하신 후 


Work With에 https://dl-ssl.google.com/android/eclipse/ 를 입력하면 뜨는


Android Development Tools를 인스톨한 후 재실행하면 제대로 보입니다.



신고
Posted by 그린블로그 DEV그린
2013.11.21 22:22

시간을 표현할 때는 HH:mm:ss 를 많이 쓰는데요,


때에 따라 AM/PM, 오전/오후로 표기해주어야 할 때가 있습니다.


그럴 땐 다음과 같은 방식으로 코딩합니다. ^^


 Calendar now = Calendar.getInstance();

 now.setTime(StringUtil.parseDate(row.getDate()));

 int isAMorPM = now.get(Calendar.AM_PM);

 switch (isAMorPM) {

 case Calendar.AM:

 ((TextView)dialog.findViewById(R.id.title)).setText("오 "+now.get(Calendar.HOUR)+" "+now.get(Calendar.MINUTE)+"");

    break;

 case Calendar.PM:

 ((TextView)dialog.findViewById(R.id.title)).setText("오후 "+now.get(Calendar.HOUR)+" "+now.get(Calendar.MINUTE)+"");

    break;

 }


참 쉽죠?


신고
Posted by 그린블로그 DEV그린
2013.11.16 01:02

일반적으로 퍼센트 구하는 공식은 다음과 같습니다.


예 : 1000에서 100은 몇 %인가?

공식 : (일부값 ÷ 전체값) ×100

풀이 : (100 ÷1000) ×100 = 10%


이것을 자바프로그래밍에 도입해봤을 때는 int 값으로 계산하겠죠.


그런데 이렇게 하면 값이 0이 나올 때가 나오고 맙니다.


항상 100 나누기 1000이 아니고 356 나누기 6578 같은 경우도 있으니까요.


그럴 때는 적절하게 double을 써주어야 하는데요~ 이 방법이 가장 좋은 방법 같습니다.


percent = (int)( (double)part/ (double)all * 100.0 );

//percent는 전체값에서 일부값의 퍼센트를 나타낸다. 


신고
Posted by 그린블로그 DEV그린
2013.10.08 19:21

안드로이드의 unzip 예제는 많지만 zipping 예제는 찾기가 어렵죠!


그래서 간단한 zip 압축 만들기 방법을 직접 씁니다. ^^


1. 

일단 Zip4j 사이트로 들어가서 jar 파일을 받습니다.


http://www.lingala.net/zip4j/download.php




2. 

그리고 프로젝트의 lib 폴더에 다운받은 jar파일을 넣어줍니다. 

이 시점에선 zip4j_1.3.1.jar가 최신이네요. ^^ 

귀찮으시다면 첨부한 파일을 받으시고..~


zip4j_1.3.1.jar



3. 

Properties - Libraries 에서 Add JARs... 를 클릭하여 zip4j_1.3.1.jar을 등록한 후 



Order and Export에서 체크박스 클릭 후 Clean을 해주십니다.




4. 

Environment.getExternalStorageDirectory().getAbsolutePath()는 sdcard를 의미합니다.

즉 이 코드는 압축할폴더이름을 압축하여 압축할파일이름.zip으로 만드는 코드입니다.

라이브러리를 이용하니 간단하게 압축 끝~ 참 쉽죠? ^^


 try {

 ZipFile zipfile = new ZipFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "압축할파일이름.zip");

 ZipParameters parameters = new ZipParameters();

 parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);

 parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);

 zipfile.addFolder(Environment.getExternalStorageDirectory().getAbsolutePath() + "/압축할폴더이름", parameters);

 } catch (Exception e) {

  // TODO: handle exception

 }



PS.

제가 압축을 사용한 이유는 

4.3부터 gmail로 이미지 다중첨부 시 알 수 없는 퍼미션 에러가 났기 때문입니다. ㅡㅜ

혹시 해결하신 분 댓글좀 남겨주세요~ ㅎㅎ

근데 압축 라이브러리를 사용하고 보니 이게 훨씬 간단하고 유저입장에서도 편하겠더군요. ^^

앞으론 다중 이미지 첨부보단 zip파일로 하나로 묶어보내는게 나아보입니다.



신고
Posted by 그린블로그 DEV그린
2013.10.08 19:02

EditText에 password 모드를 주려면 어떻게 해야될까요?


안드로이드 xml에서는 password="true" 하나로 해되지만


한 xml을 여러 클래스에서 다른 용도로 쓰게 될 때는 어쩔 수 없이 해당 클래스에서만 따로 password모드를 부여해줄 수 밖에 없습니다.


그럴 땐 아래 코드를 사용해보세요!


 EditText edt = (EditText)findViewById(R.id.edt);

 PasswordTransformationMethod pass = new PasswordTransformationMethod();

 edt.setTransformationMethod(pass);



신고
Posted by 그린블로그 DEV그린
2013.08.10 16:59

http://www.slipp.net/wiki/pages/viewpage.action?pageId=5177633


이 사이트가 망하지 않는 한 이클립스의 최적화 정보를 손쉽게 볼 수 있답니다.




이클립스의 heap status 정보를 보려면


Window - Preference 에 가셔서


Show heap status에 체크해주시면 




이렇게 이클립스 오른쪽 하단에 heap status가 뜬답니다.


꽉찬다 싶으면 휴지통 아이콘을 클릭해주시면 알아서 정리가 됩니다.


근데 사실 그렇게 효과가 있는지는 모르겠군요 ㅎㅎ


신고
Posted by 그린블로그 DEV그린
2013.08.09 12:23

Webview는 꾸준히 CPU를 좀먹는 위젯인데요,


그나마 쉽게 CPU를 낮출 수 있는 방법이있습니다.


onResume 에서 로드하고


onPause 에서 clearHistory(); 와 loadUrl(""); 을 선언해주고


작업관리자의 CPU 점유율을 확인해보면 확연하게 줄어든 CPU점유량을 확인해 보실 수 있습니다.

신고
Posted by 그린블로그 DEV그린
2013.08.08 14:52
요즘엔 이클립스랑 Android SDK를 한번에 묶어 주는군요~

http://developer.android.com/sdk/index.html


이곳에서 SDK를 받아줍니다.



Download the SDK 버튼 클릭!



자신의 OS에 맞는 bit를 체크해주시고


Download the SDK ADT Bundel for WIndows 버튼 클릭!


다운받은 .zip 파일을 C: 아무 폴더를 만드셔서 압축을 풉니다.


저같은 경우는 C:\Android 에 그냥 깔아버렸습니다 ㅎㅎ


이제 ecliplse 폴더에서 ecliplse.exe 만 실행해주시면


안드로이드 SDK와 개발자 툴이 설치되어있는 이클립스를 실행하게 됩니다.



이 이클립스는 아이콘이 안드로이드 전용입니다 ㅎㅎ


멋지네요~


예전에는 이클립스 따로 안드로이드 SDK 따로 설치 했었는데


이젠 훨씬 간편하게 개발환경 세팅이 가능해졌습니다. ^^


신고
Posted by 그린블로그 DEV그린
2013.07.31 20:49
Shape path too large to be rendered into a texture


코딩하다 주황색으로 이런 에러가 뜨길래 찾아보니


AndroidManifest.xml의 해당 액티비티에 


android:hardwareAccelerated="false"


이 옵션을 추가해줘야 하더군요. 다만 이걸 추가했을 때 bitmap draw형식이면 뭔가 잔상이 남는 버그가 있네요.


그건 좀 더 연구해봐야겠습니다..

신고
Posted by 그린블로그 DEV그린
2013.07.31 18:19

try catch 문에서 Exception이 걸렸을 때 로그캣으로 찍어보는 방법입니다.


 try { 

   //todo          

 } catch (Exception e) {

    StringWriter sw = new StringWriter();

    e.printStackTrace(new PrintWriter(sw));

    String exceptionAsStrting = sw.toString();

    Log.e("GODK", exceptionAsStrting);

    e.printStackTrace();

 }


신고
Posted by 그린블로그 DEV그린
2013.07.25 00:08

코딩을 하다가 갤럭시S에서만 setHint가 안먹히는 버그를 발견했습니다.


android:gravity="center" 와 android:hint 를 같이 쓰면 주로 안보이는 것 같더군요.



이 버그는 


android:ellipsize="end"


이 옵션을 함께 추가해주시면 수정됩니다.



참 이상한 버그였습니다.


신고
Posted by 그린블로그 DEV그린
2013.07.24 17:02

ImageView를 반투명 처리하는 방법입니다.


코드는 매우 간단합니다.




XML에서 src에 선언했을 경우


 Drawable alpha = ((ImageView)findViewById(R.id.img)).getDrawable();

 alpha.setAlpha(50);



XML에서 background에 선언했을 경우


 Drawable alpha = ((ImageView)findViewById(R.id.img)).getBackground();

 alpha.setAlpha(50);






레이아웃을 반투명 처리할 경우 (주로 도움말 에서 배경을 반투명 처리할 때 사용합니다)


 Paint paint = new Paint();

 paint.setColor(Color.BLACK);

 paint.setAlpha(70);

 ((RelativeLayout)findViewById(R.id.layout)).setBackgroundColor(paint.getColor());



신고
Posted by 그린블로그 DEV그린
2013.07.15 21:49

일련번호를 표시할 때 자릿수를 정해서 세팅하는 방법입니다.


001, 002... 010 이런식으로 표현하고 싶을 때 아래 코드를 사용합니다.


 int serial = 3;

 String number = String.format("%03d", serial);

 Log.i("INFO""number : "+number);

신고
Posted by 그린블로그 DEV그린
2013.05.30 14:37

Calendar c1 = Calendar.getInstance();

Calendar c2 = Calendar.getInstance();

c1.setTime(StringUtil.parseDate(시작시간));

c2.setTime(StringUtil.parseDate(종료시간));

long a = 0;

long b = (c2.getTimeInMillis() - c1.getTimeInMillis()) /1000;

a = b/(60 * 60); //시간 구하기

                                   

long hourToMinute = a * 60; //구해진 시간을 분으로 변환

                                   

long ultimateMinute = ( b/(60) ) - hourToMinute; //날짜간 차를 분으로 변환 한 것에 구해진 시간을 분으로 변환한 것을 뺌

                                   

Log.i("INFO", "a : "+a+"시간///"+ultimateMinute+"");





덤) 분을 시간과 분으로 나타내기


예를들어 150분


int h = 150 / 60 = 3(시간)

int m = 150 % 60 = 30(분)


신고
Posted by 그린블로그 DEV그린