第八章——手机多媒体

一、使用通知

1.1通知的使用方法

首先需要一个NotificationManager对通知进行管理,通过调用Context的getSystemService()方法获取,此方法接收一个字符串参数用于确定获取系统的某个服务,传入Context.NOTIFICATION_SERVICE即可。

例:NotificationManager manager=(NotificationManager)

       getSystemService(Context.NOTIFICATION_SERVICE);

接着需要用NotificationCompat类的Builder构造器来创建Notification对象

例:Notification notification = new Notification.Builder(context).build();

在最终的build() 方法之前连缀任意多的设置方法来创建一个丰富的Notification 对象,基本设置有:

Notification notification = new NotificationCompat.Builder(Context context,String channelId)

.setContentTitle("This is content title")    //指定通知的标题内容

.setContentText("This is content text")   //指定通知的正文内容

.setWhen(System.currentTimeMillis())   //指定通知被创建的时间,以毫秒为单位

.setSmallIcon(R.drawable.small_icon)   //设置通知的小图标,只能使用纯alpha图层的图片进行设置

.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.large_icon))  //大图标

.build();

要调用NotificationManager的notify() 方法就可以让通知显示出来了。notify() 方法接收两个参数,第一个参数是id ,要保证为每个通知所指定的id都是不同的;第二个参数则是Notification对象,这里直接将我们刚刚创建好的Notification 对象传入即可。

例:manager.notify(1, notification);

代码修改:

                String id ="channel_1";    //channel的id
                String description = "123";    //channel的描述信息
                int importance = NotificationManager.IMPORTANCE_LOW;   //channel的重要性
                NotificationChannel channel = new NotificationChannel("channel_1","123", importance);
                NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                manager.createNotificationChannel(channel);
                Notification notification=new Notification.Builder(this,"channel_1")

.......

1.2 PendingIntent

指明某一个“意图”,可以用于启动活动、启动服务及发送广播(倾向于在某个合适的时机去执行某个动作),也可以把PendingIntent简单地理解为延迟执行的Intent。

根据需求选择用getActivity() 方法、getBroadcast() 方法,还是getService() 方法

这几个方法所接收的参数相同:

第一个参数:Context

第二个参数:通常传入0

第三个参数:一个Intent对象,通过这个对象构建出PendingIntent的“意图”

第四个参数:用于确定PendingIntent的行为,有FLAG_ONE_SHOT 、FLAG_NO_CREATE 、FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_CURRENT,通常传入0

Notification.Builder 这个构造器还可以再连缀一个setContentIntent() 方法,接收的参数正是一 个PendingIntent 对象(pi)。这里就可以通过PendingIntent构建出一个延迟执行的“意图”, 当用户点击这条通知时就会执行相应的逻辑。

Intent intent = new Intent(this, NotificationActivity.class);

PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);

.setContentIntent(pi)

1.3通知图标消失:

在Notification.Builder中再连缀一个setAutoCancel(true)方法

显式地调用NotificationManager的cancel() 方法将它取消

NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

manager.cancel(1);  //每条通知指定的id,在notify()方法中

1.4通知的进阶技巧

.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))

//设置通知提示音
.setVibrate(new long[]{0,1000,1000,1000})

//设置振动,需要添加权限  <uses-permission android:name="android.permission.VIBRATE"/>
.setLights(Color.GREEN,1000,1000)

//设置前置LED灯进行闪烁,第一个为颜色值,第二个为亮的时长,第三个为暗的时长
.setDefaults(NotificationCompat.DEFAULT_ALL)  //使用默认效果,会根据手机当前环境播放铃声, 是否振动

1.5通知的高级功能

setStyle() 方法接收一个NotificationCompat.Style 参数,这个参数就是用来构建具体的富文本信息的,如长文字、图片

例:长文字   .setStyle(new Notification.BigTextStyle().bigText("乌拉乌拉乌拉可以看到,通知内容是无法显示完整的,多余的部分会用省略号来代替。其实这也很正常"))

大图片  .setStyle(new Notification.BigPictureStyle().bigPicture (BitmapFactory.decodeResource(getResources(), R.drawable.big_image)))

