当前位置: 首页 > news >正文

第9章 丰富你的程序,运用手机多媒体

丰富你的 Android 程序:全面掌握手机多媒体功能开发

在移动应用开发中,多媒体能力是提升用户体验的关键要素。无论是发送一条及时的通知、拍摄一张精彩的照片,还是播放一段动人的音乐或视频,这些功能都让我们的 App 更加生动、实用。

本文将结合《第一行代码》第 9 章的核心知识点与一个完整的实战项目Demo09,深入剖析 Android 中四大核心多媒体功能的实现原理与最佳实践:

  • 通知(Notification)
  • 调用摄像头拍照
  • 从相册选择图片/视频
  • 播放音频与视频

💡项目目标:打造一个集多功能于一体的演示 App,用户可通过按钮一键触发各类多媒体操作,并实时预览结果。


一、通知(Notification):让用户不错过任何重要信息

1.1 为什么需要通知?

当 App 在后台运行时,如何向用户传递信息?答案就是通知。它能在状态栏显示图标,下拉后展示详细内容,并支持点击跳转,是 Android 系统最特色的交互方式之一。

1.2 通知渠道(Android 8.0+)

从 Android 8.0(API 26)开始,所有通知必须归属于一个“通知渠道”。这是 Google 为提升用户体验、赋予用户更多控制权而引入的重要机制。

