Intent photoIntent = new Intent(Intent.ACTION_PICK);
photoIntent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
photoIntent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(photoIntent, REQUEST_PHOTO);

갤러리 호출 




@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_PHOTO:
if (data != null) {

String filePath = null;
Bitmap selectedImage = null;


if (data.getData() != null) {
filePath = Util.UpimageSave(SignModifyActivity.this, data, Util.getRealPathFromURI(this, data.getData()), Global.IMGSAVEDIR, 720 * 1280, 0, 100);
selectedImage = BitmapFactory.decodeFile(Global.IMGSAVEDIR +filePath);
}

if (selectedImage == null) {
Util.toast(SignModifyActivity.this, "갤러리를 사용해주세요.", 1);
return;
}

arrNormalFilePath = Global.IMGSAVEDIR +filePath;
ivTumbnail.setImageBitmap(selectedImage);
bImgModify = true;
strImgModity = "1";
selectedImage = null;
}
break;

}
}
}




public static String UpimageSave(Context context, Intent data, String PathName, String filePath, int limitSize, int inSampleSize, int quality){
String fileName = "";

Uri imageCaptureUri = data.getData();
fileName = String.valueOf(System.currentTimeMillis()) + ".jpg";
FileOutputStream out = null;
File file = new File(filePath);
Bitmap bit = null;
BitmapFactory.Options opt = null;
AssetFileDescriptor afd = null;
if(!file.isDirectory()){
file.mkdir();
}

try {

afd = context.getContentResolver().openAssetFileDescriptor(imageCaptureUri, "r");

opt = new BitmapFactory.Options();
BitmapFactory.decodeFile (PathName, opt);

opt.inSampleSize = calculateInSampleSize(opt, 480, 360);
opt.inJustDecodeBounds = false;
bit = BitmapFactory.decodeFile(PathName, opt);

out = new FileOutputStream(filePath + fileName);

File imageFile = new File(PathName.toString());
try {
ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotate = 0;
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate -= 90;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate -= 90;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate -= 90;
}

Log.i(TAG, "Detected orientation " + orientation);
if (rotate != 0) {
Log.i(TAG, "Rotating... " + rotate);
bit = bit.copy(Bitmap.Config.ARGB_8888, true);
Matrix matrix = new Matrix();
matrix.postRotate(-rotate);
bit = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),
bit.getHeight(), matrix, true);
}
} catch (IOException io) {
Log.i(TAG, "EXIF failed: " + io.toString());
}

bit.compress(CompressFormat.JPEG, quality, out);
out.close();
if(bit != null){
Util.toast(context, "사진이 첨부되었습니다.", 1);
}

} catch (Exception e) {
e.printStackTrace();
showDialog((Activity)context, "알림","변경에 실패 하였습니다. 다시 시도해 주십시오.", null);

} finally {
try{
if(afd != null){
afd.close();
afd = null;
}
if(bit != null){
bit.recycle();
bit = null;
}
out.close();
}catch (Exception e) {
e.printStackTrace();

}
}

if(!imagReSizeQuality(Global.IMGSAVEDIR + fileName, limitSize)){
Util.showDialog((Activity) context, "알림", "사진 용량이 큽니다.(5MB이하)", null);
deleteFile(filePath, fileName);
fileName = "";
return fileName;
}

return fileName;
}



public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

final int halfHeight = height / 2;
final int halfWidth = width / 2;

// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}

return inSampleSize;
}


'안드로이드' 카테고리의 다른 글

해상도  (0) 2017.08.18
프래그먼트에서 OptionMenu 사용  (0) 2017.04.07
안드로이드 스튜디오 단축키  (0) 2017.04.05
RecyclerView (admob) 추가하기  (0) 2017.04.05
CoordinatorLayout  (0) 2017.04.05

추장보다 높은 사람은? 고추장


모든사람을 일어나게 하는 숫자는 다섯


화장실에 사는 두마리 용은? 신사용, 숙녀용


반성문을 영어로 하면? 글로벌


세상에서 가장 지루한 중학교는? 로딩중


숫자 오가 가장싫어하는 집은? 오페라하우스


할아버지가 가장 좋아하는 돈은? 할머니


맥주가 죽기전에 남긴말은? 유언비어


가장 외로운 몬스터는? 솔로몬


