블로그 이미지
우주청년
집구석 음악가, 잡식성 프로그래머

calendar

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Notice

2011.04.03 21:29 문서/프로그래밍


다시 처음부터 동영상 플레이어 작업을 시작합니다~

[할일]

 - 파일 리스트 꾸미기
 - 세부 조절 옵션 넣기
 - 로컬 동영상 재생 + 로컬 자막
 - 동영상 스트리밍 + 외부 자막
 - 에러 잡기

[본문]

  예전 플레이어는 실험 삼아 시작한거라 너무 막 만든거 같아서, 처음부터 계획을 잡고 다시 만들기로 했습니다. 일단 처음 할일은 "파일 리스트 꾸미기"인데, 세부적인 내용으로는

 1. 프로젝트 생성
 2. 레이아웃 디자인
 3. 커스텀 리스트 작성
 4. 파일 목록 생성
 5. 리스트에 연결
 6. 버튼 동작 연결

이렇게 6단계로 진행하게 될거 같네요.

[참고용 소스 파일]


1. 프로젝트 생성

  일단 안드로이드 어플을 개발 할 환경(이클립스+자바SDK+안드로이드SDK)을 구성하고 안드로이드 어플리케이션 프로젝트를 생성합니다. (저는 안드로이드 SDK 1.6으로 생성했습니다.)
  그리고 매니패스트의 Application -> Application Nodes -> 해당 엑티비티 선택 -> Config changes -> Select 선택 -> keyboardHidden과 orientation에 체크를 해줍니다. (회전할때 내부 내용을 유지하기 위해서 설정합니다.)


2. 레이아웃 디자인

대충 이런 모양으로 만들 예정입니다.

가장 위에 현재 폴더를 표시하고,
아래쪽에 네비게이션 메뉴와 버전 정보, 개발 정보 버튼을 넣습니다.
그리고 아랫쪽에 커스텀 리스트를 표시합니다.

네비게이션 메뉴에는
  "저장소 홈으로 이동",
  "기록된 이전 폴더로 이동",
  "상위 폴더로 이동",
  "기록된 다음 폴더로 이동"
  "새로고침"
이렇게 5가지의 메뉴가 있습니다.

커스텀 리스트에는
  "파일 이미지",
  "파일 이름",
  "파일 크기"
이렇게 3가지로 구성되어 있습니다.

예상한 내용되로 레이아웃 XML을 생성해봅시다.
(참고로 저는 xml로 작업 안합니다... 그냥 GUI로 그립니다.)

<main.xml>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:text="TextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/dirText"></TextView>
    <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_width="wrap_content" android:layout_height="wrap_content">
        <RelativeLayout android:id="@+id/relativeLayout2" android:layout_height="wrap_content" android:layout_width="fill_parent">
            <ImageButton android:id="@+id/imageButton1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/monitor"></ImageButton>
            <ImageButton android:id="@+id/imageButton2" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageButton1" android:layout_alignTop="@+id/imageButton1" android:layout_alignBottom="@+id/imageButton1" android:layout_width="wrap_content" android:src="@drawable/arrow_180"></ImageButton>
            <ImageButton android:id="@+id/imageButton3" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageButton2" android:layout_alignTop="@+id/imageButton2" android:layout_alignBottom="@+id/imageButton2" android:layout_width="wrap_content" android:src="@drawable/arrow_090"></ImageButton>
            <ImageButton android:id="@+id/imageButton4" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageButton3" android:layout_alignTop="@+id/imageButton3" android:layout_alignBottom="@+id/imageButton3" android:layout_width="wrap_content" android:src="@drawable/arrow"></ImageButton>
            <ImageButton android:id="@+id/imageButton5" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageButton4" android:layout_alignTop="@+id/imageButton4" android:layout_alignBottom="@+id/imageButton4" android:layout_width="wrap_content" android:src="@drawable/plus"></ImageButton>
            <ImageButton android:id="@+id/imageButton6" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageButton5" android:layout_alignTop="@+id/imageButton5" android:layout_alignBottom="@+id/imageButton5" android:layout_width="wrap_content" android:src="@drawable/information"></ImageButton>
            <ImageButton android:id="@+id/imageButton7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageButton6" android:layout_alignTop="@+id/imageButton6" android:layout_alignBottom="@+id/imageButton6" android:src="@drawable/balloon"></ImageButton>
        </RelativeLayout>
    </HorizontalScrollView>
    <ListView android:id="@+id/listView1" android:layout_height="wrap_content" android:layout_width="fill_parent"></ListView>
</LinearLayout>