✅ 核心概念
  • 渠道 ID:唯一标识符(如"default_channel"
  • 渠道名称:用户可见的描述(如"默认通知渠道"
  • 重要等级:决定是否响铃、振动等行为(IMPORTANCE_DEFAULT,IMPORTANCE_HIGH等)

⚠️重要限制:通知渠道一旦创建,其名称和重要性无法修改!因此需提前规划好通知类型。

🔧 实现代码(NotificationUtil.kt
privatefuncreateNotificationChannel(){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){valchannel=NotificationChannel(CHANNEL_ID,"默认通知渠道",NotificationManager.IMPORTANCE_DEFAULT).apply{description="用于发送应用通知"}valmanager=context.getSystemService(Context.NOTIFICATION_SERVICE)asNotificationManager manager.createNotificationChannel(channel)}}

1.3 发送通知 & 权限适配

📱 Android 13(API 33)新变化
  • 新增POST_NOTIFICATIONS运行时权限;
  • 用户可在设置中随时关闭通知。
🔐 权限检查与请求(MainActivity.kt
privatefuncheckNotificationPermission():Boolean{returnif(Build.VERSION.SDK_INT>=Build.VERSION_CODES.TIRAMISU){ContextCompat.checkSelfPermission(this,Manifest.permission.POST_NOTIFICATIONS)==PackageManager.PERMISSION_GRANTED}else{true// Android 13 以下无需运行时权限}}privatefunrequestNotificationPermission(){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.TIRAMISU){ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.POST_NOTIFICATIONS),REQUEST_NOTIFICATION_PERMISSION)}}
📬 构建并发送通知
valbuilder=NotificationCompat.Builder(context,CHANNEL_ID).setSmallIcon(android.R.drawable.ic_dialog_info).setContentTitle("通知标题").setContentText("这是一条来自应用的通知内容").setContentIntent(pendingIntent)// 点击跳转.setAutoCancel(true)// 点击后自动消失NotificationManagerCompat.from(context).notify(NOTIFICATION_ID,builder.build())

效果演示


二、调用摄像头和相册:捕捉与选择精彩瞬间

2.1 调用系统相机拍照

不建议直接操作 Camera API!而是通过Intent启动系统相机,安全且兼容性好。

📸 关键步骤
  1. 检查相机权限(CAMERA);
  2. 创建Intent(MediaStore.ACTION_IMAGE_CAPTURE)
  3. 处理返回的缩略图(data.extras["data"])。

⚠️ 注意:此方式仅返回小尺寸缩略图。若需原图,需指定输出 URI(涉及FileProvider,见 PPT 内容)。

🖼️ 代码实现
privatefunopenCamera(){Intent(MediaStore.ACTION_IMAGE_CAPTURE).also{pictureIntent->if(pictureIntent.resolveActivity(packageManager)!=null){startActivityForResult(pictureIntent,REQUEST_IMAGE_CAPTURE)}}}overridefunonActivityResult(...){when(requestCode){REQUEST_IMAGE_CAPTURE->{valimageBitmap=data?.extras?.get("data")asBitmap?imagePreview.setImageBitmap(imageBitmap)// 显示缩略图}}}

2.2 从相册选择图片/视频

使用Intent.ACTION_PICK+ MIME 类型,让用户从系统图库中选择。

🗂️ 选择图片
valintent=Intent(Intent.ACTION_PICK).apply{type="image/*" } startActivityForResult(intent, REQUEST_SELECT_IMAGE)
🎥 选择视频
valintent=Intent(Intent.ACTION_PICK).apply{type="video/*" } startActivityForResult(intent, REQUEST_SELECT_VIDEO)

2.3 权限管理(Android 13 适配)

Android 版本权限
< 13READ_EXTERNAL_STORAGE
≥ 13READ_MEDIA_IMAGES+READ_MEDIA_VIDEO
🔍 权限检查逻辑
privatefuncheckReadMediaPermission():Boolean{returnif(Build.VERSION.SDK_INT>=Build.VERSION_CODES.TIRAMISU){ContextCompat.checkSelfPermission(this,Manifest.permission.READ_MEDIA_IMAGES)==PackageManager.PERMISSION_GRANTED&&ContextCompat.checkSelfPermission(this,Manifest.permission.READ_MEDIA_VIDEO)==PackageManager.PERMISSION_GRANTED}else{ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE)==PackageManager.PERMISSION_GRANTED}}

效果演示


三、播放多媒体文件:打造简易音视频播放器

3.1 播放音频:MediaPlayer

MediaPlayer是 Android 播放音频的核心类,支持本地、网络、资源文件等多种来源。

🎵 基础用法(示例)
// 通常从 assets 或 raw 加载valfd=assets.openFd("music.mp3")mediaPlayer.setDataSource(fd.fileDescriptor,fd.startOffset,fd.length)mediaPlayer.prepare()mediaPlayer.start()

💡注意:你的Demo09playAudioSample()仅为示意。实际项目中应加载真实音频文件。

3.2 播放视频:VideoView

VideoView封装了MediaPlayerSurfaceView,提供开箱即用的视频播放能力。

▶️ 播放流程
privatefunplayVideo(uri:Uri){videoView.visibility=View.VISIBLE videoView.setVideoURI(uri)// 设置视频源videoView.start()videoView.setOnCompletionListener{Toast.makeText(this,"播放完成",Toast.LENGTH_SHORT).show()}videoView.setOnErrorListener{_,what,_->Toast.makeText(this,"播放错误:$what",Toast.LENGTH_LONG).show()false}}

优势:无需手动管理 Surface、解码器等底层细节。


四、完整项目架构与权限声明

4.1 Manifest 权限配置

<!-- 相机 --><uses-permissionandroid:name="android.permission.CAMERA"/><!-- 存储(兼容旧版) --><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><!-- Android 13+ 媒体权限 --><uses-permissionandroid:name="android.permission.READ_MEDIA_IMAGES"/><uses-permissionandroid:name="android.permission.READ_MEDIA_VIDEO"/><!-- 通知 --><uses-permissionandroid:name="android.permission.POST_NOTIFICATIONS"/><uses-featureandroid:name="android.hardware.camera"android:required="true"/>

4.2 UI 布局设计

采用ScrollView + LinearLayout,包含:

  • 5 个功能按钮(通知、相机、相册、音频、视频)
  • ImageView预览图片
  • VideoView播放视频
<ImageViewandroid:id="@+id/imagePreview"...android:visibility="gone"/><VideoViewandroid:id="@+id/videoView"...android:visibility="gone"/>

通过动态切换visibility实现内容展示。


五、总结与最佳实践

功能关键技术点注意事项
通知NotificationChannel,NotificationCompatAndroid 8.0+ 必须创建渠道;Android 13+ 需要运行时权限
拍照MediaStore.ACTION_IMAGE_CAPTURE返回的是缩略图;获取原图需用FileProvider(见 PPT)
选图/视频Intent.ACTION_PICK+ MIME 类型注意 Android 13 的分区存储权限变更
音频播放MediaPlayer需管理生命周期(prepare/start/pause/release)
视频播放VideoView自动处理 Surface,适合简单场景

🚀进阶建议

  • 图片/视频选择可升级为ActivityResultContracts.GetContent()(推荐);
  • 音频播放可集成ExoPlayer(Google 官方媒体播放库);
  • 通知可扩展为富媒体通知(大图、长文本、自定义布局)。

结语

通过本项目,我们不仅掌握了 Android 多媒体开发的核心 API,还深入理解了权限适配(尤其是 Android 13)、组件间通信(Intent)、生命周期管理等关键概念。

正如《第一行代码》所强调的:“丰富的多媒体功能是现代 App 的标配”。希望本文能助你打造出更强大、更友好的 Android 应用!

📚推荐阅读

  1. 《第一行代码 —— Android》第 9 章
  2. Android 官方文档 - Notifications
  3. Android 权限最佳实践

(全文完)

http://www.jsqmd.com/news/438027/

相关文章:

  • 2026桔多多借贷靠谱吗?从合规服务看用户体验 - 品牌排行榜
  • 第10章 后台默默的劳动者,探究Service
  • 桔多多是干嘛的?为23-50岁用户提供消费服务平台 - 品牌排行榜
  • 桔多多逾期怎么还款?2026年实用还款流程指引 - 品牌排行榜
  • 【信息科学与工程学】【管理科学】第二十五篇 企业高管运作模型框架02
  • 莫名奇妙的nginx请求偶发400
  • Android 多进程开发 - 服务端死亡回调、服务端与客户端的线程环境、oneway 关键字
  • 手把手教你本地部署ChatGLM-6B大模型,告别环境配置烦恼!保姆级教程速看!
  • 意义哲学与空
  • Vue - Vue2 与 Vue3 自定义插件
  • Qwen3.5重磅登场!阿里开源“原生多模态”AI核弹,能否引爆2026技术革命?
  • Win系统下Ollama大模型安装与Chatbox部署全攻略,手把手教你玩转AI!
  • 一台电脑控制N台手机实现投屏群控操作,搭建引流工作室必备技能
  • 2026桔多多平台怎么样?服务体验与使用指南详解 - 品牌排行榜
  • PicoServer 跨平台 Web 架构实战系列 (一) MAUI 中嵌入 PicoServer 入门
  • 2026马赛克瓷砖品牌排行有哪些?实力品牌推荐 - 品牌排行榜
  • 2026年马赛克瓷砖厨房用哪种好?推荐品牌参考 - 品牌排行榜
  • tiktok 网页端算法分析
  • 2026年机票比价后在哪个渠道下单更有保障? - 品牌排行榜
  • 2026马赛克瓷砖十大品牌推荐:品质与设计的匠心之选 - 品牌排行榜
  • 2026哪个平台买机票便宜?实用购票攻略及平台推荐 - 品牌排行榜
  • 2026哪个平台有特价机票?实用功能助你轻松省钱 - 品牌排行榜
  • 2026哪个平台有直飞优惠?高性价比出行选择参考 - 品牌排行榜
  • 2026年做澄清过滤的靠谱公司有哪些 - 品牌排行榜
  • Jamf Cloud证书配置全解析
  • 100个AI术语表:从核心概念到前沿技术,这份指南助你快速上手大模型时代!
  • 2026年AI大模型常问的问题以及答案,最新的面试大厂题!
  • 基于Django的大语言模型服务端实现与实战应用
  • 26年大模型面试必问八股文,背完通过率98%,看我如何吊打面试官
  • 告别幻觉与黑箱!LOM本体大模型如何引领企业决策智能化革命?