안녕하세요 이제 막 안드로이드에 대해 공부하고있는 대학생입니다..
카메라를 사용해서 어플을 만들고있는데 제가 지금 가지고잇는 카메라 어플 소스를 구동시키면 계속해서 뻗어버립니다....
저는 옵티머스g프로를 사용중인데 제가가진 코드로는 갤럭시s3, 갤럭시노트2만 됩니다...
검색하고 연구해본바 해상도 설정때문에 안되는거같은데 한번 코드확인 부탁드립니다. 그리고 해상도 를 1080*1920으로 바꾸고 싶은데 어떻게 해야되는지와 후면카메라로 전환해서 촬영하는 방법이 궁굼합니다.
//메인자바
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class Main extends Activity implements OnClickListener
{
Button button;
private Camera camera;
private int cameraId = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(this);
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))
{
Toast.makeText(this, "Camera is not found in your device", Toast.LENGTH_SHORT).show();
}
else
{
cameraId = findFrontSideCamera();
if (cameraId < 0)
{
Toast.makeText(this, "Front side camera is not found",Toast.LENGTH_SHORT).show();
}
else
{
camera = Camera.open(cameraId);
}
}
}
private int findFrontSideCamera()
{
int cameraId = -1;
int numberOfCameras = Camera.getNumberOfCameras();
for (int i = 0; i < numberOfCameras; i++)
{
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
if (info.facing == CameraInfo.CAMERA_FACING_FRONT)
{
cameraId = i;
break;
}
}
return cameraId;
}
public void onClick(View view)
{
CameraHandler ch = new CameraHandler(getApplicationContext());
camera.takePicture(null, null,ch);
}
@Override
protected void onPause()
{
// TODO Auto-generated method stub
if(camera!=null)
{
camera.release();
camera = null;
}
super.onPause();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
//파일 저장용 자바
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Environment;
import android.widget.Toast;
public class CameraHandler implements PictureCallback
{
String str = "CameraExampleFolder";
private final Context context;
public CameraHandler(Context context)
{
this.context = context;
}
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
// TODO Auto-generated method stub
File file = getDir();
if(!file.exists() && !file.mkdirs())
{
Toast.makeText(context, "File and Directory handling has some errors.", Toast.LENGTH_LONG).show();
return;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
String date = dateFormat.format(new Date());
String photoFile = "App_Test" + date + ".jpg";
String filename = file.getPath() + File.separator + photoFile;
File takenPicture = new File(filename);
try
{
FileOutputStream fos = new FileOutputStream(takenPicture);
fos.write(data);
fos.close();
Toast.makeText(context, "The taken photo is saved:" + photoFile,Toast.LENGTH_SHORT).show();
}
catch (Exception error)
{
Toast.makeText(context, "Saving process has some errors.", Toast.LENGTH_LONG).show();
}
}
private File getDir()
{
File sd_Dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
return new File(sd_Dir,str);
}
}
레이아웃- 메인xml
<RelativeLayout 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=".Main" >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Take a Photo"
android:id="@+id/button"
/>
</RelativeLayout>
메니페스트에 퍼미션은 모두 설정해 주었습니다.