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
- android录像及播放
- Android多媒体(视频播放器-拍照-录像)
- Android------多媒体(视频播放器-拍照-录像)
- android开发(19) 调用手机的摄像头录像,并播放。
- android开发(19) 调用手机的摄像头录像,并播放。
- android开发(19) 调用手机的摄像头录像,并播放。
- Android开发笔记(五十七)录像录音与播放
- 28.Android-多媒体(视频播放器-拍照-录像)
- android 录像
- Android:录像
- android-录像
- Android-录像
- EasyPlayer Android安卓流媒体播放器实现播放同步录像功能实现(附源码)
- MediaCodec 从Surface编码及android锁屏录像和后台录像实现
- 多媒体(视频播放,拍照,录像)
- android开发之调用手机的摄像头使用MediaRecorder录像并播放
- EasyPlayer Android基于ffmpeg实现播放(RTSP/RTMP/HTTP/HLS)同步录像功能
- FreeSwitch中的录像功能和播放录像功能
- Kafka生产者消费者java示例(包含Avro序列化)
- Cookie深度解析
- 从大数据菜鸟走上大师的历程
- 跨进程启动activity
- 银行卡号与开户行对照文档
- android录像及播放
- debug current instruction pointer
- 时差,不同国家之间的大概时差
- 学习过程中的快思考与慢思考
- Scalaz(21)-类型例证:Liskov and Leibniz - type evidence
- 一些移动开发的前端框架分享
- HDOJ 1302-The Snail
- Fld selectn for mvmt type 551 / acct 400001 differs for Customer goods movement (015) Message no. M7
- java类加载的先后顺序