三种创建方式:1、活动里创建 2、广播接收器里创建 3、服务里创建
创建步骤:
第一步:构造一个通知管理器对象
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
第二步:创建一个丰富的Notification对象
Notification notification=new NotificationCompat.Builder(context)
.setContentTitle("This is content title")//标题
.setContentText("This is content text")//内容
.setWhen(System.currentTimeMillis())//创建时间
.setSmallIcon(R.drawable.small_icon)//通知小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),
R.drawable.large_icon)//下拉后显示的图标
.build();//创建
第三步:显示通知
//第一个参数是通知的ID,每个通知的ID都是不同的
//第二个参数就是刚刚创建的通知对象
manager.notify(1,notification);
intent倾向于立即执行,而PendingIntent倾向于在合适时机执行
示例:用户点击通知后跳转到别的活动
Intent intent=new Intent(this,NotificationActivity.class);
PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification=new NotificationCompat.Builder(context)
...
.setContentIntent(pi);//给通知加入PendingIntent
.build();
manager.notify(1,notification);
用户点击通知后让通知消失(两种方法):
Notification notification=new NotificationCompat.Builder(context)
...
.setAutoCancel(true)//用户点击通知后通知即消失
.build();
Notification notification=new NotificationCompat.Builder(context)
...
//设置通知提示音
.setSound(Uri.fromFile("/system/media/audio/ringtones/文件")
//设置振动,第一个参数表示静止时长,第二个参数表示振动时长,以此类推
.setVibrate(new long[]{0,1000,1000,1000})
//设置LED灯闪烁,第一个参数表示颜色,第二个参数表示亮起时长
//第三个参数表示暗去时长
.setLights(Color.GREEN,1000,1000)
//设置默认通知效果
.setDefaults(Notification.DEFAULT_ALL)
.build();
注意,设置振动需要声明权限:
<uses-permission android:name="android.permission.VIBRATE"/>
Notification notification=new NotificationCompat.Builder(context)
...
//显示长文本
.setStyle(new NotificationCompat.BigTextStyle().bigText("长文本内容"))
//显示大图片
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(Bitmap
-Factory.decodeResource(getResources(),R.drawable.big_image)))
//设置优先级
setPriority(NotificationCompat.PRIORITY_MAX)
.build();
// 创建File对象,用于存储拍照后的图片
File outputImage = new File(getExternalCacheDir(), "output_image.jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT < 24) {
imageUri = Uri.fromFile(outputImage);
} else {
imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cameraalbumtest.fileprovider", outputImage);
}
// 启动相机程序
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
这段代码的作用是创建File对象,用于存储拍照后的照片。实现的主要思路就是先在内存中创建一个File并获得他的Uri,然后启动相机程序,并设置intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
将拍出来的照片存放到指定Uri的内存空间。
另外,FileProvider是一个特殊的内容提供器,用于对真实的Uri进行封装以提高安全性
接下来在onActivityResult中接收结果并显示图片:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PHOTO:
if (resultCode == RESULT_OK) {
try {
// 将拍摄的照片显示出来
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
}
break;
default:
break;
}
}
然后在AndroidManifest.xml中对内容提供器进行注册:
<provider
android:name="android.support.v4.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false"
//android:authorities的值要与FileProvider.getUriForFile()的第二个参数值保持一致
android:authorities="com.example.cameraalbumtest.fileprovider">
//
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
创建file_path.xml文件:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path path="" name="my_images"/>
</paths>
这里external-path用来指示Uri共享的,name属性可以随便修改,path属性为空表示将整个SD卡进行共享
最后声明一下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这样就可以完成拍照并存储照片到手机里的功能了~