多媒体播放与录制

音频播放

通过MediaPlayer提供的方法,可以播放不同来源的音乐文件(res资源中、存储器中、或者网络)

基本流程

  1. 构建MediaPlayer对象

对于不同来源的音频文件,采用不同的方法

(1)res资源

存储在应用程序apk中res目录下,使用create()方法创建MediaPlayer对象

1
MediaPlayer mplayer=MediaPlayer.create(this,R.raw.<文件名>)

注:create()方法中已经封装了初始化及同步的方法,故不需要再进行setDataSource()初始化以及prepare()同步操作。

(2)存储

  • new()创建MediaPlayer对象
  • 调用setDataSource()设置多媒体来源
1
2
3
MediaPlayer mplayer=new MediaPlayer();
mplayer.setDataSource('PATH');
mplayer.prepare();

注:

  • PATH=Environment.getExternalStoragePublicDirectory(Environment.<目录名>)+”/<文件名>.mp3”
  • 更多方法见上一节

视频播放

Android实现视频播放的应用程序有两种:

  • MediaPlayer + SurfaceView
    • 此方法是基础,可以编程控制播 放器的大小和位置。(Widgets/SurfaceView)
  • MediaController + VideoView
    • 此方法使用起来更方便,但由于是Android封装好的类,播放器的大小、位置等都不接受编程控制。(widgets/VideoView)

MediaPlayer + SurfaceView

访问内部存储

1
2
3
4
5
mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
mediaPlayer = new MediaPlayer();
mediaPlayer = MediaPlayer.create(this,R.raw.video);
mediaPlayer.setDisplay(sh);
mediaPlayer.start();

访问外部存储

1
2
3
4
5
6
7
8
9
10
mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
mediaPlayer = new MediaPlayer();
//设置数据源
path=getExternalFilesDir(null)+"/video.mp4"
mediaPlayer.setDataSource(path);
//设置sh
SurfaceHolder sh = mSurfaceView.getHolder();
mediaPlayer.setDisplay(sh);
mediaPlayer.prepare()
mediaPlayer.start();

MediaController + VideoView

VideoView是系统自带的视频播放控件,自带进度条、暂停、播 放等功能,使用起来比较简单。(Widgets/VideoView)

只需要为控件设置好播放路径,判断监听是否准备就绪,直接播 放即可。

1
2
3
4
5
6
7
8
9
//新建对象
mVideoView = (VideoView) findViewById(R.id.video);
mMediaController = new MediaController(this); //调用构造器完成初始化
//设置
String path = getExternalFilesDir(null) + "/sample.3gp";
mVideoView.setVideoPath(path);
mMediaController.setMediaPlayer(mVideoView); //关联控制器与视频
mVideoView.setMediaController(mMediaController); //关联视频与控制器
mVideoView.start();

录音与拍照

Android系统提供了两种API用于实现录音功能:AudioRecordMediaRecorder

MediaRecorder

1
mRecorder = new MeidaRecorder();

补充:设置监听的方法

利用已有类

直接利用现有的类,设置监听接口,绑定监听对象,重写监听方法。

新建一个类

退出方法

实现保留数据,退出Activity的方法总结

1
2
3
startActivityForResult()

finish()

实现退出功能的方法

1
System.exit(0);

startActivityForResult

第一个Activity打开第二个Activity,第二个Activity关闭后需要返回数据给第一个Activity。

重写onActivityResult()方法

1
2
3
4
5
@override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode,resultCode,data);
...
};

当第二个Activity关闭时,返回第一个Activity,在第一个Activity中重写onActivityResult方法,数据可以从data中取出(以String类型和图片类型的数据为例):

1
2
String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据
Bitmap bitmap = (Bitmap) data.getExtras().get("data");

AndroidManifest详解

从上到下

<manifest>元素

首先,所有的xml都必须包含<manifest>元素。这是文件的根节点。它必须要包含<application>元素,并且指明xmlns:android和package属性。

xmlns:android

这个属性定义了Android命名空间。必须设置成”http://schemas.android.com/apk/res/android“。不要手动修改。

xmlns:tools

定义了tools命名空间,tools可以告诉Android Studio,哪些属性在运行的时候是被忽略的,只在设计布局的时候有效。

package

