使用通知(Notification)
我发现很多android系统的特色服务都是需要获得~Manager来管理的,比如LocalManager(获取定位服务),SensorManager(获取光照传感器服务)等等。
- 通知属于系统的特色服务,需要一个NotificationManager来管理。
NotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 获取Notification对象实例,配置好Notification的各种属性,比如图标,标题,内容。
要先响应Notification的点击事件,需要借助一个PendingIntent类。Pending 未决定的,将要发生的意思。所以顾名思义,PendingIntent就是一个在某个合适的时机去执行某个action,延迟执行的Intent。要获取PendingIntent,可以调用静态方法,PendingIntent.getActivity()、PendingIntent.getBroadcast()和PendingIntent.getService()方法,它们的参数是完全相同的。第一个参数依旧是Context对象,第二个参数通常传入0,第三个参数是Intent对象,设置PendingIntent的意图,第四个参数用于确定PendingIntent的行为。
- 低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。
Intent intent = new Intent(this,MainActivity);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
notification.setLatestEventInfo(context, title, message, pendingIntent);
manager.notify(id, notification); - 高于API Level 11,低于API Level 16 (Android 4.1.2)版本的系统中,可使用Notification.Builder来配置Notification的各种属性,但要使用getNotification()来得到Notification的实例。
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle(“title”)
.setContentText(“describe”)
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_launcher)
.setWhen(System.currentTimeMillis())
.setOngoing(true);
notification=builder.getNotification();//This method was deprecated in API level 16. Use build() instead. - 高于API Level 16的版本,就可以用Builder和build()函数来配套的方便使用notification了。
Notification.Builder builder = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle(“title”)
.setContentText(“describe”)
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_launcher)
.setWhen(System.currentTimeMillis())
.build();
- 低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。
- 调用NotificationManager.notify()方法发送通知,调用NotificationManager.cancel()方法关闭通知。
发送短信
- 获取SMSManager实例
SMSManager smsmanager=SmsManager.getDefault(); - 调用SmsManager.sendTextMessage()方法。
接受短信就不总结了,就是自定义一个接受短信消息的广播接收器,在onReceive()方法中编写解释短信的逻辑。
调用摄像头和相册
- 创建一个图片文件的路径并创建一张空图片,把路径转化成Uri对象。
File outputImage=new File(Environment.getExternalStorageDirectory(),"tempImage.jpg");
try {
if(outputImage.exists())
outputImage.delete();
outputImage.createNewFile();
} catch (Exception e) {
e.printStackTrace();
}
imageuri=Uri.fromFile(outputImage);
Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);
startActivityForResult(intent,TAKE_PHOTO);
- 调用startActivityForResult()启动拍照程序
- 在回调函数onActivityResult()方法中,进行剪切图片和显示图片的操作。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if(resultCode==RESULT_OK){
Intent intent=new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageuri,"image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);
startActivityForResult(intent,CROP_PHOTO);
}
break;
case CROP_PHOTO:
if (resultCode==RESULT_OK){
try {
Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(imageuri));
picture.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
case CHOOSE_PHOTO:
if(resultCode==RESULT_OK){
Intent intent=new Intent("com.android.camera.action.CROP");
intent.setDataAndType(data.getData(),"image/*");
//intent.setDataAndType(imageuri,"image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);
startActivityForResult(intent, CROP_PHOTO);
}
break;
default:
break;
}
}
File outputImage=new File(Environment.getExternalStorageDirectory(),"output_Image.jpg");
try {
if(outputImage.exists())
outputImage.delete();
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageuri=Uri.fromFile(outputImage);
Intent intent=new Intent();
//intent.setAction(Intent.ACTION_PICK);
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent,CHOOSE_PHOTO);
书上从相册中选择照片剪切完成并显示的相关代码似乎有误,反正我用书上代码,在真机上无法弹出剪切照片的程序的。如果有跟我有同样的问题可以参考我的代码。
播放多媒体
- 播放音频
- 构造MediaPlayer对象
- 调用setDataSource()方法设置音频路径
- 调用prepare()使MediaPlayer进入准备状态
- 主要方法:
start() 开始或继续播放音频
pause() 暂停播放音频
reset() 将MediaPlayer对象重置到刚开始创建的状态
seekTo() 从指定的位置开始播放
stop() 停止播放音频
release() 释放掉与MediaPlayer对象相关的资源
isPlaying() 判断当前MediaPlayer是否正在播放音频
getDuration() 获取载入的音频文件的时长
- 播放视频
- 实例化VideoView对象
- 调用setVideoPath()指定视频文件的路径
- 具体方法与MediaPlayer差不多。