Android 는 카메라 촬영 과 영상 기능 을 호출 합 니 다.

응용 필드:
안 드 로 이 드 개발 과정 에서 휴대 전화 자체 기기 의 기능 을 호출 해 야 할 때 가 있다.지난 글 은 주로 카메라 촬영 기능 의 호출 에 중심 을 두 었 다.이 글 은 사진 과 동 영상 조작 을 종합 적 으로 실현 할 것 이다.
지식 포인트 소개:
이 부분 은 읽 어 주세요[Android 카메라 기능 호출]
사용 방법:
첫 번 째 단계:
두 개의 Activity:MainActivity,CameraActivity 를 포함 하 는 Android 프로젝트 CameraPhotoVedio 를 새로 만 듭 니 다.
두 번 째 단계:
activity_main.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" 
 android:background="@drawable/shape_main" 
 tools:context=".MainActivity" > 
 
 <LinearLayout android:layout_height="wrap_content" 
  android:layout_marginTop="50dp" 
  android:layout_width="match_parent" 
  android:orientation="vertical"> 
  <ImageView android:layout_height="wrap_content" 
   android:layout_width="wrap_content" 
   android:layout_gravity="center" 
   android:src="@drawable/main"/> 
 </LinearLayout> 
 <LinearLayout android:layout_height="wrap_content" 
  android:layout_marginTop="100dp" 
  android:layout_width="match_parent" 
  android:layout_alignParentBottom="true" 
  android:orientation="vertical"> 
  <Button 
   android:id="@+id/main_button" 
   android:layout_height="50dp" 
   android:layout_marginBottom="50dp" 
   android:background="@drawable/shape_main" 
   android:layout_width="match_parent" 
   android:textColor="#FFFFFF" 
   android:text="     "/> 
 </LinearLayout> 
</RelativeLayout> 
MainActivity.java

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
 
public class MainActivity extends Activity { 
 
 private Button button; //        
  
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
  initViews(); 
 } 
 
 private void initViews() { 
  button = (Button) findViewById(R.id.main_button); 
  button.setOnClickListener(new OnClickListener() { 
    
   @Override 
   public void onClick(View v) { 
    startActivity(new Intent(getApplicationContext(), CameraActivity.class)); 
   } 
  }); 
 } 
} 
activity_camera.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 xmlns:tools="http://schemas.android.com/tools" 
 android:layout_width="match_parent" 
 android:background="#FFFFFF" 
 android:layout_height="match_parent" 
 tools:context=".CameraActivity" > 
 <SurfaceView 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:id="@+id/camera_surfaceview"/> 
 <TextView android:layout_height="wrap_content" 
  android:layout_width="wrap_content" 
  android:text="    " 
  android:id="@+id/camera_time"/> 
 <LinearLayout android:layout_height="wrap_content" 
  android:layout_width="match_parent" 
  android:layout_alignParentBottom="true" 
  android:orientation="horizontal"> 
  <Button android:layout_height="30dp" 
   android:layout_width="match_parent" 
   android:layout_marginBottom="20dp" 
   android:layout_weight="1" 
   android:background="@drawable/shape_main" 
   android:id="@+id/camera_photo" 
   android:layout_marginLeft="5dp" 
   android:textColor="#FFFFFF" 
   android:layout_marginRight="5dp" 
   android:text="    "/> 
  <Button android:layout_height="30dp" 
   android:layout_marginBottom="20dp" 
   android:layout_width="match_parent" 
   android:layout_weight="1" 
   android:background="@drawable/shape_main" 
   android:id="@+id/camera_vedio" 
   android:layout_marginLeft="5dp" 
   android:textColor="#FFFFFF" 
   android:layout_marginRight="5dp" 
   android:text="    "/> 
 </LinearLayout> 
</RelativeLayout> 
CameraActivity.java

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Date; 
 
import com.example.cameraphotovideo.utils.FormatUtil; 
 
