在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android拍照、录制视频并上传至服务器 实例下载(有图有源码)

android拍照、录制视频并上传至服务器 实例下载(有图有源码)

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:1.83M
  • 下载次数:598
  • 浏览次数:21927
  • 发布时间:2013-02-07
  • 实例类别:Android平台开发
  • 发 布 人:星火燎原
  • 所需积分:2
 相关标签: 拍照 上传 视频 Android

实例介绍

【实例简介】拍照、录制视频、上传、服务器配置、预览视频等功能都实现了
【实例截图】


【核心代码】

package cn.itcast.videorecord;

import java.io.File;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.io.RandomAccessFile;
import java.net.Socket;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements
		DialogInterface.OnClickListener
{
	private static final String TAG = "MainActivity";
	private SurfaceView surfaceView;
	private MediaRecorder mediaRecorder;
	private boolean record;
	private File videoFile;
	private ProgressDialog progressDialog = null;// 上传进度条
	private long videoLenth = 0;
	Thread thread;
	private Camera camera = null;
	private Socket receiver;

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

		Window window = getWindow();// 得到窗口
		requestWindowFeature(Window.FEATURE_NO_TITLE);// 没有标题
		window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
		window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 屏幕高亮

		setContentView(R.layout.main);

		mediaRecorder = new MediaRecorder();

		surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
		/* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */
		this.surfaceView.getHolder().setType(
				SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		this.surfaceView.getHolder().setFixedSize(800, 600);// 设置分辨率

		ButtonClickListener listener = new ButtonClickListener();//修改这里切换传输
		Button stopButton = (Button) this.findViewById(R.id.stop);
		Button recordButton = (Button) this.findViewById(R.id.record);
		stopButton.setOnClickListener(listener);
		recordButton.setOnClickListener(listener);

		/*
		 * // IP按钮 Button IPButton = (Button) findViewById(R.id.IPbutton);
		 * IPButton.setOnClickListener(new Button.OnClickListener() {
		 * 
		 * @Override public void onClick(View v) { // TODO Auto-generated method
		 * stub onShowPromptDialog(v); } });
		 */

	}

	/**
	 * 显示对话框的IP
	 */
	public void onShowPromptDialog(View v)
	{
		// inflate需要显示到Dialog里的View对象
		LayoutInflater li = LayoutInflater.from(this);
		View view = li.inflate(R.layout.log, null);
		EditText td = (EditText) view.findViewById(R.id.editText_prompt);
		td.setText("lvjun5555555555");
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("请输入上传主机的IP地址");
		builder.setIcon(R.drawable.ic_launcher);
		// 之前inflate的View 放到dialog中
		
		builder.setView(view);
		
		builder.setPositiveButton("确定", this);
		builder.setNegativeButton("取消", this);
		builder.create().show();

	}

	/**
	 * 实现Dialog的回调方法
	 */
	@Override
	public void onClick(DialogInterface dialog, int which)
	{
		// TODO Auto-generated method stub
		if (which == Dialog.BUTTON_POSITIVE)
		{

			AlertDialog ad = (AlertDialog) dialog;
			EditText t = (EditText) ad.findViewById(R.id.editText_prompt);

			String ip = t.getText().toString();
			StreamTool.createFile(ip);
			System.out.println("修改成功");
			Toast.makeText(this, t.getText().toString(), Toast.LENGTH_LONG)
					.show();
		}
	}

	/**
	 * 当activity摧毁时调用
	 */
	@Override
	protected void onDestroy()
	{
		mediaRecorder.release();
		super.onDestroy();
	}

	/**
	 * 保存到本地在上传
	 * 
	 * @author Administrator 吕俊
	 */
	private final class ButtonClickListener implements View.OnClickListener
	{
		@Override
		public void onClick(View v)
		{
			if (!Environment.getExternalStorageState().equals(
					Environment.MEDIA_MOUNTED))
			{
				Toast.makeText(MainActivity.this, R.string.sdcarderror, 1)
						.show();
				return;
			}
			try
			{
				switch (v.getId())
				{
					case R.id.record:
						mediaRecorder.reset();

						mediaRecorder
								.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 从照相机采集视频
						mediaRecorder
								.setAudioSource(MediaRecorder.AudioSource.MIC);
						mediaRecorder
								.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
						mediaRecorder.setVideoSize(480, 320);
						mediaRecorder.setVideoFrameRate(3); // 每秒3帧
						mediaRecorder
								.setVideoEncoder(MediaRecorder.VideoEncoder.H263); // 设置视频编码方式
						mediaRecorder
								.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
						videoFile = new File(
								Environment.getExternalStorageDirectory(),
								System.currentTimeMillis()   ".MP4");

						mediaRecorder.setPreviewDisplay(surfaceView.getHolder()
								.getSurface());

						mediaRecorder
								.setOutputFile(videoFile.getAbsolutePath());
						mediaRecorder.prepare();// 预期准备
						mediaRecorder.start();// 开始刻录

						record = true;
						break;

					case R.id.stop:
						if (record)
						{
							System.out.println(videoFile);
							mediaRecorder.stop();
							record = false;
							progressDialog = new ProgressDialog(
									MainActivity.this);
							progressDialog
									.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
							progressDialog.setIcon(R.drawable.camera);
							progressDialog.setTitle(R.string.upload);
							progressDialog.setButton("取消上传",
									new DialogInterface.OnClickListener()
									{

										@Override
										public void onClick(
												DialogInterface dialog,
												int which)
										{
											// TODO Auto-generated method stub
											thread.interrupt();
										}
									});
							progressDialog.show();
							thread = new Thread(new UploadTask());
							thread.start();

						}
						break;
				}
			} catch (Exception e)
			{
				Toast.makeText(MainActivity.this, R.string.error, 1).show();
				Log.e(TAG, e.toString());
			}
		}

	}

	/**
	 * 实时上传到PC端(边录边传)
	 * 
	 * @author Administrator 吕俊
	 */
	private final class ButtonClickListener1 implements View.OnClickListener
	{
		@Override
		public void onClick(View v)
		{
			if (!Environment.getExternalStorageState().equals(
					Environment.MEDIA_MOUNTED))
			{
				Toast.makeText(MainActivity.this, R.string.sdcarderror, 1)
						.show();
				return;
			}
			try
			{
				switch (v.getId())
				{
					case R.id.record:
						mediaRecorder.reset();

						mediaRecorder
								.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 从照相机采集视频
						//mediaRecorder
								//.setAudioSource(MediaRecorder.AudioSource.MIC);
						mediaRecorder
								.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
						mediaRecorder.setVideoSize(480, 320);
						mediaRecorder.setVideoFrameRate(3); // 每秒3帧
						mediaRecorder
								.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); // 设置视频编码方式
						//mediaRecorder
						//		.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

						mediaRecorder.setPreviewDisplay(surfaceView.getHolder()
								.getSurface());

						// 实时上传的代码

						 receiver = new Socket("192.168.1.149", 9999);
						ParcelFileDescriptor pfd = ParcelFileDescriptor
								.fromSocket(receiver);
						mediaRecorder.setOutputFile(pfd.getFileDescriptor());

						mediaRecorder.prepare();// 预期准备
						mediaRecorder.start();// 开始刻录

						record = true;
						break;

					case R.id.stop:
						if (record)
						{
							System.out.println(videoFile);
							mediaRecorder.stop();
							mediaRecorder.release();
							receiver.close();
							record = false;

						}
						break;
				}
			} catch (Exception e)
			{
				Toast.makeText(MainActivity.this, R.string.error, 1).show();
				Log.e(TAG, e.toString());
			}
		}

	}

	/**
	 * 文件上传连接服务器的
	 * 
	 * 
	 * **/
	class UploadTask implements Runnable
	{
		@Override
		public void run()
		{
			try
			{
				videoLenth = videoFile.length();// 得到文件的大小
				progressDialog.setMax((int) videoLenth);// 设置精度条的最大值

				System.out.println("连接之前");

				String ip = StreamTool.readIP();// 从配置文件里读取Ip

				Socket socket = new Socket(ip, 6789);

				OutputStream outStream = socket.getOutputStream();
				System.out.println("连接之后");

				System.out.println(videoFile);

				String head = "Content-Length="   videoFile.length()
						  ";filename="   videoFile.getName()   ";sourceid=\r\n";
				System.out.println(videoFile.getName());

				outStream.write(head.getBytes());

				PushbackInputStream inStream = new PushbackInputStream(
						socket.getInputStream());
				String response = StreamTool.readLine(inStream);
				System.out.println(response);
				String[] items = response.split(";");
				String position = items[1].substring(items[1].indexOf("=")   1);

				RandomAccessFile fileOutStream = new RandomAccessFile(
						videoFile, "r");
				fileOutStream.seek(Integer.valueOf(position));
				byte[] buffer = new byte[1024];
				int len = -1;
				int i = 1;
				while ((len = fileOutStream.read(buffer)) != -1)
				{
					outStream.write(buffer, 0, len);

					// if(i==10) break;
					Log.i("haha", len   "");
					i = i   len;
					progressDialog.setProgress(i);

				}

				fileOutStream.close();
				outStream.close();
				inStream.close();
				socket.close();
			} catch (Exception e)
			{

				System.out.println("报错"   e.getMessage());
				e.printStackTrace();
			} finally
			{
				progressDialog.dismiss();

			}
		}
	}

}

