Android:录像

方法一:调用系统录像功能

系统录像

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.Toast;

import java.io.File;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 调用系统的录像功能
         */
        Intent intent = new Intent(
                MediaStore.ACTION_VIDEO_CAPTURE);// 录像不能传入路径,否则无法拍摄
        startActivityForResult(intent, 1);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (resultCode != Activity.RESULT_OK) {
            return;
        }
        switch (requestCode) {
            case 1:
                File fromFile = getMediaFile(intent.getData(), this);
                Toast.makeText(this, "录像保存在" + fromFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
                break;
            default:
                break;
        }
    }

    private static File getMediaFile(Uri data, Activity ctx) {
        if (data == null) {
            return null;
        }
        String[] proj = {"_data"};
        Cursor cursor = ctx.managedQuery(data, proj, null, null, null);
        if (cursor == null) {
            return null;
        }
        int index = cursor.getColumnIndex("_data");
        if (index == -1) {
            return null;
        }
        cursor.moveToFirst();
        String mediaFilePath = cursor.getString(index);
        File mediaFile = new File(mediaFilePath);
        return mediaFile;
    }
}

方法二:使用MediaRecorder录制视频

图1

图2

图3

activity_media_recorder.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:id="@+id/spinner_size"
        android:background="#1100FF00" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Start"
            android:id="@+id/button_start"
            android:layout_weight="1"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Stop"
            android:id="@+id/button_stop"
            android:layout_weight="1"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Back"
            android:id="@+id/button_back"
            android:layout_weight="1" />
    </LinearLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView_time"
        android:textSize="16sp"/>

    <SurfaceView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/surfaceView"
        android:layout_margin="5dp"/>

</LinearLayout>
MediaRecorderDemoActivity.java
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MediaRecorderDemoActivity extends Activity implements SurfaceHolder.Callback {

    private Button button_start;
    private Button button_stop;
    private Button button_back;
    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    private File storageDir;
    private File tempFile;
    private MediaRecorder mediaRecorder;
    private Camera camera;
    private Spinner spinner;
    private int width;
    private int height;
    private int hou;
    private int min;
    private int sec;
    private Handler handler;
    private TextView textView_time;

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

        this.requestWindowFeature(Window.FEATURE_NO_TITLE); // no title
        //screen orientation landscape
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        setContentView(R.layout.activity_media_recorder);

        button_start = (Button)this.findViewById(R.id.button_start);
        button_stop = (Button)this.findViewById(R.id.button_stop);
        button_back = (Button)this.findViewById(R.id.button_back);
        surfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(MediaRecorderDemoActivity.this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        spinner = (Spinner)this.findViewById(R.id.spinner_size);
        width = 480;
        height = 320;
        handler = new Handler();
        textView_time = (TextView)this.findViewById(R.id.textView_time);

        button_start.setOnClickListener(btnStartListener);
        button_stop.setOnClickListener(btnStopListener);
        button_back.setOnClickListener(btnBackListener);
        spinner.setOnItemSelectedListener(spinnerListener);

        /**
         * 存储路径
         */
        boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (sdCardExist) {
            storageDir = new File(Environment.getExternalStorageDirectory().toString() + File.separator + "Demo" + File.separator);
            if (!storageDir.exists()) {
                storageDir.mkdir();
            }
            button_stop.setVisibility(View.GONE);
        } else {
            button_start.setVisibility(View.GONE);
            Toast.makeText(MediaRecorderDemoActivity.this, "SDcard is not exist", Toast.LENGTH_LONG).show();
        }
    }

    private View.OnClickListener btnStartListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            button_start.setVisibility(View.GONE);
            button_stop.setVisibility(View.VISIBLE);
            spinner.setVisibility(View.GONE);

            /**
             * 刷新录像时长
             */
            hou = 0;
            min = 0;
            sec = 0;
            handler.postDelayed(refreshTime, 1000);

            try {
                tempFile = File.createTempFile("Demo", ".3gp", storageDir);
                mediaRecorder = new MediaRecorder();
                mediaRecorder.setCamera(camera);
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                mediaRecorder.setVideoSize(width, height);
                mediaRecorder.setVideoFrameRate(16);
                mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
                mediaRecorder.setOutputFile(tempFile.getAbsolutePath());
                mediaRecorder.prepare();
                mediaRecorder.start();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };

    private View.OnClickListener btnStopListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            button_start.setVisibility(View.VISIBLE);
            button_stop.setVisibility(View.GONE);
            spinner.setVisibility(View.VISIBLE);

            handler.removeCallbacks(refreshTime);

            if (mediaRecorder != null) {
                try {
                    mediaRecorder.stop();
                    mediaRecorder.release();
                    Log.e("Demo", tempFile.getAbsolutePath());
                } catch(RuntimeException e) {
                    Log.e("Demo", e.getMessage());
                }
            }
        }
    };

    private View.OnClickListener btnBackListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
        }
    };

    private OnItemSelectedListener spinnerListener = new Spinner.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                                   long arg3) {
            // TODO Auto-generated method stub
            Spinner spinner = (Spinner)arg0;
            String wh[] = spinner.getSelectedItem().toString().split("\\*");
            width = Integer.parseInt(wh[0]);
            height = Integer.parseInt(wh[1]);
            try {
                camera.lock();
                camera.stopPreview();
                Camera.Parameters para = camera.getParameters();
                para.setPreviewSize(width, height);
                camera.setParameters(para);
//                surfaceHolder.setFixedSize(width, height);
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();

                Log.d("Demo", camera.getParameters().getPreviewSize().width + "*"
                        + camera.getParameters().getPreviewSize().height);

                camera.unlock();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.e("Demo", e.getMessage());
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }

    };

    private Runnable refreshTime = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            sec++;
            handler.postDelayed(refreshTime, 1000);
            if (sec >= 60) {
                sec = sec % 60;
                min++;
            }
            if (min >= 60) {
                min = min % 60;
                hou++;
            }
            textView_time.setText(timeFormat(hou) + ":" + timeFormat(min) + ":" + timeFormat(sec));
        }
    };

    private String timeFormat(int t) {
        if (t / 10 == 0) {
            return "0" + t;
        } else {
            return t + "";
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                               int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera = Camera.open();
        List<Size> supportedSize = camera.getParameters().getSupportedPreviewSizes();
        if (supportedSize != null) {
            List<String> list = new ArrayList<String>();
            for (Size s: supportedSize) {
                list.add(s.width + "*" + s.height);
            }
//            list.add(0, "1000*800");//不允许自定义分辨率
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MediaRecorderDemoActivity.this,
                    android.R.layout.simple_spinner_dropdown_item, list);
            spinner.setAdapter(adapter);
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera.release();
    }
}
AndroidManifest.xml
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

参考:http://blog.youkuaiyun.com/wyzxk888/article/details/7171310

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值