2012-10-24 2 views
3

저는 처음부터 안드로이드에 새로운 카메라 앱을 만들었습니다. 런타임에 surfaceview를 만들었습니다. 위의 버튼 하나를 만들고 싶습니다. 어떻게 할 수 있습니까? ??? 그것은 당신의 onCreate()위한 대용품으로이 시도 이미지를안드로이드는 런타임에 표면 뷰에 버튼을 넣어 이미지를 캡쳐합니다.

package com.example.urvey.tool; 
import android.os.Bundle; 
import java.lang.*; 
import android.view.MenuItem; 
import android.widget.*; 
import android.support.v4.app.NavUtils; 
import android.text.Layout; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.List; 
import android.content.Intent; 
import android.annotation.SuppressLint; 
import android.app.ActionBar.LayoutParams; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.Size; 
import android.util.Log; 
import android.view.*; 



@SuppressLint({ "SdCardPath", "NewApi" }) public class Camera_screen extends Activity { 
    //AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera); 
     Preview P = new Preview(this); 
    setContentView(P); 

     Button myButton = new Button(this); 
     myButton.setText("Press Me"); 
System.out.println("halyu"); 
     RelativeLayout layout = (RelativeLayout) findViewById(R.id.cam_out); 
     layout.addView(myButton); 



    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_camera, menu); 
     return true; 
    } 



    @SuppressLint("SdCardPath") class Preview extends SurfaceView implements SurfaceHolder.Callback { 

     SurfaceHolder mHolder; 
     Camera mCamera; 



     public Preview(Context context) { 

      super(context); 

      // Install a SurfaceHolder.Callback so we get notified when the 
      // underlying surface is created and destroyed. 
      mHolder = this.getHolder(); 
      mHolder.addCallback(this); 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      System.out.println("constructor"); 
      } 


     @SuppressLint({ "SdCardPath", "SdCardPath" }) public void surfaceCreated(SurfaceHolder holder) { 
      // The Surface has been created, acquire the camera and tell it where 
      // to draw. 

      try { 

       mCamera = Camera.open(); 
       mCamera.setPreviewDisplay(holder); 

      } catch (IOException exception) { 
       mCamera.release(); 
       mCamera = null; 



       // TODO: add more exception handling logic here 
      } 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 
      // Surface will be destroyed when we return, so stop the preview. 
      // Because the CameraDevice object is not a shared resource, it's very 
      // important to release it when the activity is paused. 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 

     public void previewCamera() 
     {   
      try 
      {   
       mCamera.setPreviewDisplay(mHolder);   
       mCamera.startPreview(); 
      } 
      catch(Exception e) 
      { 

      } 
     } 


     @SuppressLint("NewApi") public Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters){ 
      Camera.Size bestSize = null; 
      List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes(); 

      bestSize = sizeList.get(0); 

      for(int i = 1; i < sizeList.size(); i++){ 
      if((sizeList.get(i).width * sizeList.get(i).height) > 
       (bestSize.width * bestSize.height)){ 
       bestSize = sizeList.get(i); 
      } 
      } 

      return bestSize; 
      } 



     @SuppressLint("NewApi") public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
      // Now that the size is known, set up the camera parameters and begin 
      // the preview. 



       Camera.Parameters parameters = mCamera.getParameters(); 
       Camera.Size myBestSize = getBestPreviewSize(3, 4, parameters); 
       /* List<Size> sizes = parameters.getSupportedPreviewSizes(); 
       Size size = sizes.get(0);*/ 
       if(myBestSize != null){ 
       mCamera.setDisplayOrientation(90); 
        parameters.setPreviewSize(myBestSize.width, myBestSize.height); 
        mCamera.setParameters(parameters); 
        mCamera.startPreview(); 
       } 






       mCamera.startPreview(); 



     } 


    } 

} 
+0

이 당신의'myButton' 당신이 묻고있는 버튼? 그렇다면 오류를 표시하거나 표시하지 않습니까? – jnthnjns

+0

그것의 보이지 않는 ... –

+0

나는 당신의'setContentView()'와 관련이 있다고 상상한다. 버튼을 추가 한'RelativeLayout layout'이'activity_camera' 레이아웃에 있다고 가정하고 있지만' setContentView()'를'Preview'로 설정합니다. 해당 줄을 주석으로 처리하고 앱이 실행되는지 확인하십시오. 또한 단추가 상수이면 프로그래밍 방식으로 단추를 빌드 할 필요가 없습니다. – jnthnjns

답변

2

를 캡처 할 수 위의 내 코드 카메라를 완벽하게 보여주고 여기에

가 하나 개의 버튼을 추가 할 :

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_camera); 
    // Preview P = new Preview(this); 
    // setContentView(P); 

    Button myButton = new Button(this); 
    myButton.setText("Press Me"); 
    myButton.setOnClickListener(this); 

    RelativeLayout layout = (RelativeLayout) findViewById(R.id.cam_out); 
    layout.addView(myButton); 

} 

public void onClick(View v) { 
    Log.i("onClick", "myButton"); 
    // Process the Image, etc 
} 
관련 문제