Android第八章(运用手机多媒体)
8.1 使用通知
通知——是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现
8.1.1 通知的基本用法
通知可以在活动里创建,也可以在广播接收器里创建,还可以在服务里创建
创建步骤:
1、首先需要一个 NotificationManager类来对通知进行管理,通过调用getSystemService()方法来得到
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
2、接下来使用Builder构造器来创建一个Notification的对象,代码如下
Notification notification = (Notification) new NotificationCompat.Builder(context).build();
3、我们可以添加一些额外的东西丰富Notification的对象,如:
4、构建完成后,我们只需要调用notify()方法就可以让通知显示出来了,代码如下:
manager.notify(1, (android.app.Notification) notification);
其中第一个传入到参数是id,要保证为每个通知所指定的id都是不同的
下面我们来实现以下代码:
首先在activity_main布局文件中定义一个按钮。
然后在MainActivity中,代码如下:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.send_notice:
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = (Notification) new NotificationCompat.Builder(this).setContentTitle("This is content title").setContentText("this is content text").setWhen(System.currentTimeMillis()).build();
manager.notify(1, (android.app.Notification) notification);
break;
default:
break;
}
}
这样我们就简单的定义了一个通知
那么点击了通知之后如何实现通知的点击效果呢?
这里就涉及到了一个新的概念:PendingIntent
1、它可以用于启动活动、服务以及发送广播等。与Intent的不同的是,Intent更倾向于去立即执行某个动作;而PendingIntent更倾向于在某个合适的时机去执行某个动作
2、它可以根据需求来选择时使用getActivity()方法、getBroadcast()方法还是getService()方法
3、这几个方法接收的参数是相同的,第一个参数为Context;第二个参数一般为0;第三个参数是一个Intent对象,我们可以通过这个对象构建出PendingIntent的“意图”;第四个参数用于确定PendingIntent的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT、FLAG_UPDATE_CURRENT这4种值可选
4、NotificationCompat.Builder构造器可以连缀一个setContentIntent()方法,接收的参数正是一个PendingIntend对象。因此,这里就可以通过PendingIntent构建出一个延迟执行的“意图”,当用户点击这条通知时就会执行相应的逻辑
具体实现:
首先我们准备好一个活动NotificationActivity,并且修改其布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="24sp"
android:text="This is notification layout"/>
</RelativeLayout>
然后我们修改MainActivity中的代码:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.send_notice:
Intent intent = new Intent(this,NotificationActivity.class);//1、搭建起桥梁
PendingIntent pi = (PendingIntent) PendingIntent.getActivities(this,0, new Intent[]{intent},0);//2、获取PendingIntent的实例
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = (Notification) new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("this is content text")
.setWhen(System.currentTimeMillis())
.setContentIntent(pi)//3、在这个地方调用方法,将参数传入
.build();
manager.notify(1, (android.app.Notification) notification);
break;
default:
break;
}
}
这样我们再点击通知,就可以定位到具体活动了
在点击了通知后,怎么样使得通知消失?
解决方法有两种:
①在NotificationCompat.Builder构造器后面再连缀一个setAutoCancel()方法;
②显式的调用NotificationManager的cancel()方法将它取消,代码如下:
public class NotificationActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_layout);
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(1);//这里传入参数1,是因为当时我们给这条通知设置的id就是1
}
}
8.1.2 通知的进阶技巧
NotificationCompat.Builder构造器中提供了很多API使得我们的通知丰富多样,如:
1、播放音频文件:
2、在通知来时让手机震动
3、在通知来时闪烁呼吸灯
4、根据手机环境改变
8.1.3 通知的高级功能
NotificationCompat.Builder构造器中提供了很多API使得我们的通知丰富多样,如:
1、setStyle()方法:
(1)该方法可以显示长文字:
这个代码下,当存在多余部分会用省略号表示。
我们可以用如下方法使得多余的部分也显现出来
(2)该方法还可以显示图片:
2、setPriority()方法——用于设置通知的重要程度:
8.2 调用摄像头和相册
8.2.1 调用摄像头拍照
如何能在应用程序里调用手机的摄像头进行拍照?
首先我们定义一下布局文件:
该布局文件定义了一个按钮,用于打开摄像头拍照;一个图片,用于将拍到图片显现出来
然后修改MainActivity中的代码:
我们来分析一下下面代码:
①首先我们在onCreate()方法中分别获取了Button和ImageView的实例,并给Button注册上点击事件,然后在Button的点击事件里开始处理调用摄像头的逻辑
②首先创建File对象,用于存放摄像头拍下的图片,File()传入的第一个参数是getExternalCacheDir()方法,该方法可以得到存储图片的应用关联缓存目录,第二个参数就是图片的名称
③接着进行判断,弱运行设备的系统版本低于Android7.0,就会调用Uri的fromFile()方法将File对象转换成Uri对象;否则就调用FileProvider的getUriForFile()方法将File对象转换成一个封装过的Uri对象,其中getUriForFile()方法传入的第一个参数为Context对象,第二个参数可以是任意唯一的字符串,第三个参数则是我们刚刚创建的File对象
④接下来创建一个Intent对象,搭建桥梁。再调用Intent的putExtra()方法指定图片的输出地址,这里填入刚刚得到的Uri对象,最后启动活动
⑤最后重写onActivityForResult()方法,如果发现拍照成功,就可以调用BitmapFactory的decodeStream()方法将照片解析成Bitmap对象,显示出来
接着,我们对内容提供器进行注册:
其中android:name的值是固定的;
android:authorities的值必须要和刚才FilProvider.getUriForFile()方法中的第二个参数保持一致;
另外,这里还在provider标签的内部使用meta-data来指定Uri的共享路径,并引用了一个@xml/file_paths资源
下面我们就来创建@xml/file_paths资源
这样我们就实现了调用摄像头并拍照的功能
8.2.2 从相册中选择照片
首先,修改activity_main中的文件:
然后修改MainActivity中的代码,加入从相册中选择照片的逻辑,代码如下所示:
①前三个函数是对运行时权限声明的一系列操作
②然后第四个函数对手机版本型号进行判断
③第五、六个函数的逻辑:如何解析这个封装过的Uri
④第七个函数:让图片显示到界面上
这样我们就实现了从相片中选取照片。不过这里留下了一个问题:就是有些照片可能经过剪裁之后体积仍然很大,所以这就需要对照片进行压缩再加载到内存中,这里就自行考虑
8.3 播放多媒体文件
8.3.1 播放音频
在Android中播放音频文件一般都是使用MediaPlayer类来实现的,下表列出了MediaPlayer类中一些较为常用的控制方法
下面梳理一下MediaPlayer的工作流程
①首先创建出一个MediaPlayer对象
②调用setDataSource()方法来设置音频文件的路径
③调用prepare()方法使MediaPlayer进入准备状态
④调用start()方法开始播放音频;pause()方法暂停播放;reset()方法停止播放
我们来实现一下:
首先修改activity_main中的代码:
然后修改MainActivity中的代码:
①这里我们首先创建了一个MediaPlayer的实例,在onCreate()方法中进行了运行时权限的处理
②然后我们设置了各个按钮的点击事件
③最后在onDestroy()方法中释放掉MediaPlayer资源
最后声明权限:
这样一个简单的音乐播放器就完成了
8.3.2 播放视频
在Android中播放音频文件一般都是使用VideoView类来实现的,下表列出了MediaPlayer类中一些较为常用的控制方法
我们接下来实现一下代码:
其实上述代码跟播放音频的代码有很大的相似程度
最后我们也来声明一下权限
这样就实现了一个播放视频的功能
8.4 小结
1、通知的基本用法,显示一个普通通知,并且点击后有反馈效果
2、通知的进阶技巧:播放音频;手机震动;闪烁呼吸灯;根据手机设置改变
3、通知的高级功能:显示长文字;显示图片;设置通知的重要程度
4、调用摄像头拍照
5、从相册中选择照片
6、播放多媒体文件:播放音频;播放视频
本文地址:https://blog.csdn.net/Cristiano_san/article/details/108539584