相机概述

相机概述:

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

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

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

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

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

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

<uses-permission android:name="android.permission.CAMERA"/>
            
  • CameraFeatures 你的应用必须也要声明要使用的相机特性

    <uses-feature android:name="android.hardware.camera" android:required="false"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!--在使用视频捕获设备来录制视频的时候,你的应用必须有一下的权限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    
  • 使用现有的相机应用
    一个不用写代码来获取图片和视频的快速方法是使用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");
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容