setPriority() 方法,它可以用于设置通知的重要程度

一共有五个常量值可选:

PRIORITY_DEFAULT 表示默认的重要程度,和不设置效果是一样的;PRIORITY_MIN 表示最低的重要程度,系统可能只会在特定的场景才显示这条通知,比如用户下拉状态栏的时 候;

PRIORITY_MIN 表示最低的重要程度,系统可能只会在特定的场景才显示这条通知,比如用户下拉状态栏的时候;

PRIORITY_LOW 表示较低的重要程度,系统可能会将这类通知缩小,或改变其显示的顺序,将其排在更重要的通知之后;

PRIORITY_HIGH 表示较高的重要程度,系统可能会将这类 通知放大,或改变其显示的顺序,将其排在比较靠前的位置;

PRIORITY_MAX 表示最高的重要 程度,这类通知消息必须要让用户立刻看到,甚至需要用户做出响应操作。

例: .setPriority(NotificationCompat.PRIORITY_MAX)

二、调用摄像头和相册

2.1调用摄像头拍照

①首先这里创建了一个File对象,用于存放摄像头拍下的图片,这里我们把图片命名为 output_image.jpg,并将它存放在手机SD卡的应用关联缓存目录下,就是指SD卡中专门用于存放当前应用缓存数据的位置;调用getExternalCacheDir() 方法可以得到这个目录,具体的路径是/sdcard/Android/data//cache

getExternalCacheDir()方法接收3个参数,第一个参数要求传入Context 对象,第二个参数可以是任意唯一的字符串,第三个参数则是我们刚刚创建的File对象;

②接着会进行一个判断,如果运行设备的系统版本低于Android 7.0,就调用Uri的fromFile() 方 法将File 对象转换成Uri 对象,这个Uri对象标识着output_image.jpg这张图片的本地真实路径。否则,就调用FileProvider的getUriForFile() 方法将File 对象转换成一个封装过的Uri 对象

③接下来构建出了一个Intent对象,并将这个Intent 的action指定为android.media.action.IMAGE_CAPTURE ,再调用Intent的putExtra()方法指定图片的输出地址,这里填入刚刚得到的Uri对象

④最后调用startActivityForResult()来启动活动

刚才使用startActivityForResult()来启动活动的,因此拍完照后会有结果返回到onActivityResult() 方法中。如果发现拍照成功,就可以调用BitmapFactory的decodeStream()方法将output_image.jpg这张照片解析成Bitmap对象,然后把它设置到ImageView中显示出来。

2.2从相册中选择照片

2.3播放多媒体文件

在Android中播放音频文件一般都是使用MediaPlayer 类来实现的

 ①首先需要创建出一个MediaPlayer对象

private MediaPlayer mediaPlayer = new MediaPlayer();

②然后调用setDataSource()方法来设置音频文件的路径

mediaPlayer.setDataSource(file.getPath());

③再调用prepare()方法使MediaPlayer进入到准备状态

mediaPlayer.prepare();

④接下来调用start()方法就可以开始播放音频,调用pause()方法就会暂停播放,调用reset()方法就会停止播放

mediaPlayer.start();    mediaPlayer.pause();      mediaPlayer.reset();

⑤在AndroidManifest.xml文件中声明权限:

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

2.4播放视频

主要是使用VideoView类来实现的

 这部分代码和前面播放音频的代码非常类似:

①首先在onCreate()方法中同样进行了一个运行时权限处理,因为视频文件将会放在SD卡上;

②当用户同意授权了之后就会调用initVideoPath()方法来设置视频文件的路径,这里我们需要事先在SD卡的根目录下放置一个名为movie.mp4的视频文件;

③当点击Play按钮时会进行判断,如果当前并没有正在播放视频,则调用start()方法开始播放;当点击Pause按钮时会判断,如果当前视频正在播放,则调用pause()方法暂停播放;当点击Replay按钮时会判断,如果当前视频正在播放,则调用resume()方法从头播放视频;最后在onDestroy()方法中,我们还需要调用一下suspend()方法,将VideoView所占用的资源释放掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值