文章目录
- 前言
- 一、通知渠道是什么?
- 二、快速入门
- 1. 书写通知
- 2.通知有了 ,点击也没动静啊- PendingIntent
- 3 点击完之后,通知不消失怎么办
- 4 通过setStyle() 来是实现长文字通知
- 5 还想放张图
- 6 不同通知之间也有等级差异
- 三、 使用相机
- 7 调用相机
- 8 从相册中选照片
- 放个音乐
- 9 播放音频
- 总结
前言
如何实现安卓端的通知
一、通知渠道是什么?
顾名思义,就是每条通知都要属于一个对应的渠道。每个应用程序都可以自由地创建当前应用拥有哪些通知渠道,但是这些通知渠道的控制权是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动或者是否要关闭这个渠道的通知。
二、快速入门
通知的用法很灵活,可以在Activity 也可以在Broadcast Receiver里 在后续还会出现在service里
1. 书写通知
第一行代码里使用的时AndriodX库中提供的Notification Compat类
//首先需要一个NotificationManager对通知进行管理 getSystemService()
val manager = getSysteService(Context.NOTIFICATION_SERVICE) as NotificationManager
//用于接收字符串参数用于确定获取系统的哪个服务 这里我们传入Context.NOTIFICATION_SERVICE
//这个参数会放进两个 一个是内容 一个是渠道ID
val notification =NotificationCompat.Builder(context,chanelId)
//放进四个设置方法
.setContentTitle(" welcome this world")
.setContentText(" welcome")
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setLargeIcon(R.drawable.ic_launcher_foreground)
//上面四个应该不用解释了
.build()
manager.notify(1,notification)
}
因为第一行代码太多坑了 ,索性只看伪代码 参透逻辑 不然等咱边修bug边打代码 得打到明年 效果如下图所示
现在只能看,不能点击,点击并不会跳转,接下来就要用到PendingIntent
2.通知有了 ,点击也没动静啊- PendingIntent
根据需要来判断使用的是 getActivity() , getService(),getBroadcast()
参数:
- 第一个一直是context,
- 第二个参数 用不到(他是这么写的)传入0即可,
- 第三个参数是一个Intent对象,我们可以通过这个对象构建出
-第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT这4种值可选,通常情况下这个参数传入0就可以了。
sendNotic.setOnClickLisenter{
//先用Intent 表达NofiticationActivity 的意图,然后价格构建好的Intent对象传入
// getActivity()方法里
val intent =Intent(this,MpofocatopmActovotu::class.java)
val pi= PendingIntent.getActiiy(this,0.intent,0)
val notification =NotificationCompat.Builder(this,"normal")
....
}
3 点击完之后,通知不消失怎么办
.setAutoCancel(true)
.build()
可以看到,setAutoCancel()方法传入true,就表示当点击这个通知的时候,通知会自动取消。
4 通过setStyle() 来是实现长文字通知
...
.setStyle(NotificationCompat.BigTextStyle().bigText(" 长文字段落")).buider()
通过实例化对象NotificationCompat类的BigTextStyle,来封装长文字信息 ,.setStyle() 代替了原来的 .setContentText() 方法
5 还想放张图
换汤不换药 同样在NotificationCompat类中找,用BigPictureStyle()对象的bigpicture()方法 将图片传入, 通过
.setStyle(NotificationCompat.BigPictureStyle().bigPictureStyle().bigPicture(
BitmapFactory.decodeResource(resourc,R.drawable.big_image)
)).builder()
//通过BitmapFactory的decodeResource()方法将图片解析成Bitmap对象,在传入bigPicture()方法中
}
6 不同通知之间也有等级差异
等级高的通知渠道发出的通知可以弹出横幅 发出声音,而低重要等级通知渠道发出的通知可能会在某些情况下被屏蔽,而且可能被更改显示的顺序
开发者 只能在创建时更改一次,而用户可以根据需求自己更改重要等级
我们发的微信会横屏出来 也是因为 通知等级 是高
val channel12 = NotificationChannel(" importtant","Important",NotificationManager.IMPORTANCE_HIGH)
manager.createNotificationChannel(channel12)
三、 使用相机
7 调用相机
调用摄像头的具体逻辑
布局文件里有两个空间 Button 和 ImageView
Button启动摄像头, imageView 用于保留相片的位置
takePhoto.setOnClickListener{
//创建File对象,用于存储拍照后的照片
outputImage =File(externalCacheDir,"output_image.jpg")
//我们将图片命名为output_image 并存放在手机SD卡的应用关联缓存目录下, SD卡中钻们用于存放应用缓存数据的位置
存储在应用关联缓存目录下 可以避免读写SD卡的操作,在android10以后只能通过作用域来读取不能直接读取SD
outputImage.createNewFile()
imageUri = if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.N)
{
FileProvider.getUriForFile(this,"com.hope.cameraalbumtest.fileprovider",outputImage) //getUriForFile()方法将File对象转化为Uri对象
}else{
Uri.fromFile(outputImage)
}
getUriForFile() 接收三个参数 第一个参数要传入 content对象 第二个对象可以是任意一个唯一的字符串,第三个参数则是刚刚创建的File对象,
之所以要进行
//启动相机
val intent = Intent(" android.media.action.IMAGE_CAPTURE")
intent.putExtra(MediaStore,EXTRA_OUTPUT,imageUri)
startActivityForResult(intent,takePhoto)
构建一个Intent对象,并将这个Intent的action指定为android.media.action.IMAGE_CAPTURE,再调用Intent的putExtra()方法指定图片的输出地址,这里填入刚刚得到的Uri对象,最后调用startActivityForResult()启动Activity
这部分就写到者这了要是完全的话也是写不完的
8 从相册中选照片
//打开文件选择器
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
//指定只显示图片
intent.type = " image/*"
startActivityForResult(intent, fromAlbum)
先创建一个Inent对象, 并将action的指定为Intent.ACTION_OPEN_DOCUMENT 表示打开系统的文件选择器
suer.onActivityResult(requestCode,resultCode,data)
when(requestCode)
{
....
fromAlbum-> {
if(resultCode == Activity.RESULT_OK&& data!=null)
{
data.data?.let{
uri-> //将选择的图片显示
val bitmap = getBitmapFromUri(uri)
imageView.setImageBitmap(bitmap)
---
放个音乐
9 播放音频
这里用到了MediaPlayer类 如下是一些使用方法
Media的工作流程,首先需要创建一个MediaPlayer对象,然后调用setDataSource()方法设置音频文件的路径,再调用prepare()方法使MediaPlayer进入准备状态,接下来调用start()方法就可以开始播放音频,调用pause()方法就会暂停播放,调用reset()方法就会停止播放。
总结
提示::
本来还差一个视频 不写了, 休息一下 下午看Java了