<layout.xml>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <ImageView android:src="@drawable/icon" android:id="@+id/imageView1" android:layout_alignParentLeft="true" android:layout_height="wrap_content" android:layout_width="wrap_content"></ImageView>
    <TextView android:layout_width="wrap_content" android:id="@+id/textView1" android:text="TextView" android:layout_height="wrap_content" android:layout_toRightOf="@+id/imageView1" android:textSize="20dip"></TextView>
    <TextView android:layout_width="wrap_content" android:id="@+id/textView2" android:text="TextView" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/textView1" android:textSize="10dip"></TextView>
</RelativeLayout>
 
 

                 main.xml                                      listview.xml                                    리소스


3. 커스텀 리스트 작성

  이렇게 정말 대충 레이아웃 작성이 끝났습니다. 이제 커스텀 리스트를 메인에서 불러와 줘야 하는데요, 일단 커스텀 리스트에 사용될 데이터 형을 하나 정의해 줍니다.
class ListData {
	int type;
	String name;
	long size;
	ListData(int type, String name, long size) {
		this.type = type;
		this.name = name;
		this.size = size;
	}
	
	public int gettype() {
		return type;
	}
	
	public String getname() {
		return name;
	}
	
	public long getsize() {
		return size;
	}
}

이제 이 데이터를 이용해서 커스텀 리스트를 만드는 본체를 작성 해 봅시다.
    private class GroupAdapter extends ArrayAdapter<Object> {
    	private ArrayList<ListData> item;
    	private ListData temp;
    	
    	@SuppressWarnings({ "unchecked", "rawtypes" })
		public GroupAdapter(Context ctx, int resourceID, ArrayList item) {
    		super(ctx, resourceID, item);
    		
    		this.item = item;
    	}
    	
    	public View getView(int position, View convertView, ViewGroup parent) {
    		View v = convertView;
    		if(v == null) {
    			LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    			v = vi.inflate(R.layout.listview, null);
    		}
    		temp = item.get(position);
    		
    		if(temp != null) {
    			ImageView icon = (ImageView)v.findViewById(R.id.imageView1);
    			TextView name = (TextView)v.findViewById(R.id.textView1);
    			TextView size = (TextView)v.findViewById(R.id.textView2);
    			switch(temp.gettype()) {
    			case 0:
    				icon.setImageResource(R.drawable.folder_horizontal);
    				break;
    			case 1:
    				icon.setImageResource(R.drawable.film);
    				break;
    			case 2:
    				icon.setImageResource(R.drawable.application_blue);
    				break;
    			default:
    				icon.setImageResource(R.drawable.document);
    				break;
    			}
    			name.setText(temp.getname());
    			if(temp.gettype() == 0) {
    				size.setText("(폴더)");
    			} else {
    				size.setText("(" + byteTranslater(temp.getsize()) + ")");
    			}
    		}
    		return v;
    	}
    }

아까 만들어 놓은 ListData의 type에 따라서 리스트의 이미지를 설정해 주고, 파일 이름과 파일 크기를 설정합니다. 끝에 보면 byteTranslater라는 함수가 있는데, 이것은 파일 크기를 GB,MB,KB로 줄여서 보여주는 역할을 합니다.
    public static String byteTranslater(long size) {
      	NumberFormat nf = NumberFormat.getIntegerInstance();
      	java.text.DecimalFormat df = new java.text.DecimalFormat("#,##0.00");
      	int intSize = 0;
      	int kbyteSize = 1024;
      	double doubleSize = 0;
      	String returnSize = null;

      	if(size >= (1000 * 1024 * 1024)) {
      		intSize = new Long(size / (1000 * 1024 * 1024)).intValue();
      		return nf.format(intSize) + "GB";
      	} else if (size > (kbyteSize * 1024)) {
      		intSize = (int) (((double) size) / ((double) (kbyteSize * 1024)) * 100);
      		doubleSize = (double) (((double) intSize) / 100);
      		returnSize = df.format(doubleSize);
	      	if (returnSize.lastIndexOf(".") != -1) {
		      	if ("00".equals(returnSize.substring(returnSize.length() - 2, returnSize.length()))) {
			      	returnSize = returnSize.substring(0, returnSize.lastIndexOf("."));
		      	}
	      	}
	      	return returnSize + "MB";
      	} else if (size > kbyteSize) {
      		intSize = new Long(size / kbyteSize).intValue();
      		return nf.format(intSize) + "KB";
      	} else {
      		return "1KB";
      	}
    }

이렇게 커스텀 리스트 작성은 끝났습니다.
이제 이 커스텀 리스트로 파일 목록을 읽어와서 출력을 해줘야 합니다.


