相机概述

相机概述:

  • Android框架支持通过Camera API 或者Camera intent来抓取图像和视频

  • Camera 此类是控制设备相机的主要API,此类用于创建相机应用时获取图片和视频

  • SurfaceView 此类为用户提供camera的实时图像预览

  • MediaRecorder 此类用于从camera录制视频

  • Intent 一个MediaStore.ACTION_IMAGE_CAPTUREMediaStore.ACTION_VIDEO_CAPTURE的intent,可以使用它来抓取图像或者视频,而不能操作Camera对象

  • CameraPermission 你的应用必须请求使用设备相机的权限


            
  • CameraFeatures 你的应用必须也要声明要使用的相机特性


    
    
    
  • 使用现有的相机应用
    一个不用写代码来获取图片和视频的快速方法是使用intent来调用现有的android camera应用,一个camera intent调用现存的相机应用抓取图片
    或者视频剪辑然后返回你的应用

  • 调用一个相机的intent 主要有一下的步奏

  • (1)组件一个相机intent 创建一个请求图片或者视频的intent 使用以下intent类型中的一个

MediaStore.ACTION_IMAGE_CAPTURE从已存在的相机应用中请求一个图片
MediaStore.ACTION_VIDEO_CAPTURE,从已存在的相机应用中请求一个视频

  • (2)启动这个相机的intent,使用startActivityForResult()方法来执行相机intent,在你启动intent后,相机应用的界面会出现在设备屏幕上,然后用户就可以yoga他来获取图片和视频

  • (3)接收intent结果,在你的应用中设置一个onActivityResult()方法来接收从相机intent来的回调和数据,当用户获取了一个图片或者视频之后(或者取消了操作)系统就会调用此方法。

  • 图像或者intent

private static final int MEDIA_TYPE_IMAGE = 1;
private static final int MEDIA_TYPE_VIDEO = 2;

             public static Uri getOutputMediaFileUri(int type) {
        return Uri.fromFile(getOutputMediaFile(type));
    }


    private static File getOutputMediaFile(int type) {
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyCameraApp");
        if (!mediaStorageDir.exists()) {
            if (!mediaStorageDir.mkdirs()) {
                return null;
            }
        }
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File medifFile = null;
        if (type == MEDIA_TYPE_IMAGE) {
            medifFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
        } else if (type == MEDIA_TYPE_VIDEO) {
            medifFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".avi");
        } else {
            return null;
        }

        return medifFile;
    }
  • 当startActivityForResult()方法被执行,看到一个相机应用的界面
    当用户获取了一个图像(或者取消了操作)用户界面返回到你的应用
    你必须拦截onActivityResult()方法来接收intent的结果然后在继续执行你的应用

/**
* 拍照的方法
*/
private void imageCamera() {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getOutputMediaFileUri(MEDIA_TYPE_IMAGE));
startActivityForResult(intent, MEDIA_TYPE_IMAGE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (resultCode) {
        case RESULT_OK:
            //图片
            if (MEDIA_TYPE_IMAGE == requestCode) {
                Log.d("CameryActivity", "mFile:" + mFile);
            } else if (MEDIA_TYPE_VIDEO == requestCode) {
                //视频
            }

            break;
    }
}
  • 视频获取inten
    使用相机intent获取视频是使用最少代码使得你的应用获取视屏的捷径
    一个视频获取intent可以包含以下额外的信息
  • (1)MediaStore.EXTRA_OUTPUT此设置需要一个保存视频的路径和文件名的Uri,此设置是可选的但强烈推荐,如果你不指定此值,相机应用就把请求到的图像以默认的文件名保存到默认的文件夹下,这些信息保存在返回的intent的Intent.getData()字段中
  • (2)MediaStore.EXTRA_VIDEO_QUALITY 此值在最低质量最小文件尺寸时是0,在最高质量最大文件尺寸时是1
  • (3)MediaStore.EXTRA_DURATION_LIMIT 此值设置获取视屏的长度,以秒为单位
  • (4)MediaStore.EXTRA_SIZE_LIMIT 此值设置获取视屏文件的大小,以字节为单位
 /**
         * 录视频
         */
        private void videoCamera() {
            Intent intent = new Intent();
            intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, getOutputMediaFileUri(MEDIA_TYPE_VIDEO));
            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);  //设置视频质量
            startActivityForResult(intent, MEDIA_TYPE_VIDEO);
        }
        
        
  • 音频录制步奏:

    android为我们提供了android.media.MediaRecorder类用于音频的录制。
    
  • 1、创建android.media.MediaRecorder实例

  • 2、设置音源MediaRecorder.setAudioSource(),通过可以是MediaRecorder.AudioSource.MIC

  • 3、设置输出文件的格式 MediaRecorder.setOutputFormat()\

  • 4、设置输出文件 MediaRecorder.setOutputFile()

  • 5、设置音频编码 MediaRecorder.setAudioEncoder()

  • 6、设置MediaRecorder.prepare()

  • 7、调用MediaRecorder.start()开始录制

  • 8、调用MediaRecorder.stop()停止录制

  • 9、完成或者结束录制调用MediaRecorder.release()来释放资源

  • 录音代码:

public class RecodeActivity extends AppCompatActivity implements View.OnClickListener, MediaRecorder.OnErrorListener {

private Button startRecord;
private Button stopRecord;
private MediaRecorder mRecorder;
private boolean prepared = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recode);
    mRecorder = new MediaRecorder();
    initialize();
}

private void initialize() {

    startRecord = (Button) findViewById(R.id.startRecord);
    startRecord.setOnClickListener(this);
    stopRecord = (Button) findViewById(R.id.stopRecord);
    stopRecord.setOnClickListener(this);
    initRecord();
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.startRecord:
            startRecord();
            break;
        case R.id.stopRecord:
            stopRecord();
            break;
    }
}

/**
 * 初始化录音的准备工作
 */
private void initRecord() {
    mRecorder.reset();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  //设置音源
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置输出格式
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置音频的编码格式
    String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator + System.currentTimeMillis() + ".mp3";
    mRecorder.setOutputFile(path);  //设置输出文件夹
    try {
        mRecorder.prepare();
        prepared = true;
    } catch (IOException e) {
        e.printStackTrace();
    }

    stopRecord.setEnabled(false);

}

/**
 * 停止录音
 */
private void stopRecord() {
    if (prepared) {
        mRecorder.start();
        stopRecord.setEnabled(true);
        startRecord.setEnabled(false);
        prepared = false;
    }
}

/**
 * 开始录音
 */
private void startRecord() {
    mRecorder.stop();
    stopRecord.setEnabled(false);
    startRecord.setEnabled(true);
}


@Override
public void onError(MediaRecorder mr, int what, int extra) {
    mRecorder.reset();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mRecorder != null) {
        mRecorder.release();
    }
}

}

WebView的参数设置:

  • 加载网页
  • 加载本地
  • post方式传递参数
String postData = "clientID = cid & usernaem = name";
webView.postUrl(String url,byte[]postData) //加载网页使用post方法,

//使用loadData()方法来加载html的数据
loadData()方法需要三个参数:HTML TAG,MIME类型(text/html,网页编码方式(utf-8)
wv.loadData(content,"text/html","utf-8");

你可能感兴趣的:(相机概述)