下面简单讲几种Android的多媒体技术,音频,视频,摄像头,录音。介绍的内容很简单,因为暂时没有用到,这是简单的学习一下。
首先讲下多媒体资源的位置:
1:源文件(即res/raw下或assets下)
2:文件系统(即sdcard)
3:流媒体(即网络)
声音:声音又游戏声音和歌曲等,游戏声音一般比较小,适合用SoundPool,歌曲比较大,适合用MediaPlayer。
SoundPool:
MediaPlayer:
视频:视频文件如果在raw下面的话,只能用MediaPlayer,如果是SD卡或者网络资源的话,可以用VideoView
MediaPlayer:
VideoView:
摄像头:摄像头的使用分为两种,一种是使用摄像头,另外一种是直接调用系统的摄像头,
使用摄像头:
直接调用系统的摄像头:
录音:一个简单的录音例子,基本不怎么使用的
录音:
首先讲下多媒体资源的位置:
1:源文件(即res/raw下或assets下)
2:文件系统(即sdcard)
3:流媒体(即网络)
声音:声音又游戏声音和歌曲等,游戏声音一般比较小,适合用SoundPool,歌曲比较大,适合用MediaPlayer。
SoundPool:
private SoundPool sp; private int soundId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); soundId = sp.load(this, R.raw.note1, 1); findViewById(R.id.btnPlaySound).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 声音ID,左声道(0-1.0),右声道,优先级,循环(0不循环,-1一直循环,rate声道频率0.5最慢,1正常,2最快) // sp.play(soundID, leftVolume, rightVolume, priority, loop, rate) sp.play(soundId, 1, 1, 0, 0, 2.0f); } }); }
MediaPlayer:
import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { private MediaPlayer mp=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btnPlaySong).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mp!=null) { mp.start(); } } }); } @Override protected void onResume() { mp= MediaPlayer.create(this, R.raw.song); try { mp.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } super.onResume(); } @Override protected void onPause() { if (mp!=null) { mp.release(); } super.onPause(); } }
视频:视频文件如果在raw下面的话,只能用MediaPlayer,如果是SD卡或者网络资源的话,可以用VideoView
MediaPlayer:
import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; public class SurfaceViewPlayerActivity extends Activity { private SurfaceView sv; private SurfaceHolder holder; private Callback surfaceHolderCallback=new Callback() { private MediaPlayer mp; @Override public void surfaceDestroyed(SurfaceHolder holder) { mp.release(); } @Override public void surfaceCreated(SurfaceHolder holder) { mp = MediaPlayer.create(SurfaceViewPlayerActivity.this, R.raw.movie); try { mp.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mp.setDisplay(holder); mp.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sv = new SurfaceView(this); holder = sv.getHolder(); holder.addCallback(surfaceHolderCallback); setContentView(sv); } }
VideoView:
import android.app.Activity; import android.os.Bundle; import android.widget.MediaController; import android.widget.VideoView; public class VideoViewPlayerAvtivity extends Activity { private VideoView vv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); vv =new VideoView(this); setContentView(vv); vv.setVideoPath("/mnt/sdcard/movie.mp4"); vv.setMediaController(new MediaController(this)); } }
摄像头:摄像头的使用分为两种,一种是使用摄像头,另外一种是直接调用系统的摄像头,
使用摄像头:
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.hardware.Camera; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { private SurfaceView cameraPreview; private Camera camera=null; private Callback cameraPreviewHolderCallback=new Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { stopPreview(); } @Override public void surfaceCreated(SurfaceHolder holder) { startPreview(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cameraPreview = (SurfaceView) findViewById(R.id.cameraPreview); cameraPreview.getHolder().addCallback(cameraPreviewHolderCallback); findViewById(R.id.btnTakePic).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { String path=null; if ((path =saveTempFile(data))!=null) { Intent i = new Intent(MainActivity.this, ImagePreviewAty.class); i.putExtra("path", path); startActivity(i); }else{ Toast.makeText(MainActivity.this, "保存照片失败", Toast.LENGTH_SHORT).show(); } } }); } }); } private String saveTempFile(byte[] bytes){ try { File f = File.createTempFile("img", ""); FileOutputStream fos = new FileOutputStream(f); fos.write(bytes); fos.flush(); fos.close(); return f.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } return null; } private void startPreview(){ camera = Camera.open(); try { camera.setPreviewDisplay(cameraPreview.getHolder()); camera.setDisplayOrientation(90); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } private void stopPreview(){ camera.stopPreview(); camera.release(); } }
import java.io.File; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.widget.ImageView; public class ImagePreviewAty extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); iv = new ImageView(this); setContentView(iv); String path = getIntent().getStringExtra("path"); if (path!=null) { iv.setImageURI(Uri.fromFile(new File(path))); } } }
直接调用系统的摄像头:
import java.io.File; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { private static final int REQUEST_CODE_TAKE_PICTURE = 1; private ImageView iv; private File currentImageFile = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); findViewById(R.id.btnStartSystemCamera).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Environment.getExternalStorageDirectory() SD卡的根目录 File dir = new File(Environment.getExternalStorageDirectory(), "pictures"); if (!dir.exists()) { dir.mkdirs(); } currentImageFile = new File(dir, System.currentTimeMillis()+".jpg"); if (!currentImageFile.exists()) { try { currentImageFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(currentImageFile)); startActivityForResult(i, REQUEST_CODE_TAKE_PICTURE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_CODE_TAKE_PICTURE: iv.setImageURI(Uri.fromFile(currentImageFile)); break; default: break; } super.onActivityResult(requestCode, resultCode, data); } }
录音:一个简单的录音例子,基本不怎么使用的
录音:
import java.io.File; import java.io.IOException; import android.app.Activity; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity { private OnClickListener btnClickListener=new OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnStartRecord: startRecord(); break; case R.id.btnStopRecord: stopRecord(); break; } } }; private void startRecord(){ if (mp==null) { File dir = new File(Environment.getExternalStorageDirectory(), "sounds"); if (!dir.exists()) { dir.mkdirs(); } File soundFile = new File(dir, System.currentTimeMillis()+".amr"); if (!soundFile.exists()) { try { soundFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } mp = new MediaRecorder(); mp.setAudioSource(MediaRecorder.AudioSource.MIC); mp.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB); mp.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); mp.setOutputFile(soundFile.getAbsolutePath()); try { mp.prepare(); mp.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } private void stopRecord(){ if (mp!=null) { mp.stop(); mp.release(); mp = null; } } private MediaRecorder mp=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btnStartRecord).setOnClickListener(btnClickListener); findViewById(R.id.btnStopRecord).setOnClickListener(btnClickListener); } }
发表评论
-
2048源码(核心算法有,缺少几个anctionbar,以后补上)
2014-09-25 13:22 14532048游戏基本上有四部分组成, 1:主activity,包含 ... -
android动画效果
2014-09-24 18:06 1104前几天弄alertdialog和popupwindow的时候, ... -
AlertDialog和PopupWindow
2014-09-18 15:44 1860区别:AlertDialog是非阻塞式对话框:AlertDia ... -
基础篇--resources资源
2014-09-12 15:18 487最近一直在做java开发,偶尔敲点android代码,突然发现 ... -
多点触摸(图片缩放为例)
2014-09-01 17:22 621多点触摸的事件跟单点是大同小异的,上个图片缩放的代码,供大家参 ... -
Toast的多种样式(附带Notification)
2014-09-01 13:48 884Toast以前用的时候一直以为只有文字提示,偶然得知也有多种样 ... -
Android Adapter详解(2)
2014-08-15 14:05 10以前Adapter一直用的不是太好,经过长时间的浸淫,现在可以 ... -
BroadcastReceiver简介
2014-08-14 16:27 643BroadcastReceiver作为四大 ... -
关于Android的Service
2014-08-14 13:57 420说起来真是羞愧,以前手机经常开机的时候,不会有任何QQ消息通知 ... -
在开发过程中易出的错误
2014-08-13 16:53 3581:如果继承ListActivity,那么layout中必须有 ... -
Sqlite无脑使用
2014-08-11 14:56 855不会sqlite的人再也不用愁了,无脑使用,只要会粘贴复制就O ... -
android弹出框
2014-08-11 11:23 481不得不说,android自带的弹出框真心丑,而且还不好用,接下 ... -
android几种数据存储方式
2014-08-11 10:45 670android数据存储方式 1:SharedPreferen ... -
SQLiteOpenHelper和ContentProvider区别
2014-08-06 15:08 1395Android中操作数据库主要有两种方法:使用SQLiteOp ... -
xml文件解析SAX
2014-08-05 13:45 459xml文件解析:xml文件解析有四种方式, 1.DOM生成和解 ... -
Android不常用代码(1)
2014-07-31 18:07 490目录 1:Webview 2:js交互 1:Web ... -
系统窗口的调用
2014-07-31 15:46 430直接上代码吧,intent进行调用 @Override ... -
fragment简单实用及数据传递(2)
2014-07-31 15:13 2515FragmentTransaction 进行数据传递 imp ... -
ActionBar简介
2014-07-31 10:47 669Action bar是一个标识应用程序和用户位置的窗口功能,并 ... -
fragment简单实用及数据传递(1)
2014-07-30 16:29 686Fragment的使用相关 使用Fragment时,需要继承 ...
相关推荐
深度学习,让语文教学不再浅尝辄止.pdf
NULL 博文链接:https://heidaosajia.iteye.com/blog/794170
字体结束访谈前端面试采访访谈收集,持续更新,勿浅尝辄止此次更新合并了其他的面试题收集在一个项目,其他项目会删除掉clone或者Fork之后再克隆到本地安装环境npm我docsify-cli -g启动本地查看docsify服务docs面试...
Node.js 浅尝辄止 By Kaidi, ZHU, R&D Engineer of and . 正确打开姿势 预备工作:请确保已安装 Node.js 在你的电脑。 安装 依赖。执行 $ npm install。 启动它,执行 $ npm start 。 在弹出的浏览器窗口中点击 ...
github repository学习记录
java 技术人员必备知识,不满足浅尝辄止的人士请下载。
能就业的Python自动化测试开发实战 搞定分布式并发场景视频教程,完整版...让多少人浅尝辄止,无法有质的提升。为了从根源上摆脱束缚,本课程带你开发高扩展、高可用的自动化测试框架,助你更好的利用测试自动化技术。
能就业的Python自动化测试开发实战 搞定分布式并发场景视频教程,完整版...让多少人浅尝辄止,无法有质的提升。为了从根源上摆脱束缚,本课程带你开发高扩展、高可用的自动化测试框架,助你更好的利用测试自动化技术。
以襄阳市2010年生态足迹计算、分析为例,结合当前生态足迹研究的现状和趋势,尝试提出存在的主要问题,并浅尝辄止的指出后续应在研究尺度更微观、改进计算方法和多种研究方法相结合等方面深 化生态足迹研究,以更好...
全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深人探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如PCMCIA、I2C和USB等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的...
此为数据库课件,包含8讲内容,适合浅尝辄止的同学自学使用!
全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深人探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如PCMCIA、I2C和USB等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的...
全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深人探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如PCMCIA、I2C和USB等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的...
要么太过晦涩难懂,满满都是复杂的数学公式,要么就是为了避免数学而浅尝辄止,让人不得要领,仅需中学数学知识就能看懂的人工智能入门课,零基础学习+多项目实战,重新解构入门AI陡峭的知识曲线。
作为一名数据科学行业从业者,即使在pandas...与此同时,我也通读了国内外各种pandas教程,不过总体而言这些教程多数浅尝辄止,不够实用。所以,我决定编写一套pandas教程,提高自己能力的同时,也能帮助大家少走弯路。
在写这篇文章的时候我有点犹豫,因为先前写过一篇类似的,一道关于并发控制的面试题,只不过那篇文章只给出了一种解决方案,后来在网上又陆续找到两种解决方案,说来惭愧,研究问题总是浅尝辄止,所以今天便放在...
在AJAX领域已经有一些非常好的图书出版,不过这些图书大都是用PHP、.Net等语言描述的,以Java实现的并不是很多,即使有也是浅尝辄止。不过《专家手记AJAX开发实战 》的出现改变了这一面貌。 这本书不仅用了大量...
很经典的,第一次觉得这类专著也很好看.是关于控制论这门学科的浅尝辄止,稳定的系统等学问