android录像及播放

来源:互联网 发布:时代互联域名 编辑:程序博客网 时间:2024/04/30 04:50

一.调用系统录像及播放

1.java代码

package com.gst.user.application;import android.app.Activity;import android.app.AlarmManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.media.AudioRecord;import android.media.MediaPlayer;import android.media.MediaRecorder;import android.net.Uri;import android.os.AsyncTask;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.provider.MediaStore;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Chronometer;import android.widget.ImageView;import android.widget.MediaController;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;import android.widget.VideoView;import org.androidpn.client.ServiceManager;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class TempActivity extends AppCompatActivity implements View.OnClickListener{    private static final String TAG = "TempActivity";    Button button_play;    Button button_stop;    Button button_record;    VideoView videoView;    static final int RequestCode=1;    String videoPath;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_temp);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        videoView=(VideoView)findViewById(R.id.videoView);        button_play=(Button)findViewById(R.id.button3);        button_stop=(Button)findViewById(R.id.button4);        button_record=(Button)findViewById(R.id.button5);        button_stop.setOnClickListener(this);        button_play.setOnClickListener(this);        button_record.setOnClickListener(this);        videoPath="";     }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.button3:                if ("".equals(videoPath)){                    return;                }                videoView.setVideoURI(Uri.parse(videoPath));                videoView.setMediaController(new MediaController(this));                videoView.start();                break;            case R.id.button4:                videoView.stopPlayback();                break;            case R.id.button5:                Intent intent=new Intent(MediaStore.ACTION_VIDEO_CAPTURE);                //调用照相机//                Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                startActivityForResult(intent,RequestCode);                break;        }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if (requestCode==RequestCode){            if (resultCode== Activity.RESULT_OK){                //1.获取查询视频文件路径的Uri                Uri uri=data.getData();                //2.通过Content Provider查询包含视频文件路径的记录                Cursor cursor=getContentResolver().query(uri,null,null,null,null);                if (cursor.moveToFirst()){                    //获取视频文件路径                    videoPath=cursor.getString(cursor.getColumnIndex("_data"));                    Log.d(TAG,videoPath);                }            /*获取返回的Bitmap对象            Bitmap cameraBitmap = (Bitmap) data.getExtras().get("data");            imageView.setImageBitmap(cameraBitmap);   */  }        }        super.onActivityResult(requestCode,resultCode,data);    }}
2.布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:paddingBottom="@dimen/activity_vertical_margin"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:showIn="@layout/activity_temp" tools:context="com.gst.user.application.TempActivity">    <VideoView        android:layout_width="wrap_content"        android:layout_height="300dp"        android:id="@+id/videoView" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="播放"        android:id="@+id/button3"        android:layout_marginTop="80dp"        android:layout_below="@+id/videoView"        android:layout_centerHorizontal="true" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="停止"        android:id="@+id/button4"        android:layout_alignTop="@+id/button3"        android:layout_toRightOf="@+id/button3"        android:layout_toEndOf="@+id/button3"        android:layout_marginLeft="37dp"        android:layout_marginStart="37dp" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="录制"        android:id="@+id/button5"        android:layout_alignBottom="@+id/button3"        android:layout_toLeftOf="@+id/button3"        android:layout_toStartOf="@+id/button3"        android:layout_marginRight="32dp"        android:layout_marginEnd="32dp" /></RelativeLayout>

二. 自定义相机预览界面

1.布局

<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:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.test.MainActivity" >    <SurfaceView        android:id="@+id/dView"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"          android:orientation="horizontal" >        <Button            android:id="@+id/record"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="开始" />        <Button            android:id="@+id/stop"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="停止" />    </LinearLayout></RelativeLayout>
2.代码

package com.example.test;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import java.io.File;import android.app.Activity;import android.hardware.Camera;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.view.Menu;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends ActionBarActivity implements OnClickListener{ Button record, stop; // 系统视频文件 File viodFile; MediaRecorder mRecorder; // 显示视频的SurfaceView SurfaceView sView; // 记录是否正在进行录制 boolean isRecording = false; Camera camera;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        record = (Button) findViewById(R.id.record);        stop = (Button) findViewById(R.id.stop);        sView = (SurfaceView) findViewById(R.id.dView);        // stop按钮不可用        stop.setEnabled(false);        // 设置Surface不需要维护自己的缓冲区        sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        // 设置分辨率        sView.getHolder().setFixedSize(320, 280);        // 设置该组件不会让屏幕自动关闭        sView.getHolder().setKeepScreenOn(true);        record.setOnClickListener(this);        stop.setOnClickListener(this);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }        @Override    public void onClick(View v) {     switch (v.getId()) {     case R.id.record:      if (!Environment.getExternalStorageState().equals(        Environment.MEDIA_MOUNTED)) {       Toast.makeText(this, "SD卡不存在,请插卡!", Toast.LENGTH_SHORT).show();       return;      }      try {       // 创建MediaPlayer对象       mRecorder = new MediaRecorder();       mRecorder.reset();      /* camera = Camera.open();       camera.unlock();       camera.setDisplayOrientation(0);       mRecorder.setCamera(camera);*/       // 创建保存录制视频的视频文件       viodFile = new File(Environment.getExternalStorageDirectory()         .getCanonicalFile() + "/myvideo.mp4");       if (!viodFile.exists())        viodFile.createNewFile();       // 设置从麦克风采集声音       mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);       // 设置从摄像头采集图像       mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);       // 设置视频、音频的输出格式       mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);       // 设置音频的编码格式、       mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);       // 设置图像编码格式       mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);       mRecorder.setOrientationHint(90);       //mRecorder.setVideoSize(320, 280);       // mRecorder.setVideoFrameRate(5);       mRecorder.setOutputFile(viodFile.getAbsolutePath());       // 指定SurfaceView来预览视频       mRecorder.setPreviewDisplay(sView.getHolder().getSurface());       mRecorder.prepare();       // 开始录制       mRecorder.start();       // 让record按钮不可用       record.setEnabled(false);       // 让stop按钮可用       stop.setEnabled(true);       isRecording = true;      } catch (Exception e) {       e.printStackTrace();      }      break;     case R.id.stop:      // 如果正在录制      if (isRecording) {       // 停止录制       mRecorder.stop();       // 释放资源       mRecorder.release();       mRecorder = null;       // 让record按钮可用       record.setEnabled(true);       // 让stop按钮不可用       stop.setEnabled(false);      }      break;     default:      break;     }    }}

3.权限申请

 <!-- 授予该程序录制声音的权限 -->    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <!-- 授予该程序使用摄像头的权限 -->    <uses-permission android:name="android.permission.CAMERA" />    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    <!-- 授予使用外部存储的权限 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />





0 0
原创粉丝点击