이제 지도에서 위치까지올리고, 등등했으니, 이제 이미지를 업로드하고 나타내는 것까지 한번해보도록 해야겠다. 그래서 일단 기본적인 사진을 찍었을때 그 이미지를 어떻게 해야하는지 몰랐으나,,이제 알아내게 되었다. 일단 기본적으로 메인에 ImageView를 만들어서 거기에다가 내가 가져온 사진을 덮어쓰는 형식으로 진행하는 것이었다. 그러면 이제 소스를 알아보도록 하자.일단 다른 능력자분 것을 인용하였으니, 그능력자분께 너무너무 다시한번 감사드리며 이소스를 분석해서 FTP로 올리는 작업까지 같이해야겠다. 일단 먼저 사진찍기와 앨범 가져오는 방법부터 알아 보도록 하자.
일단 메인 xml부분이다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PictureTest"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="사진입니다. "
/>
<Button
android:id="@+id/getCustom"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="사진 불러오기 "/>
<ImageView
android:id="@+id/imgView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
/>
</LinearLayout>
아주 간단하게 텍스트,버튼 ,이미지뷰 하나 만들어 놓았다.
그리고 다이어로그에띄울 xml을 보도록 하자
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/camera"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="카메라"
/>
<Button
android:id="@+id/photoAlbum"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="앨범 "
/>
</LinearLayout>
이것또한 간단하다!! 그냥 버튼 2개를 만들어서 카메라인지앨범인지 구하는 것이다.
레이아웃은 간단하지만 역시나 가장중요한것은 소스이다 소스를 보도록해야겠다.
package com.example.picturetest;
import java.io.File;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore;
import android.view.View;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.Toast;
public class PictureTest extends Activity implements View.OnClickListener{
//사진으로 전송시 되돌려 받을 번호
static int REQUEST_PICTURE=1;
//앨범으로 전송시 돌려받을 번호
static int REQUEST_PHOTO_ALBUM=2;
//첫번째 이미지 아이콘 샘플 이다.
static String SAMPLEIMG="ic_launcher.png"
ImageView iv;
Dialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_picture_test);
//여기에 일단 기본적인 이미지파일 하나를 가져온다.
iv=(ImageView) findViewById(R.id.imgView);
//가져올 사진의 이름을 정한다.
findViewById(R.id.getCustom).setOnClickListener(this);
}
@Override
public void onClick(View v){
//첫번째로 사진가져오기를 클릭하면 또다른 레이아웃것을 다이어로그로 출력해서
//선택하게끔 하자 !!!!
if(v.getId()==R.id.getCustom){
//다이어로그를 먼저만들어낸다.
AlertDialog.Builder builder=new AlertDialog.Builder(this);
//이곳에 만드는 다이어로그의 layout 을 정한다.
View customLayout=View.inflate(this,R.layout.custom_button,null);
//현재 빌더에 우리가만든 다이어로그 레이아웃뷰를 추가하도록하자!!
builder.setView(customLayout);
//다이어로그의 버튼에 카메라와 사진앨범의 클릭 기능을 넣어주자.
customLayout.findViewById(R.id.camera).setOnClickListener(this);
customLayout.findViewById(R.id.photoAlbum).setOnClickListener(this);
//지금까지 만든 builder를 생성하고, 띄우자.!!!
dialog=builder.create();
dialog.show();
}else if(v.getId()==R.id.camera){
//카메라버튼인경우,일단 다이어로그를 끄고 사진을 찍는 함수를 불러오자
dialog.dismiss();
takePicture();
}else if(v.getId()==R.id.photoAlbum){
//이경우역시 다이어로그를 끄고 앨범을 불러오는 함수를 불러오자!!
dialog.dismiss();
photoAlbum();
}
}
void takePicture()[
//사진을 찍는 인텐트를 가져온다. 그인텐트는 MediaStore에있는
//ACTION_IMAGE_CAPTURE를 활용해서 가져온다.
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//그후 파일을 지정해야하는데 File의 앞부분 매개변수에는 파일의 절대경로를 붙여야
//한다. 그러나 직접 경로를 써넣으면 sdcard접근이 안되므로 ,
//Environment.getExternalStorageDirectory()로 접근해서 경로를 가져오고 두번째
//매개 변수에 파일이름을 넣어서 활용 하도록하자!!
File file=new File(Environment.getExternalStorageDirectory(),SAMPLEIMG);
//그다음에 사진을 찍을대 그파일을 현재 우리가 갖고있는 SAMPLEIMG로 저장해야
//한다. 그래서 경로를 putExtra를 이용해서 넣도록 한다. 파일형태로 말이다.
//그리고 실제로 이파일이 가리키는 경로는 /mnt/sdcard/ic_launcher)
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));
//그럼이제사진찍기 인텐트를 불러온다.
startActivityForResult(intent,REQUEST_PICTURE);
}
void photoAlbum(){
//저장된 사진을 불러오는 함수이다. 즉앨범에있는것인데 인텐트는 ACTION_PICK
Intent intent=new Intent(Intent.ACTION_PICK);
//갤러리리의 기본설정 해주도록하자!아래는이미지와그경로를 표준타입으로 설정한다.
intent.setType(Images.Media.CONTENT_TYPE);
//사진이 저장된위치(sdcard)에 데이터가 잇다고 지정
intent.setData(Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent,REQUEST_PHOTO_ALBUM);
}
BItmap loadPicture(){
//사진찍은 것을 로드 해오는데 사이즈를 조절하도록하자!!일단 파일을 가져오고
File file=new File(Environment.getExternalStorageDirectory(),SAMPLEIMG);
//현재사진찍은 것을 조절하구이해서 조절하는 클래스를 만들자.
BitmapFactory.Options options=new BitmapFactory.Options();
//이제 사이즈를 설정한다.
options.inSampleSize=4;
//그후에 사진 조정한것을 다시 돌려보낸다.
return BitmapFactory.decodeFile(file.getAbsolutePath(),options);
}
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
if(requestCode==REQUEST_PICTURE){
//사진을 찍은경우 그사진을 로드해온다.
iv.setImageBitmap(loadPicture());
}
if(requestCode==REQUEST_PHOTO_ALBUM){
//앨범에서 호출한경우 data는 이전인텐트(사진갤러리)에서 선택한 영역을 가져오게된다.
iv.setImageURI(data.getData());
}
}
}
}
이상 아주간단하게 사진을 로딩할 수있는 것을 알아보았다..흐음 그렇쿤 사진은 sdcard로들어가고 경로에 대해서 절대 경로 파팍치면안된다는 것!! 알아냇다. 그럼이것을 토대로 회원 가입시 사진을 등록 할수잇도록, 그리고 사진을 수정할 수있도록 해보아야 겠다