세상에서 가장 지루한 중학교는? 로딩중


반성문을 영어로 하면? 글로벌

모자가 뭉쳐 있으면? 밀짚모자

전화로 세운 건물의 이름은? 콜로세움

화장실에 사는 두마리 용은? 신사용 숙녀용

사람들이 늘 가지고 다니는 흉기는? 머리칼

아프지도 않은데 매일 집에서 쓰는 약은? 치약

모든 사람 일어나게 하는 숫자는? 닷서

침대를 밀고 돌리면? 배드민턴

추장보다 높은 사람은? 고추장

김밥이 죽으면 어디로? 김밥천국

노인이 가장 좋아하는 폭포는? 나이아가라 폭포

할아버지가 좋아하는 돈은? 할머니

미국에서 비가 내리면? USB

어부들이 싫어하는 가수는? 배철수

세상에서 가장 긴 음식은? 참기름

그 다음으로 긴 음식은? 들기름

지방흡입의 반댓말은? 수도권배출

3월에 대학생이 강한 이유는? 개강해서


메인Thread

안드로이드의 애플리케이션을 실행하면 시스템은 메인 액티비티를 메모리로 올려 프로세스로 만들며, 이 때 메인 스레드가 자동으로 생성됩니다. 메인 스레드는 안드로이드의 주요 컴퍼넌트를 실행하는 곳이자 UI를 그리거나 갱신하는 일을 담당할 수 있는 유일한 스레드이므로 UI 스레드라고도 불립니다.




AsyncTask는 UI 처리 및 Background 작업 등 을 하나의 클래스에서 작업 할 수 있게 지원해 줍니다. 쉽게말해 메인Thread와 일반Thread를 가지고 Handler를 사용하여 핸들링하지 않아도 AsyncTask 객체하나로 편하게 UI를 수정 할 수 있고, Background 작업을 진행 할 수 있다.


일반Thread에서 UI 객체에 직접 접근할 수 없기 때문에 핸들러를 사용하지만 핸들러를 사용하면 코드를 복잡하게 만드는 문제가 생긴다.


백그라운드 작업을 좀더 간단하게 AsyncTask 클래스를 사용할 수 있다. AsyncTask  객체를 만들고 execute() 메소드를 실행하면 이 객체는 정의된 백그라운드 작업을 수행하고 그결과를 메인 스레드에서 실행하기떄문에 UI객체에 접근하는데 문제가 없다.



1. onPreExecute() : Background 작업 시작전에 UI 작업을 진행 한다.

 @Override 
 protected void onPreExecute() {
       super.onPreExecute(); 
 }


2. doInBackground() : Background 작업을 진행 한다.

 @Override 
 protected String doInBackground(String... params) {
       super.onPreExecute(); 
 }


3. onPostExecute() : Background 작업이 끝난 후 UI 작업을 진행 한다.

 @Override 
 protected void onPostExecute(String result) {
       super.onPreExecute(); 
 }




[onPreExecute()] -> [doInBackground()] -> [onPostExecute()] 순서




onPreExecute( ), onProgressUpadate( ), onPostExecute( ) 메소드는 메인 스레드에서 실행되므로 UI 객체에 자유롭게 접근할 수 있다


'안드로이드 > AsyncTask' 카테고리의 다른 글

AsyncTask(1)  (0) 2017.08.18
private RequestBody createPartFromString(String descriptionString) {
return RequestBody.create(
okhttp3.MultipartBody.FORM, descriptionString);
}
String id = edtId.getText().toString();
String name = edtName.getText().toString();
String passwd = edtPasswd.getText().toString();
String confirmPasswd = edtConfirmPasswd.getText().toString();
String token = FirebaseInstanceId.getInstance().getToken();


MultipartBody.Part body = null;
if (FilePath != null) {
File file = new File(FilePath);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
body = MultipartBody.Part.createFormData("PHOTO1", file.getName(), requestFile);
}

RequestBody uid = createPartFromString(PropertyManager.getInstance().getId());
RequestBody uname = createPartFromString(name);
RequestBody upass = createPartFromString(passwd);
RequestBody utoken = createPartFromString(token);


HashMap<String, RequestBody> map = new HashMap<>();
map.put("id", uid);
map.put("name", uname);
map.put("passwd", upass);
map.put("token", utoken);





