사진을 찍는 것까지는 되는데 당최 서버로 날라가지 않습니다...
// logcat 은 빨간 줄만 적어봤습니다.
===============================
05-24 11:25:41.442: E/Trace(17016): error opening trace file: No such file or directory (2)
05-24 11:25:41.632: E/dalvikvm(17016): Could not find class 'org.apache.http.entity.mime.content.FileBody', referenced from method kr.yjc.camera.CameraTestActivity.doFileUpload
05-24 11:25:46.932: E/AndroidRuntime(17016): FATAL EXCEPTION: main
05-24 11:25:46.932: E/AndroidRuntime(17016): java.lang.NoClassDefFoundError: org.apache.http.entity.mime.content.FileBody
05-24 11:25:46.932: E/AndroidRuntime(17016): at kr.yjc.camera.CameraTestActivity.doFileUpload(CameraTestActivity.java:183)
05-24 11:25:46.932: E/AndroidRuntime(17016): at kr.yjc.camera.CameraTestActivity$3.onPictureTaken(CameraTestActivity.java:142)
05-24 11:25:46.932: E/AndroidRuntime(17016): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:768)
05-24 11:25:46.932: E/AndroidRuntime(17016): at android.os.Handler.dispatchMessage(Handler.java:99)
05-24 11:25:46.932: E/AndroidRuntime(17016): at android.os.Looper.loop(Looper.java:137)
05-24 11:25:46.932: E/AndroidRuntime(17016): at android.app.ActivityThread.main(ActivityThread.java:5041)
05-24 11:25:46.932: E/AndroidRuntime(17016): at java.lang.reflect.Method.invokeNative(Native Method)
05-24 11:25:46.932: E/AndroidRuntime(17016): at java.lang.reflect.Method.invoke(Method.java:511)
05-24 11:25:46.932: E/AndroidRuntime(17016): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-24 11:25:46.932: E/AndroidRuntime(17016): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-24 11:25:46.932: E/AndroidRuntime(17016): at dalvik.system.NativeStart.main(Native Method)
===============================
안드로이드 소스
sdcard에 저장은되는데 갤러리에는 안뜨네요.
lib 입니다.
android-support-v4.jar
apache-mime4j-0.6.1-bin.zip
commons-logging-1.1.1.jar
httpcore-4.0.1.jar
httpmime-4.0.3.jar
===============================
public class CameraTestActivity extends Activity {
private static final String TAG = "CameraTestActivity";
//카메라 제어
private Camera camera;
//촬영된 사진보기
private ImageView imageView;
//처리 중
private boolean inProgress;
//카메라에 찍힌 이미지 데이터
byte[] data;
DataOutputStream dos;
ImageView view;
SurfaceView surfaceView;
//카메라 SurfaceView의 리스터
private SurfaceHolder.Callback surfaceListener =
new SurfaceHolder.Callback() {
// SurfaceView가 생성되었을 때 화면에 보여주기위한 초기화 작업을 수행
// 카메라를 오픈하고, 프리뷰의 위치를 설정한다.
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//SurfaceView가 화면에 표시되지 않을 때 (액티비티가 비활성화 될때) 호출한다.
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera.release();
camera = null;
}
// surfaceCreate()가 호출된 다음 호출된다.
// 프리뷰의 크기를 설정하고 프리뷰 영상을 표시한다.
@Override
public void surfaceChanged(SurfaceHolder holder,
int format,
int width,
int height) {
// TODO Auto-generated method stub
// 카메라의 파라메터 값을 가져와서 미리보기 크기를 설정하고
// 프리뷰를 보여준다.
Camera.Parameters parameters =
camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
};
//카메라 셔터가 눌러질 때
private Camera.ShutterCallback shutterListener =
new Camera.ShutterCallback() {
@Override
public void onShutter() {
// TODO Auto-generated method stub
if(camera != null && inProgress == false){
camera.takePicture(
shutterListener, // 셔터 후
null, // Raw 이미지 생성 후
pictureListener);// JPEG 이미지 생성 후
inProgress = true;
}
}
};
Bitmap bitmap;
// JPEG 이미지를 생성 후 호출
private Camera.PictureCallback pictureListener =
new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// TODO Auto-generated method stub
if(data != null){
// 적용할 옵션이 있는 경우 BitmapFactory클래스의 Option()
// 메서드로 옵션객체를 만들어 값을 설정하여
// 이렇게 만들어진 옵션을 Bitmap 객체를 만들 때 네번째
// 아규먼트로 사용한다.
CameraTestActivity.this.data=data;
bitmap = BitmapFactory.decodeByteArray(data,
0,
data.length,
null);
// 이미지 뷰 이미지 설정
imageView.setImageBitmap(bitmap);
doSaveFile();
doFileUpload();
Toast.makeText(CameraTestActivity.this,
"서버에 파일을 성공적으로 전송하였습니다.",
Toast.LENGTH_LONG).show();
camera.startPreview(); // 정지된 프리뷰를 재개
inProgress = false; // 처리중 플래그를 끔
}
}
};
// File saveFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "mnt/sdcard/image01.jpg");
File saveFile = new File("/mnt/sdcard/DCIM/images04.jpg");
public void doSaveFile(){
OutputStream out = null;
try{
saveFile.createNewFile();
out = new FileOutputStream(saveFile);
bitmap.compress(CompressFormat.JPEG, 70, out);
}catch (Exception e){
e.printStackTrace();
}finally{
try{ out.close(); } catch (IOException e) {e.printStackTrace();}
}
}
public void doFileUpload(){
try {
HttpClient httpClient = new DefaultHttpClient();
String url = "http://192.168.10.100:8080/FileUpload/FileUpload.jsp";
HttpPost post = new HttpPost(url);
FileBody bin = new FileBody(saveFile);
MultipartEntity multipart =
new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
multipart.addPart("images", bin);
post.setEntity(multipart);
HttpResponse response = httpClient.execute(post);
HttpEntity resEntity = response.getEntity();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
// Activity가 실행될 때 호출
// Activity의 UI를 적용하기 위해 호출하는 setContentView(int)메소드,
// UI내의 위젯과 서로 정보를 주고받기 위한 findViewById(int) 메소드 등과
// 함께 Avtivity 초기화시 실행되는 메소드 중 하나
@Override
protected void onCreate(Bundle savedInstanceState) {
// 액티비티의 타이틀이 안보이도록 설정한다.
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.ImageView01);
surfaceView =
(SurfaceView) findViewById(R.id.SurfaceView01);
// surface를 제어하는 SurfaceHolder
SurfaceHolder holder = surfaceView.getHolder();
// SurfaceView 리스터를 등록
holder.addCallback(surfaceListener);
// 버퍼 사용하지 않음
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
super.onCreate(savedInstanceState);
}
@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;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(event.getAction() == KeyEvent.ACTION_DOWN ){
switch(keyCode){
case KeyEvent.KEYCODE_CAMERA:
shutterListener.onShutter();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
shutterListener.onShutter();
}
return true;
}
}
어디에 문제가 있는걸까요
사용자가 웹서버에서 보낸 요청을 수락 시 촬영을 하게 하려면 어떤식으로
구조를 짜야하는지 조언 부탁드립니다.
8000자 제한 걸리네요 ㅠㅠ