精华内容
下载资源
问答
  • RIFF文件什么

    千次阅读 2017-12-07 22:14:20
    RIFF全称为资源互换文件格式(ResourcesInterchange FileFormat),RIFF文件是windows环境下大部分多媒体文件遵循的一种文件结构,RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF文件存储的数据包括: ...

    RIFF全称为资源互换文件格式(ResourcesInterchange FileFormat),RIFF文件是windows环境下大部分多媒体文件遵循的一种文件结构,RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF文件存储的数据包括:
    音频视频交错格式数据(.AVI)
    波形格式数据(.WAV)
    位图格式数据(.RDI)
    MIDI格式数据(.RMI)
    调色板格式(.PAL)
    多媒体电影(.RMN)
    动画光标(.ANI)
    其它RIFF文件(.BND)

    WAV文件header部分的第21-22字节(FormatID)如果是16进制的0100,才是LPCM

    其他的FormatID如下
    0x0001 PCM
    0x0002 MS ADPCM
    0x0005 IBM CSVD
    0x0006 A-Law
    0x0007 μ-Law
    0x0010 OKI ADPCM
    0x0011 IMA/DVI ADPCM
    0x0012 MediaSpace ADPCM
    0x0013 Sierra ADPCM
    0x0014 ADPCM (G.723)
    0x0015 DIGISTD
    0x0016 DIGIFIX
    0x0020 YAMAHA ADPCM
    0x0021 SONARC
    0x0022 TrueSpeech
    0x0023 Echo Speech1
    0x0024 AF36 (Audiofile)
    0x0025 Apix
    0x0026 AF10 (Audiofile)
    0x0030 AC2 (Dolby)
    0x0031 GSM 6.10
    0x0033 ANTEX ADPCM
    0x0034 VQLPC (Control Resources)
    0x0035 DIGIREAL
    0x0036 DIGIADPCM
    0x0037 CR10 (Control Resources)
    0x0040 ADPCM (G.721)
    0x0101 IBM μ-LAW
    0x0102 IBM A-LAW
    0x0103 IBM ADPCM
    0x0200 Creative Labs ADPCM
    0x0300 FM TOWNS
    0x1000 Olivetti GSM
    0x1001 Olivetti ADPCM
    0x1002 Olivetti CELP
    0x1003 Olivetti SBC
    0x1004 Olivetti OPR

    展开全文
  • 多媒体教室

    2013-06-14 08:10:31
    多媒体网络教室经过严格的软、硬件测试过程,全面支持 Windows 系列操作系统,包括 Windows 9X、Windows Me、Windows NT 4.0、Windows 2000、Windows XP以及 Windows RPL/PXE 无盘工作站,支持跨网段校园网教学,对...
  • 学 海 无 涯 第1章 多媒体技术概要 1.1 多媒体什么 多媒体是融合两种或者两种以上媒体的一种人-机交互式信息交流和传播媒体使用的 媒体包括文字图形图像声音动画和视像(video) 无损压缩是什么 无损压缩是用压缩后...
  • 这个数据库中包括 音频、视频、图像、文件等多种类型的文件索引,Android会周期性地检索手机中的文件,添加至该数据库中。(一些应用也可以自发地将文件添加至该数据库中) 所以,我们只需要查询该数据

    参考资料:
    android手机文件快速扫描,并归类
    Android使用MediaStore获取手机上的文件
    Android教程之MediaStore
    Android之MediaStore使用的点点滴滴//这里有个获取缩略图的,没用过
    Android中多媒体文件、文档以及各类文件的获取

    一开始想的是遍历所有文件夹,幸好查了度娘,才意识到这个想法有多蠢。
    最为节省时间的做法是通过一个ContentProvider:MediaStore进行查询

    一、什么是MediaStore

    1、概述

    MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。
    这个数据库中包括 音频、视频、图像、文件等多种类型的文件索引,Android会周期性地检索手机中的文件,添加至该数据库中。(一些应用也可以自发地将文件添加至该数据库中)
    所以,我们只需要查询该数据库中的内容即可。

    2、MediaStore在哪里?

    使用一个root过的手机,或者第三方模拟器,我们可以找到data/data这个路径
    在这里插入图片描述
    找到/data/data/com.android.providers.media,里面database里存放着两个数据库:external.db和internal.db,这就是MediaStore数据库的本体。

    使用db browser等软件可以看的表的真容
    在这里插入图片描述
    我们需要的文件信息就在这里啦。

    二、从MediaStore获取数据

    1、添加权限

    在Manifest中添加权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    这样还不够,由于到Android 10为止,READ_EXTERNAL_STORAGE已经被列为危险权限,所以我们需要在运行时动态获取该权限。
    在这里插入图片描述

    //ContextCompat.checkSelfPermission()函数,接受两个参数:Context和权限名,返回值等于PackageManager.PERMISSION_GRANTED时说明同意授权
                if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                    //请求授权,接受三个参数:Activity实例;请求权限名的String数组;请求码(唯一值即可)
                    ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1)
                }
    

    2、获取每行数据

    val contentResolver = context.contentResolver
    

    可以使用contentResolver对象进行查询,通过contentResolver.query()方法获得MediaStore数据库
    这个方法接收五个参数,
    contentResolver.query()
    看起来有点多,后面用的时候再说。

    如果不加过滤等条件,查询全部数据只需要把后四个参数置为null即可,第一个参数为一个Uri对象,这里固定输入MediaStore.Files.getContentUri(“external”)即可,表示查询external.db这个库中的全部数据。

    val cursor = contentResolver.query(
         MediaStore.Files.getContentUri("external"),
         null,
         null,
         null,
         null
    )
    

    contentResolver.query()方法返回一个Cursor对象
    Cursor,译为“游标”,对于每个表来说,cursor指代的就是每一行
    Cursor的常用方法有:

    • getColumnCount()
      返回所有列的总数

    • getColumnIndex(String columnName)
      返回指定列的名称,如果不存在返回-1

    • getColumnIndexOrThrow(String columnName)
      从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。

    • getColumnName(int columnIndex)
      从给定的索引返回列名

    • getColumnNames()
      返回一个字符串数组的列名

    • getCount()
      返回Cursor 中的行数

    • moveToFirst()
      移动光标到第一行

    • moveToLast()
      移动光标到最后一行

    • moveToNext()
      移动光标到下一行,它返回的boolean值的意义为,当为真时表明光标移动成功,为false时说明移动失败,即没有移动成功。

    • moveToPosition(int position)
      移动光标到一个绝对的位置

    • moveToPrevious()
      移动光标到上一行

    3、确定每列的含义。

    我们可以使用cursor.getColumnNames()这个方法来返回所有列的名称,从而查看这个表中每列的索引和它所代表的内容

    val name = cursor.columnNames
    for (n in name){
        Log.d("myTest", "${cursor.getColumnIndexOrThrow(n)} -> $n")
    }
    

    打印结果如下:

    2020-10-06 21:58:43.926 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 0 -> _id//主键id
    2020-10-06 21:58:43.926 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 1 -> _data//路径
    2020-10-06 21:58:43.926 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 2 -> _size//大小
    2020-10-06 21:58:43.926 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 3 -> format
    2020-10-06 21:58:43.926 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 4 -> parent
    2020-10-06 21:58:43.926 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 5 -> date_added//添加日期
    2020-10-06 21:58:43.926 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 6 -> date_modified//修改日期
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 7 -> mime_type//文件类型
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 8 -> title
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 9 -> description
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 10 -> _display_name
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 11 -> picasa_id
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 12 -> orientation
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 13 -> latitude
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 14 -> longitude
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 15 -> datetaken
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 16 -> mini_thumb_magic
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 17 -> bucket_id
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 18 -> bucket_display_name
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 19 -> isprivate
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 20 -> title_key
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 21 -> artist_id
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 22 -> album_id
    2020-10-06 21:58:43.927 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 23 -> composer
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 24 -> track
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 25 -> year
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 26 -> is_ringtone
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 27 -> is_music
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 28 -> is_alarm
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 29 -> is_notification
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 30 -> is_podcast
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 31 -> album_artist
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 32 -> duration
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 33 -> bookmark
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 34 -> artist
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 35 -> album
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 36 -> resolution
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 37 -> tags
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 38 -> category
    2020-10-06 21:58:43.928 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 39 -> language
    2020-10-06 21:58:43.929 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 40 -> mini_thumb_data
    2020-10-06 21:58:43.929 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 41 -> name
    2020-10-06 21:58:43.929 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 42 -> media_type
    2020-10-06 21:58:43.929 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 43 -> old_id
    2020-10-06 21:58:43.929 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 44 -> is_drm
    2020-10-06 21:58:43.929 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 45 -> width
    2020-10-06 21:58:43.929 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 46 -> height
    2020-10-06 21:58:43.929 6983-7059/com.lrgy.photoquerytestdemo D/myTest: 47 -> title_resource_uri
    

    好家伙,一共48列,不过大部分的意思都可以从名字中看出来
    以下标注几个比较常用的:

    序号 名称 含义 值类型
    0 _id 数据库中的主键 int
    1 _data 文件的绝对路径(/storage/…) String
    2 _size 文件大小 int
    5 date_added 添加日期 int
    6 date_modified 修改日期 int
    7 mime_type 文件类型(可能为空!) String
    8 title 文件名称(不带后缀名) String
    10 _display_name (带后缀名的媒体文件名:XXX.jpg、XXX.wav、XXX.mp3…)(很可能为空!) String
    18 bucket_display_name 来自哪个包(如WeiXin)(可能为空!) String

    4、取出对应的数据

    如此一来,我们便可以使用MediaStore.Files.FileColumns._ID等方法获取到每列的名称字符串,随后传入getString()、getInt()等方法获取每行对应的值。

    val ID: Int = cursor!!.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID)
    val MIME_TYPE: Int = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE)
    val DATA: Int = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)
    val SIZE: Int = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE)
    val DATE_MODIFIED: Int = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED)
    val NAME = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.TITLE)
    
    var id:Int
    var type:String = "未知"
    var data:Int
    var size:Int
    var path:String
    var name:String
    do {
        id = cursor.getInt(ID)
        if(cursor.getString(MIME_TYPE) != null){
            type = cursor.getString(MIME_TYPE)
        }
        size = cursor.getInt(SIZE)
        data = cursor.getInt(DATE_MODIFIED)
        path = cursor.getString(DATA)
        Log.d(TAG,"id -> $id type -> $type size -> $size data -> $data path -> $path ")
    }while (!cursor.moveToNext())
    

    三、分类检索数据

    想要分类数据,自然是从contentResolver.query()这个方法的五个参数入手啦,再看一下参数的含义:
    contentResolver.query()

    1. 第一个参数是文件的路径,有以下四种:
      | 常量 |含义 |
      |–|--|
      |MediaStore.Files.getContentUri(“external”)|全部内容
      |MediaStore.Video.Media.EXTERNAL_CONTENT_URI|视频内容
      |MediaStore.Audio.Media.EXTERNAL_CONTENT_URI|音频内容
      Uri uri1 = MediaStore.Images.Media.EXTERNAL_CONTENT_URI|图片内容
    2. 第二个参数是列构建一个String数组,把列名传递进去即可
      如:
    val MYPROJECTION = arrayOf(
        MediaStore.Images.Media._ID,
        MediaStore.Images.Media.DATA,
        MediaStore.Files.FileColumns.MIME_TYPE,
        MediaStore.Files.FileColumns.SIZE,
        MediaStore.Files.FileColumns.TITLE
    )
    
    1. 第三个参数是查询条件,需要指定要限制条件,如:
      “(” + MediaStore.Files.FileColumns.DATA + " LIKE ‘%.xls’" +
      " or " + MediaStore.Files.FileColumns.DATA + " LIKE ‘%.docx’" +
      " or " + MediaStore.Files.FileColumns.DATA + " LIKE ‘%.apk’" +
      " or " + MediaStore.Files.FileColumns.DATA + " LIKE ‘%.xlsx’" +
      " or " + MediaStore.Files.FileColumns.DATA + " LIKE ‘%.rar’" + “)”

      "mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? "

    2. 第四个参数指定前一个参数中的“?”,没有就填NULL

    3. 第五个参数是排序方式,如:
      MediaStore.Files.FileColumns.DATE_ADDED + " DESC"//按照添加日期降序顺序排序

    四、例子

    val DOC_PROJECTION = arrayOf(
        MediaStore.Images.Media._ID,
        MediaStore.Images.Media.DATA,
        MediaStore.Files.FileColumns.MIME_TYPE,
        MediaStore.Files.FileColumns.SIZE,
        MediaStore.Files.FileColumns.TITLE
    )
    
    val projection = DOC_PROJECTION
    String selection = null;
    String[] selectionArgs = null;
    Uri uri = MediaStore.Files.getContentUri("external");
    if (i == 0) {  //一些能通过mime_type查询出来的文档 .doc .pdf .txt .apk
        selection = "mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? ";
        selectionArgs = new String[]{"text/html", "application/msword", "application/pdf", "text/plain"};
    
    } else if (i == 1) { //一些不能通过mime_type查询出来的文档 .docx .xls .xlsx .rar
        selection = "(" + MediaStore.Files.FileColumns.DATA + " LIKE '%.xls'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.docx'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.apk'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xlsx'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.rar'" + ")";
        selectionArgs = null;
    
    } else if (i == 2) { //视频文件
        uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        selection = "mime_type = ?";
        selectionArgs = new String[]{"video/mp4"};
    } else if (i == 3) {  //音频文件
    
        uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        selection = "mime_type = ? or mime_type = ?";
        selectionArgs = new String[]{"audio/mpeg", "audio/ogg"};
    }
    val cursor: Cursor = context.getContentResolver().query(
        uri,
        projection,
        selection,
        selectionArgs,
        MediaStore.Files.FileColumns.DATE_ADDED + " DESC"
    )
    
    展开全文
  • Android多媒体开发 一,音乐播放 二,视频播放 三,歌曲录制 四,相机设置 五,闹钟设置 ...1,什么是Open Core?...多媒体框架的核心,所有 Android 平台的音频、视频的采用以及...A,多媒体文件的播放、下载,包括:3

    Android多媒体开发

    一,音乐播放

    二,视频播放

    三,歌曲录制

    四,相机设置

    五,闹钟设置

    六,铃声设置

     

     

    一,音乐播放

    1,什么是Open Core?

    Open Core Android 多媒体框架的核心,所有 Android 平台的音频、视频的采用以及播放等操作,都是通过它来实现。

    2,Open Core 的具体功能

    A,多媒体文件的播放、下载,包括:3GPPMPEG-4AAC MP3 containers

    B,流媒体文件的下载、实时播放,包括:3GPPHTTP RTSP/RTP

    C,动态视频和静态图像的编码、解码,例如:MPEG-4H.263 AVC H.264),JPEG

    D,语音编码格式:MP3AACAAC+

    E,视频和图像格式:3GPPMPEG-4 JPEG

    F,视频会议:基于 H324-M 标准。

    Open Core是一个多媒体的框架,从宏观上来看,它主要包含了两大方面的内容:

    A,PVPPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Playback)功能。

    B,PVAuthor:提供媒体流记录的功能,完成各种音频、视频流以及静态图像的捕获功能。

    3,Mediaplayer 介绍 

    MediaPlayer 类可以用来播放音频、视频和流媒体,MediaPlayer包含了Audio Video 的播放功能,在 Android 的界面上, Music Video 两个应用程序都是调用 MediaPlayer 实现的。下面两张图是 MediaPlayer  Android Open Core 的示例图

    下面是图例显示 MediaPlayer 的生命周期

     

    MediaPlayer 常用方法介绍

    方法:create(Context context, Uri uri) 
    解释:静态方法,通过Uri创建一个多媒体播放器。

    方法:create(Context context, intresid)
    解释:静态方法,通过资源ID创建一个多媒体播放器

    方法:create(Context context, Uri uri, SurfaceHolder holder)
    解释:静态方法,通过Uri和指定 SurfaceHolder 【抽象类】创建一个多媒体播放器

    方法: getCurrentPosition()
    解释:返回 Int得到当前播放位置

    方法: getDuration()
    解释:返回 Int,得到文件的时间

    方法:getVideoHeight()
    解释:返回 Int ,得到视频的高度

    方法:getVideoWidth()
    解释:返回 Int,得到视频的宽度

    方法:isLooping()
    解释:返回 boolean ,是否循环播放

    方法:isPlaying()
    解释:返回 boolean,是否正在播放

    方法:pause()
    解释:无返回值,暂停

    方法:prepare()
    解释:无返回值,准备同步

    方法:prepareAsync()
    解释:无返回值,准备异步

    方法:release()
    解释:无返回值,释放 MediaPlayer  对象

    方法:reset()
    解释:无返回值,重置 MediaPlayer  对象

    方法:seekTo(int msec)
    解释:无返回值,指定播放的位置(以毫秒为单位的时间)

    方法:setAudioStreamType(intstreamtype)
    解释:无返回值,指定流媒体的类型

    方法:setDataSource(String path)
    解释:无返回值,设置多媒体数据来源【根据路径】

    方法:setDataSource(FileDescriptor fd, longoffset, long length)
    解释:无返回值,设置多媒体数据来源【根据 FileDescriptor

    方法:setDataSource(FileDescriptor fd)
    解释:无返回值,设置多媒体数据来源【根据 FileDescriptor

    方法:setDataSource(Context context, Uri uri)
    解释:无返回值,设置多媒体数据来源【根据 Uri

    方法:setDisplay(SurfaceHolder sh)
    解释:无返回值,设置用 SurfaceHolder 来显示多媒体

    方法:setLooping(booleanlooping)
    解释:无返回值,设置是否循环播放

    事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListenerlistener)
    解释:监听事件,网络流媒体的缓冲监听

    事件:setOnCompletionListener(MediaPlayer.OnCompletionListenerlistener)
    解释:监听事件,网络流媒体播放结束监听

    事件:setOnErrorListener(MediaPlayer.OnErrorListenerlistener)
    解释:监听事件,设置错误信息监听

    事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListenerlistener)
    解释:监听事件,视频尺寸监听

    方法:setScreenOnWhilePlaying(booleanscreenOn)
    解释:无返回值,设置是否使用 SurfaceHolder 显示

    方法:setVolume(floatleftVolume, float rightVolume)
    解释:无返回值,设置音量

    方法:start()
    解释:无返回值,开始播放

    方法:stop()
    解释:无返回值,停止播放

    示例代码

    package com.terry;

    import java.io.File;
    import java.util.ArrayList;
    import java.util.List; 
    import android.app.ListActivity;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnCompletionListener;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.Toast;

    public class musicActivity extends ListActivity {
        //播放对象
        private MediaPlayer myMediaPlayer;
        //播放列表
        private List<String> myMusicList=new ArrayList<String>();
        //当前播放歌曲的索引
        private int currentListItem=0;
        //音乐的路径
        private static final String MUSIC_PATH=new String("/sdcard/");
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            myMediaPlayer=new MediaPlayer();
            
            findView();
            musicList();
            listener();
        }
        
        
        //绑定音乐
        void musicList(){
            File home=new File(MUSIC_PATH);
            if(home.listFiles(new MusicFilter()).length>0){
                for(File file:home.listFiles(new MusicFilter())){
                    myMusicList.add(file.getName());
                }
                ArrayAdapter<String> musicList=new ArrayAdapter<String>
                (musicActivity.this,R.layout.musicitme, myMusicList);
                setListAdapter(musicList);
            }
        }
        
        //获取按钮
       void findView(){
           viewHolder.start=(Button)findViewById(R.id.start);
           viewHolder.stop=(Button)findViewById(R.id.stop);
           viewHolder.next=(Button)findViewById(R.id.next);
           viewHolder.pause=(Button)findViewById(R.id.pause);
           viewHolder.last=(Button)findViewById(R.id.last);
       }
       
       
       //监听事件
       void listener(){
           //停止
           viewHolder.stop.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(myMediaPlayer.isPlaying()){
                    myMediaPlayer.reset();
                }
            }
        });
           //开始
           viewHolder.start.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
            }
        });
           //下一首
           viewHolder.next.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                nextMusic();
            }
        });
           //暂停
           viewHolder.pause.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(myMediaPlayer.isPlaying()){
                    myMediaPlayer.pause();
                }else{
                    myMediaPlayer.start();
                }
            }
        });
           //上一首
           viewHolder.last.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                
                lastMusic();
            }
        });
           
       }
       
       //播放音乐 
       void playMusic(String path){
           try { 
            myMediaPlayer.reset();
            myMediaPlayer.setDataSource(path);
            myMediaPlayer.prepare();
            myMediaPlayer.start();
            myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                
                @Override
                public void onCompletion(MediaPlayer mp) {
                    // TODO Auto-generated method stub
                    nextMusic();
                }
            });
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
       }
       
       //下一首
       void nextMusic(){
           if(++currentListItem>=myMusicList.size()){
               currentListItem=0;
           }
           else{
               playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
           }
       }
       
       //上一首
       void lastMusic(){
           if(currentListItem!=0)
               {
           if(--currentListItem>=0){
               currentListItem=myMusicList.size();
           } else{
               playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
           }
              }  else{
               playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
           }
       }
       
       //当用户返回时结束音乐并释放音乐对象
           @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
               if(keyCode==KeyEvent.KEYCODE_BACK){
                   myMediaPlayer.stop();
                   myMediaPlayer.release();
                   this.finish();
                   return true;
               }
            return super.onKeyDown(keyCode, event);
        }
       
           //当选择列表项时播放音乐 
           @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            // TODO Auto-generated method stub
            currentListItem=position;
            playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
        }
       
    }

    运行效果图:

     

    二,视频播放

    VideoView类用于播放视频文件,可以从不同的来源(例如资源文件,sdcard或网络)读取图像,计算和维护视频的画面尺寸以使其适用于任何布局管理器,并提供一些诸如缩放、着色之类的显示选项。

    VideoView常用方法介绍

    public boolean canPause()

    解释:判断是否能够暂停播放视频

    public boolean canSeekBackward()

    解释:判断是否能够倒退

     

    public boolean canSeekForward()

    解释:判断是否能够快进

     

    public int getBufferPercentage()

    解释:获得缓冲区的百分比

     

    public int getCurrentPosition()

    解释:获得当前的位置

     

    public int getDuration()

    解释:获得所播放视频的总时间

     

    public boolean isPlaying()

    解释:判断是否正在播放视频

     

    public boolean onKeyDown(int keyCode, KeyEventevent)

    解释:KeyEvent.Callback.onKeyMultiple()的默认实现。如果视图可用并可按, 当按下 KEYCODE_DPAD_CENTER 或 KEYCODE_ENTER 时执行视图的按下事件。

    public boolean onTouchEvent(MotionEventev)

    解释:实现该方法来处理触屏事件。

    public boolean onTrackballEvent(MotionEventev)

    解释:实现这个方法去处理轨迹球的动作事件,轨迹球相对于上次事件移动的位置能用MotionEvent.getX() MotionEvent.getY()函数取回。对应用户按下一次方向键,他们通常作为一次移动处理(为了表现来自轨迹球的更小粒度的移动信息,他们返回小数)。

    public void pause ()

    解释:使得播放暂停

     

    public int resolveAdjustedSize(int desiredSize, int measureSpec)

    解释:取得调整后的尺寸。

     

    public void resume ()

    解释:恢复挂起的播放器

     

    public void seekTo (intmsec)

    解释:设置播放位置

     

    public void setMediaController(MediaControllercontroller)

    解释:设置媒体控制器

            

    public void setOnCompletionListener(MediaPlayer.OnCompletionListenerl)

    解释:注册在媒体文件播放完毕时调用的回调函数。

    public void setOnErrorListener(MediaPlayer.OnErrorListenerl)

    解释:注册在设置或播放过程中发生错误时调用的回调函数。如果未指定回调函数, 或回调函数返回假,VideoView 会通知用户发生了错误。

    public void setOnPreparedListener(MediaPlayer.OnPreparedListenerl)

    解释:注册在媒体文件加载完毕,可以播放时调用的回调函数。

    public void setVideoPath(String path)

    解释:设置视频文件的路径名 

    public void setVideoURI(Uri uri)

    解释:设置视频文件的统一资源标识符

     

    public void start ()

    解释:开始播放视频文件

     

    public void stopPlayback()

    解释:停止回放视频文件

     

    public void suspend ()

    解释:挂起视频文件的播放

    示例代码

    1java代码

    public classRemoteVideo extends Activity {

    private String path ="";

    private String textUrl= "";

    private VideoViewmVideoView;

    private static int i =0;

    privateint width;

    privateint heigh;

    privateDialog dialog;

    privateHandler mHandler = new Handler();


    public void onCreate(Bundle icicle) {

    super.onCreate(icicle);

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    Bundle bundle =this.getIntent().getExtras();

    DisplayMetrics dm = newDisplayMetrics();

          getWindowManager().getDefaultDisplay().getMetrics(dm);

    width=dm.widthPixels;

    heigh=dm.heightPixels;

    textUrl =bundle.getString("url");

    if(width/heigh>0)

    {

    setContentView(R.layout.videoview);

    path =bundle.getString("widthurl");

    Log.i("MP4","heng"+path);

    }

    if(width/heigh==0)

    {

    setContentView(R.layout.view);

    path =bundle.getString("heighturl");

    Log.i("MP4","shu"+path);

    }

    dialog=ProgressDialog.show(this,"视频加载中...","请您稍候");

    mVideoView =(VideoView) findViewById(R.id.surface_view);

    mVideoView.setVideoPath(path);

    MediaControllercontroller = new MediaController(this);

    mVideoView.setMediaController(controller);

    mVideoView.requestFocus();

    mVideoView.setOnPreparedListener(newOnPreparedListener() {

    //@Override

    public voidonPrepared(MediaPlayer mp) {

    mVideoView.setBackgroundColor(Color.argb(0,0, 255, 0));

    dialog.dismiss();

    }

    });

    mVideoView.setOnCompletionListener(newOnCompletionListener() {

    //@Override

    public voidonCompletion(MediaPlayer mp) {

    Toast.makeText(RemoteVideo.this,"video play finished!", Toast.LENGTH_LONG)

    .show();

    }

    });

    controller.setOnTouchListener(newView.OnTouchListener() {


    public boolean onTouch(View v, MotionEvent event) {

    return true;

    }

    });

    }


    @Override

    protected voidonResume() {

    super.onResume();

    mVideoView.seekTo(i);

    mVideoView.start();

    }

    @Override

    protected void onStop(){

    super.onStop();

    mVideoView.pause();

    i =mVideoView.getCurrentPosition();

    }

    @Override

       public boolean onKeyDown(int keyCode, KeyEvent event) {

           if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

            finish();

               return true;

           }

           return false;

        }

    }



    2,布局文件


    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"

    Android:layout_width="fill_parent"android:layout_height="fill_parent"

    Android:gravity="left"android:orientation="horizontal">

    <VideoView Android:id="@+id/surface_view"

    Android:layout_width="176px"android:layout_height="132px"

    Android:layout_gravity="left"/>

    <WebView Android:id="@+id/web_openonline"

    Android:layout_width="wrap_content"

    Android:layout_height="wrap_content"/>

    </LinearLayout>

     

     

    三,歌曲录制

    MediaRecorder在底层是基于OpenCore库实现的,包含了Audiovideo的记录功能。

    示例代码

    1, 清单文件

    <?xml version="1.0" encoding="utf-8"?>  

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  

        package="com.Aina.Android" android:versionCode="1" android:versionName="1.0">  

        <application android:icon="@drawable/icon" android:label="@string/app_name">  

            <activity android:name=".Test" android:label="@string/app_name">  

                <intent-filter>  

                    <action android:name="android.intent.action.MAIN" />  

                    <category android:name="android.intent.category.LAUNCHER" />  

                </intent-filter>  

            </activity>  

      

        </application>  

        <uses-permission android:name="android.permission.RECORD_AUDIO">  

        </uses-permission>  

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>  

      

    </manifest>   

     

     

    2java代码

    package com.Aina.Android;  

      

    import java.io.File;  

    import java.io.FilenameFilter;  

    import java.io.IOException;  

    import java.util.ArrayList;  

    import java.util.List;  

      

    import android.app.Activity;  

    import android.content.Intent;  

    import android.media.MediaRecorder;  

    import android.net.Uri;  

    import android.os.Bundle;  

    import android.os.Environment;  

    import android.util.Log;  

    import android.view.View;  

    import android.widget.AdapterView;  

    import android.widget.ArrayAdapter;  

    import android.widget.Button;  

    import android.widget.ListView;  

    import android.widget.Toast;  

    import android.widget.AdapterView.OnItemClickListener;  

      

    public class Test extends Activity {  

        /** Called when the activity is first created. */  

        private ListView mListView = null;  

        private Button btn_start = null;  

        private Button btn_stop = null;  

        private MediaRecorder mMediaRecorder = null;  

        private List<String> rec = new ArrayList<String>();// 存放录音文件   

        private File home = null;  

        private File path = null;  

        private String temp = "recaudio_";// 临时文件前缀   

      

        @Override  

        public void onCreate(Bundle savedInstanceState) {  

            super.onCreate(savedInstanceState);  

            setContentView(R.layout.main);  

            mListView = (ListView) this.findViewById(R.id.ListView01);  

            btn_start = (Button) this.findViewById(R.id.Button01);  

            btn_stop = (Button) this.findViewById(R.id.Button02);  

            // 是否存在SD   

            if (Environment.getExternalStorageState().equals(  

                    Environment.MEDIA_MOUNTED)) {  

                home = Environment.getExternalStorageDirectory();  

                MusicList();  

            } else {  

                Toast.makeText(this, "请先插入SD", Toast.LENGTH_LONG).show();  

                return;  

            }  

            btn_start.setOnClickListener(new Button.OnClickListener() {  

      

                public void onClick(View v) {  

                    // TODO Auto-generated method stub  

                    try {  

                        // 创建录音临时文件   

                        path = File.createTempFile(temp, ".amr", home);  

                        setTitle("=="+path.getAbsolutePath());  

                        mMediaRecorder = new MediaRecorder();  

                          

                        mMediaRecorder  

                                .setAudioSource(MediaRecorder.AudioSource.MIC);// 设置数据来源,麦克风   

                        mMediaRecorder  

                                .setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);// 设置格式   

                        mMediaRecorder  

                                .setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 设置编码   

                        mMediaRecorder.setOutputFile(path.getAbsolutePath());// 设置输出文件路径   

                        mMediaRecorder.prepare();  

                        mMediaRecorder.start();  

                    } catch (IOException e) {  

                        // TODO Auto-generated catch block  

                        e.printStackTrace();  

                    }  

                }  

      

            });  

            btn_stop.setOnClickListener(new Button.OnClickListener() {  

      

                public void onClick(View v) {  

                    // TODO Auto-generated method stub  

                    mMediaRecorder.stop();  

                    mMediaRecorder.release();  

                    mMediaRecorder = null;  

                    MusicList();  

                }  

      

            });  

            mListView.setOnItemClickListener(new OnItemClickListener(){  

      

                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  

                        long arg3) {  

                    // TODO Auto-generated method stub  

                    String path = home+File.separator+rec.get(arg2);  

                    File f = new File(path);  

                    PlayMusic(f);  

                }  

                  

            });  

        }  

      

        /** 

         * 显示列表  

         */  

        public void MusicList() {  

            File[] f = home.listFiles(new MusicFilter());  

                      rec.clear();  

            for (int i = 0; i < f.length; i++) {  

                File file = f[i];  

                rec.add(file.getName());  

            }  

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  

                    android.R.layout.simple_list_item_1, rec);  

            mListView.setAdapter(adapter);  

        }  

      

        /** 

         * 播放录音文件  

         * @param file 

         */  

        public void PlayMusic(File file){  

            Intent intent = new Intent();  

            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  

            intent.setAction(Intent.ACTION_VIEW);  

            intent.setDataAndType(Uri.fromFile(file), "audio");  

            this.startActivity(intent);  

        }  

        class MusicFilter implements FilenameFilter {  

      

            public boolean accept(File dir, String filename) {  

                // TODO Auto-generated method stub  

                return (filename.endsWith(".amr"));  

            }  

      

        }  

    }  

     

     

     

     

     

    四,相机设置

    通过android.hardware.Camera类来控制摄像头设备,通过Camera类可以与摄像头服务取得(断开)链接、可以设置摄像头的各种属性、开始(结束)图像预览、拍照或则录像。要使用Camera只有通过调用Camera的open()函数来得到一个Camera对象。另外系统还提供了一些接口来控制Camera的状态:

    • android.hardware.Camera.AutoFocusCallback :当摄像头自动对焦的时候调用,该接口具有一个函数 void onAutoFocus(boolean success, Camera camera);当自动对焦成功的时候success参数的值为true,否则为false。
    • android.hardware.Camera.ErrorCallback :当摄像头出错的时候调用,该接口具有一个函数 void onError(int error, Camera camera); 参数error为错误类型,其取值为Camera类中的常量CAMERA_ERROR_UNKNOWNCAMERA_ERROR_SERVER_DIED;前者表明错误类型不明确,后者表明服务已关闭,在这种情况下必须释放当前的Camera对象然后重新初始化一个。
    • android.hardware.Camera.PreviewCallback :在图像预览时候调用,该接口具有一个函数void onPreviewFrame(byte[] data, Camera camera); 参数data为每帧图像的数据流。
    • android.hardware.Camera.ShutterCallback :当摄像头快门关闭的时候调用,该接口具有一个函数void onShutter(); 可以在该函数中通知用户快门已关闭,例如播放一个声音。
    • android.hardware.Camera.PictureCallback :当拍摄照片的时候调用,该接口具有一个函数void onPictureTaken(byte[] data, Camera camera); 参数data为拍摄照片的数据流。

    当取得照片的数据流后可以通过BitmapFactory的decodeByteArray() 函数来解析图片。

    另外还可以通过Camera对象的getParameters()函数得到一个android.hardware.Camera.Parameters对象,Parameters提供了一些接口来设置Camera的属性:

    • setPictureFormat(int pixel_format):设置图片的格式,其取值为PixelFormat.YCbCr_420_SP、PixelFormat.RGB_565或则PixelFormat.JPEG。
    • setPreviewFormat(int pixel_format):设置图片预览的格式,取值同上。
    • setPictureSize(int width, int height):设置图片的高度和宽度,单位为像素。
    • setPreviewSize(int width, int height):设置图片预览的高度和宽度,取值同上。
    • setPreviewFrameRate(int fps):设置图片预览的帧速。

    在设置好Camera的参数后,可以通过函数voidstartPreview()开始预览图像、void stopPreview()结束预览,通过autoFocus(AutoFocusCallbackcb)来自动对焦,最后可以通过takePicture(ShutterCallback shutter,PictureCallback raw, PictureCallback jpeg)函数来拍照。该函数有三个参数,分别为快门回调接口、原生图像数据接口和压缩格式图片数据接口。如果数据格式不存在的话数据流为空,如果不需要实现这些接口则这些参数取值可以为null。

    以上就是关于Camera的基础知识和相关的API介绍,下面来具体看看如何在程序中拍照并使用照片。

    示例代码

    import java.io.File;  

    import java.io.FileOutputStream;    

    import android.app.Activity;  

    import android.content.Context;  

    import android.graphics.Bitmap;  

    import android.graphics.BitmapFactory;  

    import android.graphics.PixelFormat;  

    import android.graphics.Bitmap.CompressFormat;  

    import android.hardware.Camera;  

    import android.os.Bundle;  

    import android.os.Environment;  

    import android.util.Log;  

    import android.view.Display;  

    import android.view.KeyEvent;  

    import android.view.SurfaceHolder;  

    import android.view.SurfaceView;  

    import android.view.Window;  

    import android.view.WindowManager;  

      

    public class MyCamera extends Activity{  

        private SurfaceView surfaceView;  

        Camera camera;  

        boolean preview=false;  

        private static final String TAG = "camera";  

        public void onCreate(Bundle savedInstanceState){  

            super.onCreate(savedInstanceState);  

            Window window=getWindow();  

    //      设置没有title   

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

            surfaceView=(SurfaceView)this.findViewById(R.id.surfaceView);  

            surfaceView.getHolder().addCallback(new SufaceListener());  

            //下面设置surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前  

            surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  

            surfaceView.getHolder().setFixedSize(176,144);//设置分辨率   

        }  

        private final class SufaceListener implements SurfaceHolder.Callback{  

              

              

            public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){  

                  

            }  

          

            public void surfaceCreated(SurfaceHolder holder){  

                try{  

                    camera=Camera.open();  

                    Camera.Parameters parameters=camera.getParameters();  

                    WindowManager wm=(WindowManager)getSystemService(Context.WINDOW_SERVICE);  

                    Display display=wm.getDefaultDisplay();  

                    parameters.setPreviewSize(display.getWidth(),display.getHeight());  

                    //每秒3   

                    parameters.setPreviewFrameRate(3);  

                    parameters.setPreviewFormat(PixelFormat.JPEG);  

                    parameters.set("jpeg-quality", 85);  

                    parameters.setPictureSize(display.getWidth(), display.getHeight());  

                    camera.setParameters(parameters);  

                    camera.setPreviewDisplay(surfaceView.getHolder());//显示取景画面   

                    camera.startPreview();  

                    preview=true;  

                }  

                catch(Exception e){  

                    Log.e(TAG,e.toString());  

                      

                }  

            }  

            public void surfaceDestroyed(SurfaceHolder holder){  

                if(camera!=null){  

                    if(preview)  

                        camera.stopPreview();  

                    camera.release();  

                    camera=null;  

                }  

            }  

          

              

        }  

        public boolean onKeyDown(int keyCode,KeyEvent event){  

            if(camera!=null&&event.getRepeatCount()==0){  

                switch(keyCode){  

                case KeyEvent.KEYCODE_SEARCH:  

                    camera.autoFocus(null);//自动对焦   

                    break;  

                case KeyEvent.KEYCODE_DPAD_CENTER: ;  

                case  KeyEvent.KEYCODE_CAMERA:  

                    camera.takePicture(null,null, new PictureCallbackListener());  

                    break;  

                }  

            }  

            return true;  

        }  

        public final class PictureCallbackListener implements Camera.PictureCallback{  

            public void onPictureTaken(byte[] data,Camera canera){  

                try{  

                    Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);  

                    File file=new File(Environment.getExternalStorageDirectory(),"ljh.jpg");  

                    FileOutputStream outStream=new FileOutputStream(file);  

                    bitmap.compress(CompressFormat.JPEG, 100,outStream);  

                    outStream.close();  

                    //  

                    camera.stopPreview();  

                    camera.startPreview();  

                    preview=true;  

                }  

                catch(Exception e){  

                    Log.e(TAG,e.toString());  

                }  

            }  

        }  

    }  

     

    五,闹钟设置

    Android中,通过AlarmManager类来实现闹钟的。

    常用方法 :

    void   cancel(PendingIntent operation)  

    解释: 取消已经注册的与参数匹配的闹铃

    void   set(int type, long triggerAtTime, PendingIntent operation)  

     解释:注册一个新的闹铃 

    void   setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)  

    解释:注册一个重复类型的闹铃

    void   setTimeZone(String timeZone) 

     解释:设置时区 

    示例代码

    1java代码:AlamrReceiver 

    package com.Aina.Android;  

     

    import android.content.BroadcastReceiver;  

    import android.content.Context;  

    import android.content.Intent;  

    import android.widget.Toast;  

      

    public class AlamrReceiver extends BroadcastReceiver {   

        @Override  

        public void onReceive(Context context, Intent intent) {  

            // TODO Auto-generated method stub  

           Toast.makeText(context, "闹钟时间到", Toast.LENGTH_LONG).show();  

        }  

    }  

     

    2java代码:Test

    package com.Aina.Android;  

      

    import java.util.Calendar;   

    import android.app.Activity;  

    import android.app.AlarmManager;  

    import android.app.PendingIntent;  

    import android.app.TimePickerDialog;  

    import android.content.Intent;  

    import android.os.Bundle;  

    import android.view.View;  

    import android.widget.Button;  

    import android.widget.TextView;  

    import android.widget.TimePicker;  

      

    public class Test extends Activity {  

        /** Called when the activity is first created. */  

        private TextView tv = null;  

        private Button btn_set = null;  

        private Button btn_cel = null;  

        private Calendar c = null;  

        @Override  

        public void onCreate(Bundle savedInstanceState) {  

            super.onCreate(savedInstanceState);  

            setContentView(R.layout.main);  

            tv = (TextView) this.findViewById(R.id.TextView);  

            btn_set = (Button) this.findViewById(R.id.Button01);  

            btn_cel = (Button) this.findViewById(R.id.Button02);  

            c = Calendar.getInstance();  

            btn_set.setOnClickListener(new Button.OnClickListener(){  

      

                public void onClick(View v) {  

                    // TODO Auto-generated method stub  

                    c.setTimeInMillis(System.currentTimeMillis());  

                    int hour = c.get(Calendar.HOUR_OF_DAY);  

                    int minute = c.get(Calendar.MINUTE);  

                    new TimePickerDialog(Test.this,new TimePickerDialog.OnTimeSetListener(){  

      

                        public void onTimeSet(TimePicker view, int hourOfDay,  

                                int minute) {  

                            // TODO Auto-generated method stub  

                            c.setTimeInMillis(System.currentTimeMillis());  

                            c.set(Calendar.HOUR_OF_DAY, hourOfDay);  

                            c.set(Calendar.MINUTE, minute);  

                            c.set(Calendar.SECOND, 0);  

                            c.set(Calendar.MILLISECOND, 0);  

                            Intent intent = new Intent(Test.this,AlamrReceiver.class);  

                            PendingIntent pi = PendingIntent.getBroadcast(Test.this, 0, intent, 0);  

                            AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);  

                            am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);//设置闹钟   

                            am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), (10*1000), pi);//重复设置   

                            tv.setText("设置的闹钟时间为:"+hourOfDay+":"+minute);  

                        }  

                          

                    },hour,minute,true).show();  

                }  

                  

            });  

            btn_cel.setOnClickListener(new Button.OnClickListener(){  

      

                public void onClick(View v) {  

                    // TODO Auto-generated method stub  

                    Intent intent = new Intent(Test.this,AlamrReceiver.class);  

                    PendingIntent pi = PendingIntent.getBroadcast(Test.this, 0, intent, 0);  

                    AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);  

                    am.cancel(pi);  

                    tv.setText("闹钟取消");   

                }  

                  

            });  

        }  

    }  

     

    3,布局文件

    <?xml version="1.0" encoding="utf-8"?>  

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

        android:orientation="vertical" android:layout_width="fill_parent"  

        android:layout_height="fill_parent">  

        <TextView android:layout_width="fill_parent"  

            android:id="@+id/TextView"  

            android:layout_height="wrap_content" android:text="@string/hello" />  

        <Button android:text="设置闹钟" android:id="@+id/Button01"  

            android:layout_width="wrap_content"  

            android:layout_height="wrap_content">  

        </Button>  

        <Button android:text="取消闹钟" android:id="@+id/Button02"  

            android:layout_width="wrap_content"  

            android:layout_height="wrap_content">  

        </Button>  

    </LinearLayout>  

     

    4,清单文件

    <?xml version="1.0" encoding="utf-8"?>  

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  

          package="com.Aina.Android"  

          android:versionCode="1"  

          android:versionName="1.0">  

        <application android:icon="@drawable/icon" android:label="@string/app_name">  

            <activity android:name=".Test"  

                      android:label="@string/app_name">  

                <intent-filter>  

                    <action android:name="android.intent.action.MAIN" />  

                    <category android:name="android.intent.category.LAUNCHER" />  

                </intent-filter>  

            </activity>  

            <receiver android:name=".AlamrReceiver" android:process=":remote"></receiver>  

        </application>  

      

    </manifest>   

     

    六,铃声设置

    Android提供了RingtoneManager类来专门操作各种铃声。

    常用方法:

    getActualDefaultRingtoneUri(Context context, int type)

    解释:取得当前默认钤声的Uri

    getCursor()

    解释:返回所有可用钤声的游标

    getDefaultType(Uri defaultRingtoneUri)

    解释:得到指定Uri的默认铃声类型

    getDefaultUri(int type)

    解释:得到指定铃声类型的默认Uri

    setActualDefaultRingtoneUri(Context context, int type, Uri ringtoneUri)

    解释:设置默认铃声

     

    示例代码:

    1,  布局文件

    < ?xmlversion="1.0" encoding="utf-8"?>

    <linearlayoutxmlns:android="http://schemas.android.com/apk/res/android"

        android:orientation="vertical"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        >

        <textviewandroid:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:text="@string/hello"

            />

        <buttonandroid:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:text="@string/btn1"

            android:id="@+id/btn1"

            />

        <buttonandroid:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:text="@string/btn2"

            android:id="@+id/btn2"

            />

        <buttonandroid:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:text="@string/btn3"

            android:id="@+id/btn3"

            />

    </linearlayout>

    2,  java代码

    packagenet.androidla.ringtonemanager;

      

    import java.io.File;

    importandroid.app.Activity;

    importandroid.content.Intent;

    importandroid.media.RingtoneManager;

    import android.net.Uri;

    importandroid.os.Bundle;

    importandroid.os.Environment;

    importandroid.view.View;

    importandroid.view.View.OnClickListener;

    importandroid.widget.Button;

      

    public classRingtoneManagerActivity extends Activity {

        privateButton btn1 = null;

        privateButton btn2 = null;

        privateButton btn3 = null;

        privatestatic final int ringtone = 0;

        privatestatic final int alarm = 1;

        privatestatic final int notification =2;

        privatestatic final String fileRingtone = Environment.getExternalStorageDirectory() +"/music/ringtones";

        privatestatic final String fileAlarm = Environment.getExternalStorageDirectory() +"/music/alarms";

        privatestatic final String fileNotification =Environment.getExternalStorageDirectory() + "/music/notifications";

      

        @Override

        publicvoid onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

            btn1= (Button) findViewById(R.id.btn1);

            btn1.setOnClickListener(onClickListener);

            btn2= (Button) findViewById(R.id.btn2);

            btn2.setOnClickListener(onClickListener);

            btn3= (Button) findViewById(R.id.btn3);

            btn3.setOnClickListener(onClickListener);

        }

      

        privateOnClickListener onClickListener = new OnClickListener() {

            @Override

            publicvoid onClick(View v) {

                Buttonbtn = (Button) v;

                switch(btn.getId()) {

                caseR.id.btn1:

                    if(isFile(fileRingtone)) {

                        Intentintent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);

                        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_RINGTONE);

                        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,R.string.btn1);

                        startActivityForResult(intent,ringtone);

                    }

                    break;

                caseR.id.btn2:

                    if(isFile(fileAlarm)) {

                        Intentintent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);

                        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_ALARM);

                        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,R.string.btn2);

                        startActivityForResult(intent,alarm);

                    }

                    break;

                caseR.id.btn3:

                    if(isFile(fileNotification)) {

                        Intentintent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);

                        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);

                        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,R.string.btn3);

                        startActivityForResult(intent,notification);

                    }

                    break;

                }

            }

        };

      

        @Override

        protectedvoid onActivityResult(int requestCode, int resultCode, Intent data) {

            super.onActivityResult(requestCode,resultCode, data);

            if(resultCode != RESULT_OK) {

                return;

            }else {

                Uriuri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);

                if(uri != null) {

                    switch(requestCode) {

                    caseringtone:

                        RingtoneManager.setActualDefaultRingtoneUri(this,RingtoneManager.TYPE_RINGTONE, uri);

                        break;

                    casealarm:

                        RingtoneManager.setActualDefaultRingtoneUri(this,RingtoneManager.TYPE_ALARM, uri);

                        break;

                    casenotification:

                        RingtoneManager.setActualDefaultRingtoneUri(this,RingtoneManager.TYPE_NOTIFICATION, uri);

                        break;

                    }

                }

            }

        }

      

        privateboolean isFile(String path) {

            booleanflag = false;

            Filef = new File(path);

            if(f.exists()) {

                flag= true;

            }else {

                if(f.mkdirs()) {

                    flag= true;

                }else {

                    flag= false;

                }

            }

            returnflag;

        }

    }

     

    3,  AndroidManifest.xml中注册相关权限

    < ?xmlversion="1.0" encoding="utf-8"?>

    <manifestxmlns:android="http://schemas.android.com/apk/res/android"

          package="net.androidla.ringtonemanager"

          android:versionCode="1"

          android:versionName="1.0">

        <uses-sdk android:minSdkVersion="10" />

        <!--访问网络权限 -->

        <uses-permission android:name="android.permission.INTERNET" />

        <!--SDCard写入数据权限 -->

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

        <!--SDCard上创建删除文件目录权限 -->

        <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

        <!--SDCard上写入系统配置的权限 -->

        <uses-permission android:name="android.permission.WRITE_SETTINGS" />

        <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">

            <activityandroid:name=".RingtoneManagerActivity"

                      android:label="@string/app_name">

                <intent-filter>

                    <actionandroid:name="android.intent.action.MAIN" />

                    <categoryandroid:name="android.intent.category.LAUNCHER" />

                </intent>

            </activity>

      

        </application>

    </manifest>

     本文来自上海Android培训官方网站,感谢上海it培训机构推荐。

    展开全文
  • ● 可以利用麦克风和摄像机一类的设备截取音频和视频,并保存成多媒体文件。 ● 处理多媒体文件,转换文件格式。 ● 向互联网上传音频和视频数据流。 ● 在互联网上广播音频和视频数据。 JMF的结构 为了更好地...
  • 什么是HTTP协议

    2019-02-18 10:35:00
    什么是Http协议Http协议即超文本传送协议 ...从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。并且详细的...

    什么是Http协议
    Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) 。它定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。并且详细的规定了客户端浏览器与服务器之间互相通信的规则。

    客户端与服务器端在Http协议下的交互过程如图:

     

    这些通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。如下:

    l  客户端发送给服务器的”信”,我们称之为”请求协议”。

    l  服务器端发送给浏览器的”信”,我们称之为”响应协议”。

    注意:使用HttpWatch抓包工具可以抓取HTTP协议的内容。

     

    HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

    主要特点

    1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
    5、支持B/S及C/S模式。

    HTTP之URL

    HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

    URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:

    http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

    从上面的URL可以看出,一个完整的URL包括以下几部分:
    1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

    2.域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

    3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

    4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

    5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

    6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

    7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

    (原文:http://blog.csdn.net/ergouge/article/details/8185219

    URI和URL的区别

    URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。

    Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
    URI一般由三部组成:
    ①访问资源的命名机制
    ②存放资源的主机名
    ③资源自身的名称,由路径表示,着重强调于资源。

    URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。

    URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
    采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
    ①协议(或称为服务方式)
    ②存有该资源的主机IP地址(有时也包括端口号)
    ③主机资源的具体地址。如目录和文件名等

    URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com

    URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。

    在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。
    在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。
    相反的是,URL类可以打开一个到达资源的流。

    HTTP之请求消息Request

    客户端发送一个HTTP请求到服务器的请求消息包括以下格式:

    请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

    <br />


     
    Http请求消息结构.png
    • 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。
    Get请求例子,使用Charles抓取的request:
    GET /562f25980001b1b106000338.jpg HTTP/1.1
    Host    img.mukewang.com
    User-Agent  Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
    Accept  image/webp,image/*,*/*;q=0.8
    Referer http://www.imooc.com/
    Accept-Encoding gzip, deflate, sdch
    Accept-Language zh-CN,zh;q=0.8
    
    
    第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.

    GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

    第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

    从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等

    第三部分:空行,请求头部后面的空行是必须的

    即使第四部分的请求数据为空,也必须有空行。

    第四部分:请求数据也叫主体,可以添加任意的其他数据。

    这个例子的请求数据为空。

    POST请求例子,使用Charles抓取的request:
    POST / HTTP1.1
    Host:www.wrox.com
    User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
    Content-Type:application/x-www-form-urlencoded
    Content-Length:40
    Connection: Keep-Alive
    
    name=Professional%20Ajax&publisher=Wiley
    

    第一部分:请求行,第一行明了是post请求,以及http1.1版本。
    第二部分:请求头部,第二行至第六行。
    第三部分:空行,第七行的空行。
    第四部分:请求数据,第八行。

    HTTP之响应消息Response

    一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

    HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

    <br />

     
    http响应消息格式.jpg

    例子

    HTTP/1.1 200 OK
    Date: Fri, 22 May 2009 06:07:21 GMT
    Content-Type: text/html; charset=UTF-8
    
    <html>
          <head></head>
          <body>
                <!--body goes here-->
          </body>
    </html>
    
    第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

    第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

    第二部分:消息报头,用来说明客户端要使用的一些附加信息

    第二行和第三行为消息报头,
    Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

    第三部分:空行,消息报头后面的空行是必须的
    第四部分:响应正文,服务器返回给客户端的文本信息。

    空行后面的html部分为响应正文。

    HTTP之状态码

    状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求

    常见状态码:

    200 OK                        //客户端请求成功
    400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
    403 Forbidden                 //服务器收到请求,但是拒绝提供服务
    404 Not Found                 //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error     //服务器发生不可预期的错误
    503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
    

    更多状态码http://www.runoob.com/http/http-status-codes.html

    HTTP请求方法

    根据HTTP标准,HTTP请求可以使用多种请求方法。
    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
    HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

    GET  请求指定的页面信息,并返回实体主体。
    HEAD     类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
    POST     向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
    PUT  从客户端向服务器传送的数据取代指定的文档的内容。
    DELETE   请求服务器删除指定的页面。
    CONNECT  HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
    OPTIONS  允许客户端查看服务器的性能。
    TRACE    回显服务器收到的请求,主要用于测试或诊断。
    

    HTTP工作原理

    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

    以下是 HTTP 请求/响应的步骤:

    1、客户端连接到Web服务器

    一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn

    2、发送HTTP请求

    通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

    3、服务器接受请求并返回HTTP响应

    Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

    4、释放连接TCP连接

    若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

    5、客户端浏览器解析HTML内容

    客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

    例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

    1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

    2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

    3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

    4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

    5、释放 TCP连接;

    6、浏览器将该 html 文本并显示内容;

    GET和POST请求的区别

    GET请求
    GET /books/?sex=man&name=Professional HTTP/1.1
    Host: www.wrox.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
    Gecko/20050225 Firefox/1.0.1
    Connection: Keep-Alive
    
    

    注意最后一行是空行

    POST请求
    POST / HTTP/1.1
    Host: www.wrox.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
    Gecko/20050225 Firefox/1.0.1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 40
    Connection: Keep-Alive
    
    name=Professional%20Ajax&publisher=Wiley
    

    1、GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

    POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据

    因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

    2、传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。

    而在实际开发中存在的限制主要有:

    GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系 统的支持。

    因此对于GET提交时,传输数据就会受到URL长度的 限制。

    POST:由于不是通过URL传值,理论上数据不受 限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

    3、安全性

    POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击

    4、Http get,post,soap协议都是在http上运行的

    (1)get:请求参数是作为一个key/value对的序列(查询字符串)附加到URL上的
    查询字符串的长度受到web浏览器和web服务器的限制(如IE最多支持2048个字符),不适合传输大型数据集同时,它很不安全

    (2)post:请求参数是在http标题的一个不同部分(名为entity body)传输的,这一部分用来传输表单信息,因此必须将Content-type设置为:application/x-www-form- urlencoded。post设计用来支持web窗体上的用户字段,其参数也是作为key/value对传输。
    但是:它不支持复杂数据类型,因为post没有定义传输数据结构的语义和规则。

    (3)soap:是http post的一个专用版本,遵循一种特殊的xml消息格式
    Content-type设置为: text/xml 任何数据都可以xml化。

    Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

    我们看看GET和POST的区别

    1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.

    2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

    3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

    4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

    转载于:https://www.cnblogs.com/hello-web/p/10394210.html

    展开全文
  • 什么是Http协议

    2017-02-26 16:58:47
    什么是Http协议 ...它定义了浏览器(即万维网客户进程)...从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。并且详
  • HTTP协议是什么

    2021-02-23 13:27:17
    从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。并且详细的规定了客户端浏览器与服务器之间互相通信的规则。 ...
  • 根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件什么,而是关心如何去处理它。但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的...
  • ubuntu默认有一个movie player,但是那个基本上播放不了什么东东,每次打开多媒体文件总是说寻找什么解码器,找了半天也安装了就是没用。所以还是搞了别的播放器吧。ubuntu下有很多播放器,但是这里我只推荐两个我...
  • 什么是办公信息

    2008-11-15 11:24:55
    电子文件柜,电子会议和通信等。办公设备一般包括计算机(硬件、软件)、通信、文字处理和印刷等设备,计算机是核心。...据发展到包括文本、语音、图形、图像、动画、视频等的多媒体数据。 1) 办公信息系统的目...
  • 他使我们使用一种语言就可以开发出基于各种平台的游戏,包括手机游戏(iPhone、Android、Windows Phone)、PC(Windows、Mac、Linux)、网页游戏(基于各种主流浏览器)、游戏机专用游戏(Wii、Xbox360、PS3) ...
  • 答:因为多媒体技术所处理的对象包括图像、视频和声音等多种媒体。它们的数据量非常大。 如果不进行数据压缩传输和存储都难以实用化。而经过数据压缩可以将一些占用内存比较大多媒体数据, 压缩成可以缩小的文件内存...
  • ffmpeg解码基础

    2015-02-13 23:23:53
    目前几乎所有的主流多媒体播放器都是基于开源多媒体框架ffmpeg来做的,可见ffmpeg的强大。...我们知道在一个多媒体文件中,既包括音频也包括视频,而且音频和视频都是分开进行压缩的,因为音频和视频
  • Android--音乐播放器

    2016-05-23 13:34:27
    1、什么是Open Core? Open Core是Android多媒体框架的核心,所有 Android平台的音频、视频的...1、多媒体文件的播放、下载,包括:3GPP,MPEG-4,AAC 和 MP3 containers。 2、流媒体文件的下载、实时播放,包括:3G...
  • 流媒体的基本介绍

    2020-05-17 10:42:03
    流媒体就是指采用流式传输技术在网络上连续实时播放的媒体格式,如音频、视频或多媒体文件。 音视频就是流媒体的核心。 音视频组成 一个完整的视频文件,包括音频、视频和基础元信息。 我们常见的视频文件如mp4、mov...
  • HTTP_Web服务器基础原理详解

    千次阅读 2018-03-25 11:52:14
    什么是http协议 超文本传送协议 ...从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。 什么是HTTP的...
  • IOS持久存储

    2020-03-19 11:06:05
    什么是数据持久化存储? 所谓的持久化,就是将数据保存..."应用程序包":这里面存放的是应用程序的源文件,包括资源文件和可执行文件(比如多媒体文件)。 Documents:最常用的目录,适合存储重要数据。 Caches:适合存...
  • iOS的四种持久化存储

    2016-09-08 20:30:00
    什么是数据持久化存储?  所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或... "应用程序包":这里面存放的是应用程序的源文件,包括资源文件和可执行文件(比如多媒体文件)。NSString*path=[[NSBundlemain...
  • 1.1. 什么是Open Core? Open Core 是 Android 多媒体框架的核心,...1、多媒体文件的播放、下载,包括:3GPP,MPEG-4,AAC 和 MP3 containers。 2、流媒体文件的下载、实时播放,包括:3GPP,HTTP 和 RT
  • SMIL

    2009-04-30 23:05:00
    它也是一种标记语言,用来描述一个多媒体的作品:规定多媒体片断(包括声音文件、视频文件、动画、图片、文字等)在什么时候、在什么地方、以什么样的方式播放。 完成的作品称之为演示(presentation)。 之前,我们...
  • 超文本传送协议HTTP

    2019-04-21 15:22:02
    HTTP是面向事务的应用层协议,是万维网上能够可靠地交换文件(包括文本,声音,图像等各种多媒体文件)的重要基础; 2.HTTP报文种类以及结构 请求报文-------从客户向服务器发送请求报文 请求行包括方法,URL...
  • 1.什么是http协议超文本传送协议 ...从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。2.什么是HTTP的事务
  • http

    2016-08-02 15:45:22
    一、什么是Http协议 定义  超文本传输协议(HTTP,HyperText...从 层次的角度看,Http是面向(transaction-oriented)应用层协议,它是万维网能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础
  • Android 音乐播放器

    2011-06-16 13:45:00
    1、什么是Open Core?Open Core 是 Android 多媒体框架的核心,所有 Android 平台的音频、视频的采用以及播放等操作,都... 2、Open Core 的具体功能1、多媒体文件的播放、下载,包括:3GPP,MPEG-4,AAC 和 MP3 cont
  • 1 Http基础详解1~3

    2016-03-27 15:05:00
    1-1什么是Http协议?  超文本传送协议...从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。   ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 135
精华内容 54
关键字:

多媒体文件包括什么文件