import android.graphics.ImageFormat; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.media.MediaRecorder; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.app.Activity; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class CameraActivity extends Activity { 
 
 private String tag ="MaHaochen_______CameraActivity"; 
 private SurfaceView surfaceView; 
 private SurfaceHolder surfaceHolder; 
 private Camera camera; 
 private MediaRecorder mediaRecorder; 
 private Button photoButton; //     
 private Button vedioButton; //     
 private TextView timeTextView; 
  
 protected boolean isPreview = false; //           
 private boolean isRecording = true; // true      ,    ;false      ,     
 private boolean bool; 
  
 private int hour = 0; 
 private int minute = 0;  //     
 private int second = 0; 
  
 private File mRecVedioPath; 
 private File mRecAudioFile; 
  
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_camera); 
  initCamera(); 
  initViews(); 
 } 
 //       
 private void initCamera() { 
  mRecVedioPath = new File(Environment.getExternalStorageDirectory() 
    .getAbsolutePath() + "/mahc/video/temp/"); 
  if (!mRecVedioPath.exists()) { 
   mRecVedioPath.mkdirs(); 
  } 
  surfaceView = (SurfaceView) findViewById(R.id.camera_surfaceview); 
  SurfaceHolder cameraSurfaceHolder = surfaceView.getHolder(); 
  cameraSurfaceHolder.addCallback(new Callback() { 
    
   @Override 
   public void surfaceCreated(SurfaceHolder holder) { 
    try { 
    camera = Camera.open(); 
    //  Camera   /   
    camera.setDisplayOrientation(90); 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewFrameRate(5); //   5  
    parameters.setPictureFormat(ImageFormat.JPEG);//           
    parameters.set("jpeg-quality", 85);//      
    camera.setParameters(parameters); 
    camera.setPreviewDisplay(holder); 
    isPreview = true; 
    camera.startPreview(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    surfaceHolder = holder; 
   } 
    
   @Override 
   public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    surfaceHolder = holder; 
   } 
    
   @Override 
   public void surfaceDestroyed(SurfaceHolder holder) { 
    if (camera != null) { 
     if (isPreview) { 
      camera.stopPreview(); 
      isPreview = false; 
     } 
     camera.release(); 
     camera = null; //     Camera 
    } 
    surfaceView = null; 
    surfaceHolder = null; 
    mediaRecorder = null; 
   } 
  }); 
  //        
  //This method was deprecated in API level 11. this is ignored, this value is set automatically when needed. 
  cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
 } 
  
 //        
 private void initViews() { 
  timeTextView = (TextView) findViewById(R.id.camera_time); 
  timeTextView.setVisibility(View.GONE); 
  photoButton = (Button) findViewById(R.id.camera_photo); 
  vedioButton = (Button) findViewById(R.id.camera_vedio); 
  ButtonOnClickListener onClickListener = new ButtonOnClickListener(); 
  photoButton.setOnClickListener(onClickListener); 
  vedioButton.setOnClickListener(onClickListener); 
 } 
  
 class ButtonOnClickListener implements OnClickListener{ 
 
  @Override 
  public void onClick(View v) { 
   switch (v.getId()) { 
   case R.id.camera_vedio: 
    //       
    if(isRecording){ 
     if (isPreview) { 
      camera.stopPreview(); 
      camera.release(); 
      camera = null; 
     } 
     second = 0; 
     minute = 0; 
     hour = 0; 
     bool = true; 
     if(null==mediaRecorder){ 
      mediaRecorder = new MediaRecorder(); 
     }else { 
      mediaRecorder.reset(); 
     } 
     //          (  )    
     mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 
     //          setOutputFile(     ) 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     //          
     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     //                   
     mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     //       ,     
     mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
     //  audio      
     mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     //               
     mediaRecorder.setVideoSize(320, 240); 
     //             
     mediaRecorder.setVideoFrameRate(15); 
     try { 
      mRecAudioFile = File.createTempFile("Vedio", ".3gp", 
        mRecVedioPath); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mediaRecorder.setOutputFile(mRecAudioFile.getAbsolutePath()); 
     try { 
      mediaRecorder.prepare(); 
      timeTextView.setVisibility(View.VISIBLE); 
      handler.postDelayed(task, 1000); 
      mediaRecorder.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     isRecording = !isRecording; 
     Log.e(tag, "=====      ====="); 
    }else { 
     //       
     bool = false; 
     mediaRecorder.stop(); 
     timeTextView.setText(FormatUtil.format(hour)+":"+FormatUtil.format(minute)+":"+ FormatUtil.format(second)); 
     mediaRecorder.release(); 
     mediaRecorder = null; 
     FormatUtil.videoRename(mRecAudioFile); 
     Log.e(tag, "=====    ,   ====="); 
     isRecording = !isRecording; 
     try { 
      camera = Camera.open(); 
      Camera.Parameters parameters = camera.getParameters(); 
//      parameters.setPreviewFrameRate(5); //   5  
      parameters.setPictureFormat(ImageFormat.JPEG);//           
      parameters.set("jpeg-quality", 85);//      
      camera.setParameters(parameters); 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
      isPreview = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    break; 
 
   case R.id.camera_photo: 
    if (mediaRecorder != null) { 
     try { 
      bool = false; 
      mediaRecorder.stop(); 
      timeTextView.setText(FormatUtil.format(hour) + ":" + FormatUtil.format(minute) + ":" 
        + FormatUtil.format(second)); 
      mediaRecorder.release(); 
      mediaRecorder = null; 
      FormatUtil.videoRename(mRecAudioFile); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     isRecording = !isRecording; 
     Log.e(tag, "=====    ,   ====="); 
     try { 
      camera = Camera.open(); 
      Camera.Parameters parameters = camera.getParameters(); 
//      parameters.setPreviewFrameRate(5); //   5  
      parameters.setPictureFormat(ImageFormat.JPEG);//           
      parameters.set("jpeg-quality", 85);//      
      camera.setParameters(parameters); 
      camera.setPreviewDisplay(surfaceHolder); 
      camera.startPreview(); 
      isPreview = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    if (camera != null) { 
     camera.autoFocus(null); 
     camera.takePicture(null, null, new PictureCallback() { 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 
       new SavePictureTask().execute(data); 
       camera.startPreview(); 
       Log.e(tag,"=====    ====="); 
      } 
     }); //    
    } 
    break; 
   default: 
    break; 
   } 
  } 
 } 
 /* 
  *      ,     
  */ 
 private Handler handler = new Handler(); 
 private Runnable task = new Runnable() { 
  public void run() { 
   if (bool) { 
    handler.postDelayed(this, 1000); 
    second++; 
    if (second >= 60) { 
     minute++; 
     second = second % 60; 
    } 
    if (minute >= 60) { 
     hour++; 
     minute = minute % 60; 
    } 
    timeTextView.setText(FormatUtil.format(hour) + ":" + FormatUtil.format(minute) + ":" 
      + FormatUtil.format(second)); 
   } 
  } 
 }; 
  
  
  
 class SavePictureTask extends AsyncTask<byte[], String, String> { 
  @Override 
  protected String doInBackground(byte[]... params) { 
   String path = Environment.getExternalStorageDirectory() 
     .getAbsolutePath() + "/mahc/image"; 
   File out = new File(path); 
   if (!out.exists()) { 
    out.mkdirs(); 
   } 
   File picture = new File(path+"/"+new Date().getTime()+".jpg"); 
   try { 
    FileOutputStream fos = new FileOutputStream(picture.getPath()); 
    fos.write(params[0]); 
    fos.close(); 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
   Log.e(tag, "=====      ====="); 
   CameraActivity.this.finish(); 
   return null; 
  } 
 } 
} 
세 번 째 단계:이 항목 은 도구 류 FormatUtil.자바 가 필요 합 니 다.

import java.io.File; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
 
import android.os.Environment; 
 
public class FormatUtil { 
 
 /** 
  *             vedio    
  * @param recAudioFile 
  */ 
 public static void videoRename(File recAudioFile) { 
  String path = Environment.getExternalStorageDirectory() 
    .getAbsolutePath()+ "/mahc/video/"+ "0" + "/"; 
  String fileName = new SimpleDateFormat("yyyyMMddHHmmss") 
    .format(new Date()) + ".3gp"; 
  File out = new File(path); 
  if (!out.exists()) { 
   out.mkdirs(); 
  } 
  out = new File(path, fileName); 
  if (recAudioFile.exists()) 
   recAudioFile.renameTo(out); 
 } 
  
 /** 
  *             
  * @param num 
  * @return 
  */ 
 public static String format(int num){ 
  String s = num + ""; 
  if (s.length() == 1) { 
   s = "0" + s; 
  } 
  return s; 
 } 
} 
네 번 째 단계:이 항목 은 인터페이스의 배경 스타일 과 단추 의 배경 을 처리 해 야 하기 때문에 res/drawable 파일 에 새 shape 를 만들어 야 합 니 다.main.xml。

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
 <gradient 
  android:startColor="#FFCC99" 
  android:endColor="#99CC66" 
  android:centerColor="#0066CC" 
  android:angle="45" /> 
</shape> 
페이지 효과:
효과 캡 처

다운로드 주소:Android 는 카메라 촬영 과 영상 기능 을 호출 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기