实例下载地址

android拍照、录制视频并上传至服务器 实例下载(有图有源码)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 f327888576 发表于: 2013-05-15 10:05 51
我来说两句...谢谢 支持

支持(0) 盖楼(回复)

第 2 楼 skyli 发表于: 2013-07-10 16:18 27
这玩意,还要积分,我哪有呢?

支持(0) 盖楼(回复)

第 3 楼 占亮 发表于: 2013-08-07 15:17 10
例子不错

支持(0) 盖楼(回复)

第 4 楼 流年 发表于: 2013-12-30 17:51 55
我来说两句...例子不错

支持(0) 盖楼(回复)

第 5 楼 qtqc 发表于: 2014-02-11 17:19 45
积分只能用RMB换啊

支持(0) 盖楼(回复)

第 6 楼 q316085319 发表于: 2014-03-06 10:20 32
我来说两句...不错

支持(0) 盖楼(回复)

第 7 楼 q316085319 发表于: 2014-03-06 10:20 37
我来说两句...不错

支持(0) 盖楼(回复)

第 8 楼 minghuahardwork 发表于: 2014-03-19 00:12 50
列子不错

支持(0) 盖楼(回复)

第 9 楼 minghuahardwork 发表于: 2014-03-19 00:12 59
列子不错

支持(0) 盖楼(回复)

