2012-09-05 39 views
13

Đây là mã ví dụ của tôi:Máy ảnh Hướng dẫn dành cho Android (sử dụng surfaceview)

package newslab.video.server; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class VideoServer extends Activity implements SurfaceHolder.Callback { 
    TextView testView; 

    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 

    private final String tag = "VideoServer"; 

    Button start, stop; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     start = (Button)findViewById(R.id.btn_start); 
     start.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View arg0) { 
       start_camera(); 
      } 
     }); 

     stop = (Button)findViewById(R.id.btn_stop); 
     stop.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View arg0) { 
       stop_camera(); 
      } 
     }); 

     surfaceView = (SurfaceView)findViewById(R.id.surfaceView1); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    private void start_camera() { 
     try{ 
      camera = Camera.open(); 
     }catch(RuntimeException e){ 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
     Camera.Parameters param; 
     param = camera.getParameters(); 
     //modify parameter 
     param.setPreviewFrameRate(20); 
     param.setPreviewSize(176, 144); 
     camera.setParameters(param); 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
     } catch (Exception e) { 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
    } 

    private void stop_camera() { 
     camera.stopPreview(); 
     camera.release(); 
    } 

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 
} 

Tuy nhiên, nó chỉ cho thấy xem trước và ngăn chặn các máy ảnh.
Có hướng dẫn nào khác để dạy thêm về xử lý như cách lưu ảnh hoặc xử lý ảnh bằng bitmap không?

+0

không sử dụng máy ảnh gốc nghĩa là gì? bạn đang sử dụng camera nào? –

+0

không phải mục đích – jjLin

+0

bạn có giải pháp truy vấn cơ bản của mình không? –

Trả lời

29

Ok. Vì vậy, đây là giải pháp:

Tôi không thêm bất kỳ sự cố gắng nào. Điều này chỉ đơn giản là để chụp hình ảnh và lưu trữ nó vào sdcard.

public class VideoServer extends Activity implements SurfaceHolder.Callback { 
    TextView testView; 

    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 
    PictureCallback rawCallback; 
    ShutterCallback shutterCallback; 
    PictureCallback jpegCallback; 
    private final String tag = "VideoServer"; 

    Button start, stop, capture; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     start = (Button)findViewById(R.id.btn_start); 
     start.setOnClickListener(new Button.OnClickListener() 
     { 
      public void onClick(View arg0) { 
       start_camera(); 
      } 
     }); 
     stop = (Button)findViewById(R.id.btn_stop); 
     capture = (Button) findViewById(R.id.capture); 
     stop.setOnClickListener(new Button.OnClickListener() 
     { 
      public void onClick(View arg0) { 
       stop_camera(); 
      } 
     }); 
     capture.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       captureImage(); 
      } 
     }); 

     surfaceView = (SurfaceView)findViewById(R.id.surfaceView1); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     rawCallback = new PictureCallback() { 
      public void onPictureTaken(byte[] data, Camera camera) { 
       Log.d("Log", "onPictureTaken - raw"); 
      } 
     }; 

     /** Handles data for jpeg picture */ 
     shutterCallback = new ShutterCallback() { 
      public void onShutter() { 
       Log.i("Log", "onShutter'd"); 
      } 
     }; 
     jpegCallback = new PictureCallback() { 
      public void onPictureTaken(byte[] data, Camera camera) { 
       FileOutputStream outStream = null; 
       try { 
        outStream = new FileOutputStream(String.format(
          "/sdcard/%d.jpg", System.currentTimeMillis())); 
        outStream.write(data); 
        outStream.close(); 
        Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
       } 
       Log.d("Log", "onPictureTaken - jpeg"); 
      } 
     }; 
    } 

    private void captureImage() { 
     // TODO Auto-generated method stub 
     camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
    } 

    private void start_camera() 
    { 
     try{ 
      camera = Camera.open(); 
     }catch(RuntimeException e){ 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
     Camera.Parameters param; 
     param = camera.getParameters(); 
     //modify parameter 
     param.setPreviewFrameRate(20); 
     param.setPreviewSize(176, 144); 
     camera.setParameters(param); 
     try { 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
      //camera.takePicture(shutter, raw, jpeg) 
     } catch (Exception e) { 
      Log.e(tag, "init_camera: " + e); 
      return; 
     } 
    } 

    private void stop_camera() 
    { 
     camera.stopPreview(); 
     camera.release(); 
    } 

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

} 

Không nhấn caputure nút trước bắt đầu, bởi vì tôi đã không kiểm tra nó. Tôi chỉ muốn cho bạn thấy cách chụp và lưu trữ hình ảnh vào thẻ sdcard.

+1

để biết thêm thông tin.truy cập trang web này http://marakana.com/forums/android/examples/39.html –

+0

Giải pháp của bạn là hoàn hảo. Nhưng một câu hỏi nữa, làm thế nào tôi có thể nhận được hình ảnh được chụp dưới dạng bitmap để tạo thêm hiệu ứng? – jjLin

+1

cho rằng bạn phải lấy hình ảnh đã chụp từ sdcard bằng cách sử dụng này. Bitmap bitmap = BitmapFactory.decodeFile ("/ path/images/imageName.jpg"); Và bạn có thể thực hiện thêm thao tác trên bitmap –

12

Dont quên mất việc cho phép sử dụng máy ảnh trong tập tin Android Manifest,

<uses-permission android:name="android.permission.CAMERA" ></uses-permission> 

Ngoài ra bạn cần phải có sự cho phép để lưu trữ hình ảnh trên thẻ SD,

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
0

Tôi đã gặp vấn đề với camera, tìm hiểu cách triển khai và làm việc cùng và đã xem qua các tài nguyên này: Camera preview. Ở dưới cùng của trang, bạn có ví dụ về các kịch bản phổ biến nhất cũng như một trong câu hỏi ban đầu của bạn: Take and preview Photo

2

phép máy ảnh trong manifiest file:

<uses-feature android:name="android.hardware.camera" /> 
<uses-permission android:name="android.permission.CAMERA" /> 

Permission để lưu trữ hình ảnh từ sdcard trong manifiest tệp:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
Các vấn đề liên quan