基本信息
源码名称:android拍照、录制视频并上传至服务器 实例下载(有图有源码)
源码大小:1.83M
文件格式:.zip
开发语言:Java
更新时间:2013-02-07
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

拍照、录制视频、上传、服务器配置、预览视频等功能都实现了


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();

			}
		}
	}

}