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、播放多媒体文件:播放音频;播放视频

猜你喜欢

转载自blog.csdn.net/Cristiano_san/article/details/108539584