'안드로이드 > Retrofit 2' 카테고리의 다른 글

Retrofit2  (0) 2017.04.05

File > Settings 단축키

Ctrl + Alt + S


Import 정리

Ctrl + Alt + O


소스코드 정렬

Ctrl + Alt + L


게터 세터 생성자 자동생성

Getter Setter Constructor Generate

Alt + Insert


Surround With (if / else, try / catch 등 블록 자동생성)

Ctrl + Alt + T



검색, 찾기, Search

Ctrl + F (다음 F3, 이전 Shift + F3)

경로지정, 폴더 내 검색

Ctrl + Shift + F

Search Everywhere 전체검색

Double Shift


Go to declaration (선언된 곳 찾아가기)

Ctrl + B 또는 Ctrl + Click(Mouse)


Usage Search

Alt + F7 / Ctrl + F7 : 사용 내용 전체찾기 / 파일에서 사용한 것 찾기

Ctrl + Shift + F7 : 현재 파일에서 하이라이트

Ctrl + Alt + F7 : 사용된 것 새 창으로 보여줌


Compile and Run

Shift + F10 : Run


복사 히스토리, 선택 붙여넣기

Ctrl + Shift + V : 이전에 클립보드에 복사한 히스토리 열기


Ctrl + Delete : 단어 끝까지 삭제

Ctrl + Backspace : 단어 처음까지 삭제


소스 코드 줄 이동

Alt + Shift + Up : Move Line Up

Alt + Shift + Down : Move Line Down


최근 파일 목록

Ctrl + E


메소드 이동

Alt + Up : Move Up

Alt + Down : Move Down



'안드로이드' 카테고리의 다른 글

프래그먼트에서 OptionMenu 사용  (0) 2017.04.07
안드로이드 업로드 이미지 리사이징  (0) 2017.04.05
RecyclerView (admob) 추가하기  (0) 2017.04.05
CoordinatorLayout  (0) 2017.04.05
Toolbar  (0) 2017.04.05

import android.app.Activity;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.NativeExpressAdView;
import java.util.ArrayList;
import java.util.List;

public class BoardListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

List<BoardData> items = new ArrayList<>();

private Activity activity;
int AD_TYPE = 0;
int CONTENT_TYPE = 1;

public BoardListAdapter(Context context){
activity = (Activity) context;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
BoardListHolder holder;
NativeExpressAdView mNativeExpressAdView;

if (viewType == AD_TYPE) {
mNativeExpressAdView = new NativeExpressAdView(activity);
mNativeExpressAdView.setAdSize(new AdSize(350, 260));
mNativeExpressAdView.setAdUnitId(activity.getString(R.string.native_ad_unit_id3));

AdRequest.Builder adRequestBuilder = new AdRequest.Builder();

AbsListView.LayoutParams params = new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT,
AbsListView.LayoutParams.WRAP_CONTENT);
mNativeExpressAdView.setLayoutParams(params);

mNativeExpressAdView.loadAd(adRequestBuilder.build());

holder = new BoardListHolder(mNativeExpressAdView);
}else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_list_board, parent, false);
holder = new BoardListHolder(view);
}

return holder;

}

@Override
public int getItemViewType(int position) {
if (position % 6 == 3)
return AD_TYPE;
return CONTENT_TYPE;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(position % 6 != 3) {
((BoardListHolder) holder).setFriend(items.get(position));
((BoardListHolder) holder).img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.onClickContentView(items.get(position));
}
});

}
}

@Override
public int getItemCount() {
return items.size();
}

public void setList(List<BoardData> data) {
items = data;
}

public interface OnClickBoardAdapterListener {
public void onClickContentView(BoardData boarddata);

}

OnClickBoardAdapterListener mListener;

public void setOnClickBoardAdapterListener(OnClickBoardAdapterListener listener) {
mListener = listener;
}
}





import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.bumptech.glide.Glide;
import com.google.android.gms.ads.NativeExpressAdView;



public class BoardListHolder extends RecyclerView.ViewHolder {

public BoardListHolder(View itemView) {
super(itemView);
if (!(itemView instanceof NativeExpressAdView)) {
ButterKnife.bind(this, itemView);
}
}



}


'안드로이드' 카테고리의 다른 글

