使用通知
一般我们在使用Android手机时下拉屏幕可以看到许多应用发送的消息,这些消息包括标题、内容甚至是图片,这就是通知。通知不同于Toast短消息,通知可以长时间的存在与手机的状态栏,当通知到来时还可以让手机发出提示音或者使用前置的led来提醒使用者,所以通知是每一个应用程序中必不可少的一项。
创建通知主要有以下三步骤:
第一步:创建一个NotificationManager对象来对通知进行管理,这个对象可以使用Context的getSystemService()方法得到。getSystemService()一般要传入一个字符串用于确定获取系统的哪一个服务。
第二步:创建Notification对象。创建该对象需要使用Builder()构造器。有了该对象以后我们就可以来使用多种方法来设置我们的通知了。
第三步:调用NotificationManager中的notify()方法将通知加载进来。notify()接收两个参数,第一个参数是id,就是需要保证每一个通知的id都是不同的;第二个参数是Notification对象。传入该对象之后我们就可以加载通知了。
我们来自己写一个小程序来测试一下吧!,首先是创建一个空项目,然后为布局添加一个按钮,之后修改主代码:
package com.example.yzbkaka.notificationtest;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button send = (Button)findViewById(R.id.send);
send.setOnClickListener(this);
}
@Override
public void onClick(View view) {
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("this is a title") //设置标题
.setContentText("this is a content text") //设置内容
.setWhen(System.currentTimeMillis()) //设置创建的时间
.setSmallIcon(R.mipmap.ic_launcher) //设置小标志
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) //设置大标志
.setDefaults(NotificationCompat.DEFAULT_ALL) //使用手机默认的提醒方式
.setPriority(NotificationCompat.PRIORITY_DEFAULT) //设置通知的重要程度
.setAutoCancel(true) //设置通知自动取消
.build();
manager.notify(1,notification);
}
}
我们创建通知时就是按照前面讲的步骤来进行的,首先就是创建NotificationManager对象,然后是创建Notification对象并且在该对象里面我们为通知设定了各种的属性,下面一个一个的来看吧:
setContentTitle():就是设置我们通知的标题,一般是传入一个字符串即可。
setContentText():设置我们通知中的内容,也是传入一个字符串即可。
setWhen():设置我们通知创建的时间,这里是以毫秒为单位,一般我们使用系统默认的System.currentTimeMillis()
即可。
setSmallIcon():设置我们通知的小图标,这里的小图标主要是在我们下拉状态栏之前显示在手机上方的状态栏中的图标。
setLargeIcon():设置我们通知的大图标,这里的大图标是指我们下拉状态栏之后显示在标题左边的图标。
setDefaults():设置手机默认的提醒通知的方式,包括铃声、震动和LED灯的闪烁,一般我们传入默认值即可。
setPriority():设置我们通知的重要程度,程度越高的则会排在越前面。有四个参数可供我们选择:
NotificationCompat.PRIORITY_DEFAULT(默认程度)
NotificationCompat.PRIORITY_MIN(低程度)
NotificationCompat.PRIORITY_HIGH(高程度)
NotificationCompat.PRIORITY_MAX(最高程度)
setAutoCancel():设置我们的通知在被点击之后能够自动的取消不再显示。
设置完属性之后我们最后调用NotificationManager的notify()方法来让我们的通知加载。最后运行程序,点击按钮即可成功发送通知。
播放多媒体
多媒体我们一般包括音频和视频。在Android里面为这两种多媒体文件提供了很好的API支持,我们一起来学习一下吧。
1.播放音频
在Android中播放音频所使用到的类主要是MediaPlayer,这个类中包含了许多的方法,可以用一张图来概括:
知道了这些方法,我们就可以亲自来尝试一下了,还是先创建一个空项目,然后为该项目的布局添加三个按钮,分别表示播放、暂停和停止。接着修改主代码:
package com.example.yzbkaka.mediaplayertest;
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
MediaPlayer mediaPlayer = new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button play = (Button)findViewById(R.id.play);
Button pause = (Button)findViewById(R.id.pause);
Button stop = (Button)findViewById(R.id.stop);
play.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
else{
initMediaPlayer();
}
}
public void initMediaPlayer(){
try{
File file = new File(Environment.getExternalStorageDirectory(),"music.mp3");
mediaPlayer.setDataSource(file.getPath());
mediaPlayer.prepare();
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode,String[] permission,int[] grantResults){
switch (requestCode){
case 1:
if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
initMediaPlayer();
}
else{
Toast.makeText(this, "you deny the request", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.play:
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();
}
break;
case R.id.pause:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
break;
case R.id.stop:
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
mediaPlayer.reset();
initMediaPlayer();
}
}
}
@Override
public void onDestroy(){
super.onDestroy();
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
在这段代码中我们是想要读取手机中的SD卡的MP3文件来进行播放,所以在开始我们要申请读取MP3的权限,否则就无法播放,申请权限的步骤我们都很了解,所以就不多说了。当权限申请完毕之后我们就来进行初始化操作,我们先是创建一个File对象来获得我们音频文件的路径,接着就是使用setDataSource()方法来将路径导入,最后是使用prepare()方法让mediaPlayer准备就绪。然后就是对按钮的点击方法了,对于play键我们先判断音频文件是否在播放,如果没有播放我们就是用start()进行播放;对于pause键我们也是先进行判断,只有当有音乐播放时我们才能进行暂停;最后是stop键,我们先使用stop()方法让音乐停下来,然后使用reset()方法让音频回复到开始时的状态,接着是重新初始化。最后是在onDestroy()方法中我们还需要调用stop()方法和release()方法将资源进行释放。
要注意需要先注册权限哦:
2.播放视频
播放视频主要使用的是VideoView类来进行实现的,这个类中所包含的方法和MediaPlayer类中的很像,也可以用一张图来概括:
我们来写一个demo尝试一下播放音频,仍然是空项目,然后来设置布局:
我们是水平放置了三个按钮分别代表:播放、暂停和重新开始,然后是使用组件VideoView,稍后的视频就将在这里进行播放。接着我们来修改主代码:
package com.example.yzbkaka.videoviewtest;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.widget.VideoView;
import java.io.File;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView = (VideoView)findViewById(R.id.video_view);
Button play = (Button)findViewById(R.id.play);
Button pause = (Button)findViewById(R.id.pause);
Button replay = (Button)findViewById(R.id.replay);
play.setOnClickListener(this);
pause.setOnClickListener(this);
replay.setOnClickListener(this);
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
else{
initVideoPath();
}
}
public void initVideoPath(){
File file = new File(Environment.getExternalStorageDirectory(),"movie.mp4");
videoView.setVideoPath(file.getPath());
}
@Override
public void onRequestPermissionsResult(int requestCode,String[] permission,int[] grantResults){
switch (requestCode){
case 1:
if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
initVideoPath();
}
else{
Toast.makeText(this, "you deny the request", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.play:
if(!videoView.isPlaying()){
videoView.start();
}
break;
case R.id.pause:
if(videoView.isPlaying()){
videoView.pause();
}
break;
case R.id.replay:
if(videoView.isPlaying()){
videoView.resume();
}
break;
}
}
@Override
public void onDestroy(){
super.onDestroy();
if(videoView != null){
videoView.suspend();
}
}
}
其实这一段代码和播放音频的代码很像,这里就不详细的说了。主要是说一下最后的onDestroy()方法中调用的suspend()方法,这个方法在图中是没有被提及到的,它是指将videoView中的视频资源给是释放掉。
最后别忘了注册权限,然后运行程序就能够播放SD卡中的视频了。