4. 파일 목록 생성 ~ 5. 리스트에 연결

  파일을 읽어올때는 항상 해당 폴더나 파일이 존재하는지, 그리고 읽을 수 있는지 확인을 해줘야 에러를 피해갈 수 있습니다.
  이번에는 특정 경로를 기준으로 그 안의 내용물을 읽어오고, 그것을 리스트로 연결하는 부분을 작성하겠습니다.
	public void updateFileList(String sPath) {
	    String ext = Environment.getExternalStorageState();
	    String path = null;
	    ListData temp;
	    int type;
	    long size = 0;
	    String name;
	    
	    if(sPath == null) {
		    if(ext.equals(Environment.MEDIA_MOUNTED)) {
		    	path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
		    } else {
		    	path = Environment.MEDIA_UNMOUNTED;
		    }
	    } else {
	    	path = sPath;
	    }
	    
	    dirText.setText(path);
	    nPath = path;
	
	    File files = new File(path);
	    arrayList = new ArrayList<ListData>();
	
	    if(files.listFiles().length > 0) {
		    for(File file : files.listFiles()) {
		    	name = file.getName();
		    	if(file.isDirectory()) {
		    		type = 0;
		    	} else if(file.getName().endsWith(".mpg")
		    			||file.getName().endsWith(".avi")
		    			||file.getName().endsWith(".wmv")
		    			||file.getName().endsWith(".asf")
		    			||file.getName().endsWith(".mp4")
		    			||file.getName().endsWith(".mkv")) {
		    		type = 1;
		    	} else if(file.getName().endsWith(".apk")) {
		    		type = 2;
		    	} else {
		    		type = 3;
		    	}
		    	
		    	if(type != 0) {
		    		size = file.length();
		    	}
		    	temp = new ListData(type, name, size);
		    	arrayList.add(temp);
		    }
	    }
	    
	    adapter = new GroupAdapter(this,R.layout.listview,arrayList);
        fileList.setAdapter(adapter);
    }

일단 매개변수로 넘어오는 경로가 있으면 그 경로에서, 없으면 기본 외부메모리의 경로에서 파일 목록을 읽습니다. 그리고 그 파일의 종류와 크기, 이름을 ListData형 오브젝트 배열에 집어 넣습니다.
이후에 커스텀 리스트의 Adapter에 오브젝트 배열을 넣고 커스텀 리스트를 출력합니다.


6. 버튼 동작 연결

  이제 나머지 동작을 정의해야 할 시간입니다. 리스트에서 아이템을 클릭하거나, 버튼을 누르거나 할때 어떻게 동작할지 작성해 봅시다.
  상위폴더 이동부터 이전에 이동한 폴더로 이동 등등, 네비게이션에 관련된 부분과 정보 대화상자를 띄우는 등의 내용을 편의상 전체 소스로 보여 드리겠습니다.
  열심히 분석해서 자신의 것으로 만들어 보세요.
package gsnc.player;

import java.io.File;
import java.text.NumberFormat;
import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

class ListData {
	int type;
	String name;
	long size;
	ListData(int type, String name, long size) {
		this.type = type;
		this.name = name;
		this.size = size;
	}
	
	public int gettype() {
		return type;
	}
	
	public String getname() {
		return name;
	}
	
	public long getsize() {
		return size;
	}
}

public class main extends Activity {
    private TextView dirText;
    private ArrayList<ListData> arrayList;
    private ListView fileList;
    private GroupAdapter adapter;
    private String nPath;
    private ArrayList<String> PathList_prev;
    private ArrayList<String> PathList_next;
    private View nextBtn;
    private View prevBtn;
    private View upBtn;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        nPath = null;
        PathList_prev = new ArrayList<String>();
        PathList_next = new ArrayList<String>();
        
        makeFileList();
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    	super.onConfigurationChanged(newConfig);
    	setContentView(R.layout.main);
    	
