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所占用的资源释放掉。