这是一个完整的Java语言风格包名。包名由英文字母(大小写均可)、数字和下划线组成。每个独立的名字必须以字母开头。

构建APK的时候,构建系统使用这个属性来做两件事:

  • 1、生成R.java类时用这个名字作为命名空间(用于访问APP的资源)
    比如:package被设置成com.sample.teapot,那么生成的R类就是:com.sample.teapot.R
  • 2、用来生成在manifest文件中定义的类的完整类名。比如package被设置成com.sample.teapot,并且activity元素被声明成,完整的类名就是com.sample.teapot.MainActivity。

包名也代表着唯一的application ID,用来发布应用。但是,要注意的一点是:在APK构建过程的最后一步,package名会被build.gradle文件中的applicationId属性取代。如果这两个属性值一样,那么万事大吉,如果不一样,那就要小心了。

android:versionCode

内部的版本号。用来表明哪个版本更新。这个数字不会显示给用户。显示给用户的是versionName。这个数字必须是整数。不能用16进制,也就是说不接受”0x1”这种参数

android:versionName

显示给用户看的版本号。

<application>元素

此元素描述了应用的配置。这是一个必备的元素,它包含了很多子元素来描述应用的组件,它的属性影响到所有的子组件。许多属性(例如icon、label、permission、process、taskAffinity和allowTaskReparenting)都可以设置成默认值。

android:allowBackup

表示是否允许APP加入到备份还原的结构中。如果设置成false,那么应用就不会备份还原。默认值为true。

android:dataExtractionRules

应用可以将此属性设置为 XML 资源,在其中指定规则,以确定在备份或转移操作过程中您可以从设备复制哪些文件和目录。

如需了解 XML 文件的格式,请参阅备份和恢复方面的变更文档。

android:fullBackupContent

这个属性指向了一个xml文件,该文件中包含了在进行自动备份时的完全备份规则。这些规则定义了哪些文件需要备份。此属性是一个可选属性。默认情况下,自动备份包含了大部分app文件。

android:icon

APP的图标,以及每个组件的默认图标。可以在组价中自定义图标。这个属性必须设置成一个引用,指向一个可绘制的资源,这个资源必须包含图片。系统不设置默认图标。

android:roundIcon

圆形图标

android:label

一个用户可读的标签,以及所有组件的默认标签。子组件可以用他们的label属性定义自己的标签,如果没有定义,那么就用这个标签。标签必须设置成一个字符串资源的引用。

android:supportsRtl

声明您的应用是否愿意支持从右到左 (RTL) 布局。

如果设为 true 并且 targetSdkVersion 设为 17 或更高版本,则系统会激活和使用各种 RTL API,以便您的应用可以显示 RTL 布局。如果设为 false 或者如果 targetSdkVersion 设为 16 或更低版本,则 RTL API 将被忽略或不起作用,无论与用户所选语言区域关联的布局方向为何(布局始终是从左到右),应用的行为都相同。

此属性的默认值为 false

此属性是在 API 级别 17 中添加的。

android:theme

该属性定义了应用使用的主题的,它是一个指向style资源的引用。各个activity也可以用自己的theme属性设置自己的主题。

tools:targetApi

起到忽略警告的作用。

<activity>元素

该元素声明一个实现应用可视化界面的Activity(Activity类子类)。这是元素中必要的子元素。所有Activity都必须由清单文件中的元素表示。任何未在该处声明的Activity对系统都不可见,并且永远不会被执行。

android:name

Activity类的名称,是Activity类的子类。该属性值为完全限定类名称。

没有默认值,必须指定该名称。

android:exported

是Android中的四大组件Activity,Service,Provider,Receiver四大组件中都会有的一个属性。主要作用是:是否支持其它应用调用当前组件。默认值:如果包含有intent-filter默认值为true;没有intent-filter默认值为false。

<intent-filter元素

指明这个activity可以以什么样的意图(intent)启动。该元素有几个子元素可以包含。

<action>元素

表示activity作为一个什么动作启动,android.intent.action.MAIN表示作为主activity启动。

<category>元素

这是action元素的额外类别信息,android.intent.category.LAUNCHER表示这个activity为当前应用程序优先级最高的Activity。

转自

作者:闪电的蓝熊猫
链接:https://www.jianshu.com/p/3b5b89d4e154