    	makeFileList();
    }
    
    public void makeFileList() {
        fileList = (ListView)findViewById(R.id.listView1);
        dirText = (TextView)findViewById(R.id.dirText);
        
		final Builder virsionDlg = new AlertDialog.Builder(this)
        .setTitle("패치노트")
        .setMessage(
        		"[v0.2]\n" +
        		"- smi파일 색상 태그 적용.\n" +
        		"- 동영상 탐색시, 자막도 함께 이동.\n" +
        		"\n" +
        		"[v0.1]\n" +
        		"- 동영상 읽어와서 재생하기\n" +
        		"- smi 파일 읽어와서 파싱하기\n" +
        		"- 파싱한 smi를 동영상 위에 오버랩하기\n" +
        		"- 파일 브라우저 표시하기\n" +
        		"\n" +
        		"[패치예정]\n" +
        		"- 북마크&이어보기 기능 추가.\n" +
        		"- 웹에 있는 파일 스트리밍.\n" +
        		"- 웹에 있는 파일 스트리밍 할 때 같은 주소, 같은 이름의 smi파일을 불러오기.\n" +
        		"- 플레이어 세부 설정 메뉴 만들기\n" +
        		"- 앱스토어에 등록하기")
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
		
        View virsionBtn = findViewById(R.id.imageButton6);
        virsionBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				virsionDlg.show();
			}
        });
        
		final Builder infoDlg = new AlertDialog.Builder(this)
        .setTitle("정보")
        .setMessage(
        		"[GNCPlayer]\n" +
        		"- 제작 : LlIiEe(GsNC).\n" +
        		"- 메일 : nohhplus@nate.com\n" +
        		"- 블로그 : http://gsroom.tistory.com")
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
		
        View infoBtn = findViewById(R.id.imageButton7);
        infoBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				infoDlg.show();
			}
        });
        
		String path = null;
		String ext = Environment.getExternalStorageState();
		if(ext.equals(Environment.MEDIA_MOUNTED)) {
	    	path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
	    } else {
	    	path = Environment.MEDIA_UNMOUNTED;
	    }
		File dir = new File(path + "/GNCPlayer/");
        if(!dir.isDirectory()) {
        	dir.mkdirs();
    		virsionDlg.show();
        }
        
		final Builder errorDlg = new AlertDialog.Builder(this)
        .setTitle("에러")
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
		
        View homeBtn = findViewById(R.id.imageButton1);
        homeBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				PathList_prev.add(nPath);
				updateFileList(null);
			}
        });
        
        prevBtn = findViewById(R.id.imageButton2);
        prevBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if(PathList_prev.size() > 0) {
					PathList_next.add(nPath);
					nPath = PathList_prev.get(PathList_prev.size()-1);
					PathList_prev.remove(PathList_prev.size()-1);
					updateFileList(nPath);
				}
			}
        });
        
        nextBtn = findViewById(R.id.imageButton4);
        nextBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if(PathList_next.size() > 0) {
					PathList_prev.add(nPath);
					nPath = PathList_next.get(PathList_next.size()-1);
					PathList_next.remove(PathList_next.size()-1);
					updateFileList(nPath);
				}
			}
        });
        
        upBtn = findViewById(R.id.imageButton3);
        upBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if(!nPath.equals("/")) {
					File dir = new File(nPath);
					dir = new File(dir.getParent());
					if(dir.isDirectory() && dir.canRead()) {
						nPath = dir.getAbsolutePath().toString();
						PathList_prev.add(nPath);
						PathList_next.clear();
						if(!nPath.endsWith("/")) {
							nPath += "/";
						}
						updateFileList(nPath);
					} else {
						errorDlg.setMessage("폴더가 없거나 읽을 수 없습니다.").show();
					}
				}
			}
        });
        
        updateFileList(nPath);
        
        fileList.setOnItemClickListener(new OnItemClickListener() {
        	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        		ListData item = arrayList.get(position);
        		if(item.gettype() == 0) {
        			File dir = new File(nPath + item.getname() + "/");
    				if(dir.isDirectory() && dir.canRead()) {
    					PathList_prev.add(nPath);
    					PathList_next.clear();
    					nPath = dir.getAbsolutePath().toString();
    					if(!nPath.endsWith("/")) {
    						nPath += "/";
    					}
    					updateFileList(nPath);
    				} else {
    					errorDlg.setMessage("폴더가 없거나 읽을 수 없습니다.").show();
    				}
        		}
        	}
        });
    }
    
	public void updateFileList(String sPath) {
	    String ext = Environment.getExternalStorageState();
	    String path = null;
	    ListData temp;
	    int type;
	    long size = 0;
	    String name;
	    
	    if(sPath == null) {
		    if(ext.equals(Environment.MEDIA_MOUNTED)) {
		    	path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
		    } else {
		    	path = Environment.MEDIA_UNMOUNTED;
		    }
	    } else {
	    	path = sPath;
	    }
	    
	    dirText.setText(path);
	    nPath = path;
	
	    File files = new File(path);
	    arrayList = new ArrayList<ListData>();
	
	    if(files.listFiles().length > 0) {
		    for(File file : files.listFiles()) {
		    	name = file.getName();
		    	if(file.isDirectory()) {
		    		type = 0;
		    	} else if(file.getName().endsWith(".mpg")
		    			||file.getName().endsWith(".avi")
		    			||file.getName().endsWith(".wmv")
		    			||file.getName().endsWith(".asf")
		    			||file.getName().endsWith(".mp4")
		    			||file.getName().endsWith(".mkv")) {
		    		type = 1;
		    	} else if(file.getName().endsWith(".apk")) {
		    		type = 2;
		    	} else {
		    		type = 3;
		    	}
		    	
		    	if(type != 0) {
		    		size = file.length();
		    	}
		    	temp = new ListData(type, name, size);
		    	arrayList.add(temp);
		    }
	    }
	    
	    adapter = new GroupAdapter(this,R.layout.listview,arrayList);
        fileList.setAdapter(adapter);
        
        if(PathList_prev.size() > 0) {
        	prevBtn.setEnabled(true);
        } else {
        	prevBtn.setEnabled(false);
        }
        
        if(PathList_next.size() > 0) {
        	nextBtn.setEnabled(true);
        } else {
        	nextBtn.setEnabled(false);
        }
        
        if(!nPath.equals("/")) {
        	upBtn.setEnabled(true);
		} else {
			upBtn.setEnabled(false);
		}
    }
   
    private class GroupAdapter extends ArrayAdapter<Object> {
    	private ArrayList<ListData> item;
    	private ListData temp;
    	
    	@SuppressWarnings({ "unchecked", "rawtypes" })
		public GroupAdapter(Context ctx, int resourceID, ArrayList item) {
    		super(ctx, resourceID, item);
    		
    		this.item = item;
    	}
    	
    	public View getView(int position, View convertView, ViewGroup parent) {
    		View v = convertView;
    		if(v == null) {
    			LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    			v = vi.inflate(R.layout.listview, null);
    		}
    		temp = item.get(position);
    		
    		if(temp != null) {
    			ImageView icon = (ImageView)v.findViewById(R.id.imageView1);
    			TextView name = (TextView)v.findViewById(R.id.textView1);
    			TextView size = (TextView)v.findViewById(R.id.textView2);
    			switch(temp.gettype()) {
    			case 0:
    				icon.setImageResource(R.drawable.folder_horizontal);
    				break;
    			case 1:
    				icon.setImageResource(R.drawable.film);
    				break;
    			case 2:
    				icon.setImageResource(R.drawable.application_blue);
    				break;
    			default:
    				icon.setImageResource(R.drawable.document);
    				break;
    			}
    			name.setText(temp.getname());
    			if(temp.gettype() == 0) {
    				size.setText("(폴더)");
    			} else {
    				size.setText("(" + byteTranslater(temp.getsize()) + ")");
    			}
    		}
    		return v;
    	}
    }
    
    public static String byteTranslater(long size) {
      	NumberFormat nf = NumberFormat.getIntegerInstance();
      	java.text.DecimalFormat df = new java.text.DecimalFormat("#,##0.00");
      	int intSize = 0;
      	int kbyteSize = 1024;
      	double doubleSize = 0;
      	String returnSize = null;

      	if(size >= (1000 * 1024 * 1024)) {
      		intSize = new Long(size / (1000 * 1024 * 1024)).intValue();
      		return nf.format(intSize) + "GB";
      	} else if (size > (kbyteSize * 1024)) {
      		intSize = (int) (((double) size) / ((double) (kbyteSize * 1024)) * 100);
      		doubleSize = (double) (((double) intSize) / 100);
      		returnSize = df.format(doubleSize);
	      	if (returnSize.lastIndexOf(".") != -1) {
		      	if ("00".equals(returnSize.substring(returnSize.length() - 2, returnSize.length()))) {
			      	returnSize = returnSize.substring(0, returnSize.lastIndexOf("."));
		      	}
	      	}
	      	return returnSize + "MB";
      	} else if (size > kbyteSize) {
      		intSize = new Long(size / kbyteSize).intValue();
      		return nf.format(intSize) + "KB";
      	} else {
      		return "1KB";
      	}
    }
}


[마치면서]

너무 급하게 정리해버린 듯한 감이 없잖아 있습니다.
남에게 뭔가 가르치는데 재능이 없다보니...

더 필요한 내용은 댓글로 질문 해주시면 답변 드리겠습니다.
posted by 우주청년

댓글을 달아 주세요

  1. 김정환 2014.09.09 14:25  Addr Edit/Del Reply

    와~ 좋은 정보 감사합니다.
    복 받으실거에요 ^^