第 10 楼 minghuahardwork 发表于: 2014-03-19 00:12 59
列子不错

支持(0) 盖楼(回复)

第 11 楼 859278907 发表于: 2014-05-05 19:59 55
我来说两句...不错,有参考价值

支持(0) 盖楼(回复)

第 12 楼 xiaolp 发表于: 2014-06-16 17:55 22
很好的一个实例。赞一个!

支持(0) 盖楼(回复)

第 13 楼 lhn200835 发表于: 2014-07-04 09:48 06
不错,学习学习

支持(0) 盖楼(回复)

第 14 楼 ngyagjw 发表于: 2014-09-29 14:33 24
看起来还不错,学习学习!!!!!!!!

支持(0) 盖楼(回复)

第 15 楼 xhrgbczc 发表于: 2014-11-27 15:34 45
我来看看,到底怎么样

支持(0) 盖楼(回复)

第 16 楼 david1980 发表于: 2015-01-30 10:52 52
很好的资源, 学习了

支持(0) 盖楼(回复)

第 17 楼 ddt2011 发表于: 2015-04-14 16:43 05
如何上传服务器?服务器端如何编码? 都没说啊,骗分

支持(0) 盖楼(回复)

第 18 楼 啊山东if活泼啊额h11111 发表于: 2015-10-10 07:42 21
我来说两句...hao

支持(0) 盖楼(回复)

第 19 楼 你的手黑 发表于: 2015-10-14 11:03 56
我来说两句...好东西

支持(0) 盖楼(回复)

第 20 楼 leiwei 发表于: 2015-11-09 10:09 16
有图,有源码,不错

支持(0) 盖楼(回复)

第 21 楼 164531553 发表于: 2016-01-06 15:36 41
我去...好东西

支持(0) 盖楼(回复)

第 22 楼 164531553 发表于: 2016-01-06 15:36 43
我去...好东西

支持(0) 盖楼(回复)

第 23 楼 倔强 发表于: 2016-02-25 11:12 48
实践一下

支持(0) 盖楼(回复)

第 24 楼 huanghuishun 发表于: 2016-03-14 09:59 39
indow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏 window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 屏幕高亮 setContentView(R.layout.main); mediaRecorder = new MediaRecorder();

支持(0) 盖楼(回复)

第 25 楼 mzg 发表于: 2016-05-24 17:10 53
录制失败 啥原因

支持(0) 盖楼(回复)

第 26 楼 fking 发表于: 2016-07-04 09:56 50
实践一下

支持(0) 盖楼(回复)

第 27 楼 lmm 发表于: 2016-07-19 17:31 58
录制失败

支持(0) 盖楼(回复)

第 28 楼 lmm 发表于: 2016-07-19 17:32 01
录制失败

支持(0) 盖楼(回复)

第 29 楼 lmm 发表于: 2016-07-19 17:32 03
录制失败

支持(0) 盖楼(回复)

第 30 楼 xu1234 发表于: 2016-07-20 11:37 43
好,点个赞

支持(0) 盖楼(回复)

第 31 楼 xu1234 发表于: 2016-07-20 11:37 56
好,点个赞OK

支持(0) 盖楼(回复)

第 32 楼 1159514535 发表于: 2016-07-23 08:31 13
谢谢支持

支持(0) 盖楼(回复)

第 33 楼 feng0413 发表于: 2016-08-11 19:54 34
顶一个吧先

支持(0) 盖楼(回复)

第 34 楼 feng0413 发表于: 2016-08-11 19:54 40
顶一个吧先

支持(0) 盖楼(回复)

第 35 楼 dzg709580412 发表于: 2016-08-30 10:57 49
顶一个吧先

支持(0) 盖楼(回复)

第 36 楼 TengFei 发表于: 2016-09-07 15:16 14
积分没有,能不能发我一份,学习一下,谢谢了!!

支持(0) 盖楼(回复)

第 37 楼 我问问你爸爸 发表于: 2016-09-21 15:51 57
我来说两句...

支持(0) 盖楼(回复)

第 38 楼 灰山羊 发表于: 2017-05-12 09:28 14
很好的一个实例。赞一个!

支持(0) 盖楼(回复)

第 39 楼 灰山羊 发表于: 2017-05-12 09:28 17
很好的一个实例。赞一个!

支持(0) 盖楼(回复)

第 40 楼 灰山羊 发表于: 2017-05-12 09:28 19
很好的一个实例。赞一个!

支持(0) 盖楼(回复)

第 41 楼 swordar 发表于: 2017-05-22 10:00 15
很好的一个实例。赞一个!

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有42条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
;
报警