第八章 - 运用手机多媒体
使用通知
创建通知渠道
每条通知对应一个通知渠道。
创建通知渠道的步骤:
使用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;
@Override
protected 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);
}
@Override
public 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 {
@Override
protected 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;
@Override
protected 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());
}
@Override
public 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:
}
}
@Override
public 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;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (videoView != null){
videoView.suspend();
}
}
}
注意:MP4文件要放在手机存储的根目录下。