안드로이드 업로드 이미지 리사이징  (0) 2017.04.05
안드로이드 스튜디오 단축키  (0) 2017.04.05
CoordinatorLayout  (0) 2017.04.05
Toolbar  (0) 2017.04.05
ButterKnife  (0) 2017.04.05

객체지향언어

객체지향언어는 기존의 프로그래밍언어와 다른 전혀 새로운 것이 아니라, 기존의 프로그램밍 언어

몇가지 새로운 규칙을 추가한 보다 발전된 형태의 것이다. 이러한 규칙들을 이용해서 코드간에 서로

관계를 맺어 줌으로써 보다 유기적으로 프로그램을 구성하는 것이 가능하다

주요특징은 코드의 재사용성, 코드의 관리가 용이, 신뢰성이 높은 프로그래밍을 가능하게 한다.

기존의 프로그래밍 언어에 몇가지 새로운 규칙을 추가한 보다 발전된 형태의 것이다. 이러한 규칙들을 이용해서 코드간에 서로 관계를 맺어 줌으로써 보다 유기적으로 프로그램을 구성

 

 

클래스

객체를 정의해놓은것 또는 클래스는 객체의 설계도 또는 이라고 정의

 

 

객체란 무엇인가

물리적으로 식별가능한 우리 주위에서 있는 모든 것이 객체라고 할수 있다.

 

 

오버로딩

같은 이름의 메소드를 여러 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

메소드 오버로딩과 생성자 오버로딩이 있다 그러나 둘다 같은 개념이다.

같은이름의 함수를 여러 정의하고 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출

응답하게 하는것이다.

 

오버라이딩

상위 클래스가 가지고 있는 메소드를 상속 밭을 자식 클래스에서 메소드를 정의 하는 것을

말한다.

 

상속

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다

  

Final 키워드

변수 - final 적용된 변수의 값은 초기화된 이후에는 변경이 불가능하다.

메서드 - final로 선언된 메서드는 하위클래스에서 오버라이드를 할 수 가 없다.

클래스 - final로 선언된 클래스는 하위 클래스를 만들 수 없다.

 

static 필드

1)특정 클래스를 통해서 만들어지는 모든 객체에서 공통으로 사용하는 필드

2) static 필드의 내용은 정적메모리영역에 1개만 존재한다.

3) 메인메서드가 동작하기 전에 JVM의 startUp 코드에 의해서 미리 생성된다. 개별 객체를 생성하지 않아도 메모리에 만들어져 있다.

4) 하지만 클래스의 멤버이므로 접근권한(public,private)의 영향을 받는다.

5) 일반메서드 및 static메서드 내부에서 자유롭게 접근할 수 있다.

 

static 메서드==> static 필드만 접근할 수 있는 메서드

2) 일반 필드는 접근할 수 없다( 이유는 this를 사용할 수 없기 때문이다)

3) 이곳에서 static 필드의 내용값을 변경시키는 루틴을 작성

4) 클래스에서 제공하는 유틸리티(utility) 메서드를 작성하기에 적합

개별 멤버변수와 상관없는 로직으로 구현된 메서드

5) 클래스명.static메서드()

객체명.static메서드()

6) static 메서드 내부에서 static 메서드만 호출가능하다

일반 메서드 호출하면 error( 일반메서드가 호출되면 일반멤버변수가 변경될 수 있다)

7) 객체 생성 없이 호출 할 수 있다. 

'자바' 카테고리의 다른 글

팩토리얼(Factorial)  (0) 2017.08.18
선택정렬  (0) 2017.04.13
삽입정렬  (0) 2017.04.13
비트연산자  (0) 2017.04.07
추상클래스  (0) 2016.08.17

기본 API가 아닌 support design widget 입니다.

 

CollapsingToolbarLayout는 FrameLayout을 상속받은 Layout로 

Toolbar를 애니메이션을 통해 확장해 주는 용도로 사용하고 있습니다.

'안드로이드' 카테고리의 다른 글

안드로이드 스튜디오 단축키  (0) 2017.04.05
RecyclerView (admob) 추가하기  (0) 2017.04.05
Toolbar  (0) 2017.04.05
ButterKnife  (0) 2017.04.05
RecyclerView  (0) 2017.04.05

+ Recent posts