2012-07-18 10 views

Antwort

56

Wenn Sie die Kamera mit TextureSurface verwenden möchten, können Sie SurfaceTextureListener-Schnittstelle implementieren. Sie werden vier Methoden implementieren:

1) onSurfaceTextureAvailable - Hier können Sie Setup-Kamera

2) onSurfaceTextureSizeChanged - In Ihrem Fall die Android Kamera

3) onSurfaceTextureDestroyed wird handhaben diese Methode - hier du zerstörst alle Kamera-Sachen.

4) onSurfaceTextureUpdated - Aktualisieren Sie Ihre Textur hier, wenn Sie etwas zu ändern haben!

Überprüfen Sie das folgende Beispiel:

public class MainActivity extends Activity implements SurfaceTextureListener{ 

    private Camera mCamera; 
    private TextureView mTextureView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mTextureView = new TextureView(this); 
     mTextureView.setSurfaceTextureListener(this); 

     setContentView(mTextureView); 
    } 

    @Override 
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
     mCamera = Camera.open(); 

     Camera.Size previewSize = mCamera.getParameters().getPreviewSize(); 
     mTextureView.setLayoutParams(new FrameLayout.LayoutParams(
       previewSize.width, previewSize.height, Gravity.CENTER)); 

     try { 
      mCamera.setPreviewTexture(surface); 
     } catch (IOException t) { 
     } 

     mCamera.startPreview(); 

    } 

    @Override 
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
     // Ignored, the Camera does all the work for us 
    } 

    @Override 
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
     return true; 
    } 

    @Override 
    public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
     // Update your view here! 
    } 
} 

Zwei weitere Dinge: Vergessen Sie nicht, die Kamera-Berechtigungen in Ihrem Projekt Manifest hinzuzufügen und die SurfaceTexture von API 11 verfügbar ist

+4

Vergessen Sie nicht, die Kamera-Berechtigung zum Manifest hinzuzufügen – Gerard

+0

Könnten Sie mir bitte bei der Verwendung dieses Dienstes helfen? – someone

+0

@Rhth, was meinst du mit diesem Service ist? –

-3
public class VideoCapture extends Activity implements OnClickListener, SurfaceHolder.Callback { 
MediaRecorder recorder; 
SurfaceHolder holder; 
boolean recording = false; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
requestWindowFeature(Window.FEATURE_NO_TITLE); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

recorder = new MediaRecorder(); 
initRecorder(); 

SurfaceView cameraView = new SurfaceView(this); 
holder = cameraView.getHolder(); 
holder.addCallback(this); 
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

cameraView.setClickable(true); 
cameraView.setOnClickListener(this); 
} 

private void initRecorder() { 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

CamcorderProfile cpHigh = CamcorderProfile 
     .get(CamcorderProfile.QUALITY_HIGH); 
recorder.setProfile(cpHigh); 
recorder.setOutputFile("/sdcard/videocapture_example.mp4"); 
recorder.setMaxDuration(50000); // 50 seconds 
recorder.setMaxFileSize(5000000); // Approximately 5 megabytes 
} 

private void prepareRecorder() { 
recorder.setPreviewDisplay(holder.getSurface()); 

try { 
    recorder.prepare(); 
} catch (IllegalStateException e) { 
    e.printStackTrace(); 
    finish(); 
} catch (IOException e) { 
    e.printStackTrace(); 
    finish(); 
} 
} 

public void onClick(View v) { 
if (recording) { 
    recorder.stop(); 
    recording = false; 

    // Let's initRecorder so we can record again 
    initRecorder(); 
    prepareRecorder(); 
} else { 
    recording = true; 
    recorder.start(); 
} 
} 

public void surfaceCreated(SurfaceHolder holder) { 
prepareRecorder(); 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
    int height) { 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
if (recording) { 
    recorder.stop(); 
    recording = false; 
} 
recorder.release(); 
finish(); 
} 
} 
+1

Ihnen für Ihre Antwort danken Aber das ist nicht das, wonach ich suche. Dieses Beispiel ist bereits in api demos verfügbar. Ich möchte dasselbe mit SurfaceTexture machen. – AndroDev

Verwandte Themen