第八章 - 运用手机多媒体
使用通知
创建通知渠道
每条通知对应一个通知渠道。
创建通知渠道的步骤:
使用NotificationManager对通知进行管理
getSystemService():接收一个字符串参数用于确定获取系统的哪个服务。NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
使用NotificationChannel类构建一个通知渠道,并调用NotificationMananger的createNotificationChannel()方法完成创建
创建通知的步骤:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){String channelId = "First";String channelName = "通知消息";int importance = NotificationManager.IMPORTANCE_HIGH;NotificationChannel channel = new NotificationChannel(channelId,channelName,importance);manager.createNotificationChannel(channel);}
通知的基本用法
- 使用Builder构造器创建Notificaition对象。(为了保证系统版本的兼容性,通过NotificationCompat类进行创建)
- 在build方法前连缀任意的设置方法。
- 调用NotificationManager的notify()方法让通知显示出来。
- notify()方法接收两个参数,参数1是一改id,参数2是Notification对象。
- 设置PendingIntent,让通知可以被点击。
- 创建一个intent。
- 调用PendingIntent的方法把intent传入生成一个PendingIntent对象。
- 调用setContentIntent设置方法。
demo:
package com.example.myapplication;import android.app.NotificationChannel;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.graphics.BitmapFactory;import android.os.Build;import android.os.Bundle;import android.view.View;import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.NotificationCompat;public class Notification extends AppCompatActivity implements View.OnClickListener{private NotificationManager manager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_notification);manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){String channelId = "First";String channelName = "通知消息";int importance = NotificationManager.IMPORTANCE_HIGH;NotificationChannel channel = new NotificationChannel(channelId,channelName,importance);manager.createNotificationChannel(channel);}Button sendNotice = (Button) findViewById(R.id.send_notice);sendNotice.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.send_notice:Intent intent = new Intent(this, NotificationTest.class);PendingIntent activity = PendingIntent.getActivity(this, 0, intent, 0);android.app.Notification notification = new NotificationCompat.Builder(this,"First").setContentTitle("媳妇找你聊天了!").setContentText("媳妇找你聊天了!").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setContentIntent(activity).setAutoCancel(true).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)).build();manager.notify(1,notification);break;default:break;}}}
调用摄像头
调用摄像头
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);startActivityForResult(intent,TAKE_PHOTO);
播放多媒体文件
播放音频
在Android中播放音频一般都是使用MediaPlayer类来实现的,它对多种格式的音频文件提供了非常全面的控制方法,下表列出了Media Player类中一些较为常用的控制方法。

MediaPlayer工作流程:
- 创建出一个MediaPlayer对象
- 调用setDataSource()方法设置音频文件的路径
- 调用prepare()方法使MediaPlayer进入到准备状态
- 调用start()方法就可以开始播放音频,调用pause()方法就回暂停播放,调用reset()方法就会停止播放。
demo:播放音乐
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.media.MediaPlayer;import android.os.Bundle;import android.widget.Button;public class PlayAudioActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_play_audio);Button play = findViewById(R.id.play);Button pause = findViewById(R.id.pause);Button stop = findViewById(R.id.stop);MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.music);play.setOnClickListener(v -> {mediaPlayer.start();});pause.setOnClickListener(v -> {if (mediaPlayer.isPlaying())mediaPlayer.pause();});stop.setOnClickListener(v -> {if (mediaPlayer.isPlaying())mediaPlayer.stop();});}}
在做这个demo的时候遇到的困难:
一开始写的代码一直报E/MediaPlayer: Error (-38,0)这个错,网上查询各种解决办法且投入一定的时间后也没解决,无奈之下重写,使用简简单单的代码先实现播放功能。从中得到的教训:作为练习的demo只是让自己熟悉功能,如果一开始耗费大量时间去写较为高级的会得不偿失,例如拖慢学习进度。
播放视频
播放视频主要由VideoView类实现。
主要方法:
demo:
package com.example.myapplication;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.core.app.ActivityCompat;import androidx.core.content.ContextCompat;import android.Manifest;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.widget.Button;import android.widget.Toast;import android.widget.VideoView;import java.io.File;public class PlayVideoActivity extends AppCompatActivity implements View.OnClickListener {private VideoView videoView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_play_video);videoView = findViewById(R.id.video_view);Button play = findViewById(R.id.play);Button pause = findViewById(R.id.pause);Button replay = findViewById(R.id.replay);play.setOnClickListener(this);pause.setOnClickListener(this);replay.setOnClickListener(this);if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);}else {initVideoPath();}}private void initVideoPath() {File file = new File(Environment.getExternalStorageDirectory(), "test.mp4");videoView.setVideoPath(file.getPath());}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode){case 1:if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){initVideoPath();}else {Toast.makeText(this,"拒绝权限将无法使用程序",Toast.LENGTH_SHORT).show();finish();}break;default:}}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.play:if (!videoView.isPlaying()){videoView.start();}break;case R.id.pause:if (videoView.isPlaying()){videoView.pause();}break;case R.id.replay:if (videoView.isPlaying()){videoView.resume();}break;}}@Overrideprotected void onDestroy() {super.onDestroy();if (videoView != null){videoView.suspend();}}}
注意:MP4文件要放在手机存储的根目录下。
