基本用法
先使用Context类的getSystemService()方法获取NotificationManager对象:
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
接着使用support-v4库中的NotificationCompat类的build()方法来创建Notification对象:
Notification notification = new NotificationCompat.Builder(context).build();
我们可以在最终的build()方法之前连缀任意多的设置方法来创建一个丰富的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();
上述工作都完成之后,只需要调用NotificationManager的notify()方法就可以显示通知了:
//参数1:通知的id;参数2:Notification对象
manager.notify(1,notification);
PendingIntent可以简单地理解为延迟执行的Intent,使用PendingIntent可以给通知增加点击事件,
在build()方法之前可以使用setContentIntent(PendingIntent p)方法设置点击事件,具体用法:
Intent intent = new Intent(this,NotificationActivity.class);
//参数1:Context;参数2:通常用不掉,传入0即可;参数3:Intent对象
//参数4:确定PendingIntent的行为,通常传入0就可以了
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
NotificationManager manager = (NotificationManager)getSystemService(
Context.NOTIFICATION_SERVICE);
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))
.setContentIntent(pi)//构建延迟执行的意图,通知点击事件
.build();
进阶用法
给通知设置播放的音频文件:
//setSound()方法传入的参数是Uri对象
Notification notification = new NotificationCompat.Builder(this)
...
.setSound(Uri.fromFile(new File
("/system/media/audio/ringtones/luna.ogg")))
.build();
给通知设置振动效果:
//传入参数是long型数组,下标为0的值表示静止的时长,下标为1的值表示振动的时长,
//下标为2的值表示静止的时长,下标为3的值表示振动的时长,以此类推
//单位是毫秒
Notification notification = new NotificationCompat.Builder(this)
...
.setVibrate(new long[]{0,1000,1000,1000})
.build();
要想控制手机振动还需要声明权限:
给通知设置LED灯闪烁效果:
//参数1:指定LED灯的颜色;参数2:LED灯亮起的时长;参数3:LED灯暗去的时长
Notification notification = new NotificationCompat.Builder(this)
...
.setLights(Color.GREEN,1000,1000)
.build();
使用通知的默认效果,它会根据当前手机的环境来决定播放什么铃声及如何振动:
Notification notification = new NotificationCompat.Builder(this)
...
.setDefault(NotificationCompat.DEFAULT_ALL)
.build();
高级用法
在通知中显示长文本:
Notification notification = new NotificationCompat.Builder(this)
...
.setStyle(new NotificationCompat.
BigTextStyle().bigText("..."))
.build();
在通知中显示大图片:
Notification notification = new NotificationCompat.Builder(this)
...
.setStyle(new NotificationCompat.BigPictureStyle().
bigPicture(BitmapFactory.decodeResource(getResources(),
R.drawable.big_image)))
.build();
设置通知的重要程度:
Notification notification = new NotificationCompat.Builder(this)
...
.setPriority(NotificationCompat.PRIORITY_MAX)
.build();
setPriority()方法传入的参数一共有5个常量值可选:
PRIORITY_DEFAULT:默认重要程度,和不设置一样
PRIORITY_MIN:最低重要程度,只在特定场景才显示这条通知,比如用户下拉状态栏的时候
PRIORITY_LOW:较低重要程度,系统可能会将这类通知缩小,或改变其显示的顺序,将其排在更重要的通知之后
PRIORITY_HIGH:较高重要程度,系统可能会将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置
PRIORITY_MAX:最高重要程度,这类通知消息必须要让用户立刻看到,甚至需要用于做出响应操作
调用摄像头拍照
核心代码:
onClick(){
//创建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){
//参数1:Context对象;参数2:任意唯一的字符串,即调用的内容提供器
//里的内容Uri;参数3:File对象
imageUri = FileProvider.getUriForFile(MainActivity.this,
"com.example.cameraalbumtest.fileprovider",outputImage);
}else{
imageUri = Uri.fromFile(outputImage);
}
//隐式启动相机程序
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//指定图片的输出地址
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,1);
}
onActivityResult(int requestCode,int resultCode,Intent data){
switch(requestCode){
case 1:
if(resultCode == RESULT_OK){
try{
//将拍摄的照片显示出来
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(imageUri));
picture.setImageBitmap(bitmap);
}catch(FileNotFoundException e){
...
}
}
break;
default:
break;
}
}
前面用到了内容提供器,所以需要在AndroidManifest.xml中进行注册:
这里在
external-path用来指定Uri共享的,path的值表示共享的具体路径,这里设置空值表示将整个SD卡进行共享,也可以仅共享自己指定的路径。
在Android4.4系统之前,访问SD卡的应用关联目录需要声明权限,为了兼容老版本的手机,需要在AndroidManifest.xml中声明一下访问SD卡的权限:
...
从相册中选择照片
核心代码:
onClick(){
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{
openAlbum();
}
}
openAlbum(){
Intent intent = new intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
//打开相册
startActivityForResult(intent,2);
}
onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults){
switch(requestCode){
case 1:
if(grantResults.length>0 && grantResults[0]==PackageManager.
PERMISSION_GRANTED){
openAlbum();
}else{
Toast.makeText(this,"you denied the permission",Toast.
LENGTH_SHORT).show();
}
break;
default:
}
}
//根据不同版本系统,分别处理选取后的图片
onActivityResult(int requestCode,int resultCode,Intent data){
switch(requestCode){
case 2:
if(resultCode==RESULT_OK){
if(Build.VERSION.SDK_INT>=19){
handleImageOnKitKat(data);
}else{
handleImageBeforeKitKat(data);
}
}
break;
default:
break;
}
}
handleImageOnKitKat(Intent data){
String imagePath = null;
Uri uri = data.getData();
if(DocumentsContract.isDocumentUri(this,uri)){
//如果是document类型的Uri,通过document id处理
String docId = DocumentContract.getDocumentId(uri);
if("com.android.providers.media.documents"
.equals(uri.getAuthority())){
String id = docId.split(":")[1];//解析出数字格式的id
String selection = MediaStore.Image.Media._ID + "=" +id;
imagePath = getImagePath(MediaStore.Images.Media.
EXTERNAL_CONTENT_URI,selection);
}else if("com.android.providers.downloads.documents"
.equals(uri. getAuthority())){
Uri contentUri = ContentUris.withAppendedId(Uri.
parse("content://downloads/public_downloads"),Long.valueOf(docId));
imagePath = getImagePath(contentUri,null);
}
}else if("content".equalsIgnoreCase(uri.getScheme())){
//如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(uri,null);
}else if("file".equalsIgnoreCase(uri.getScheme())){
//如果是file类型的Uri,直接获取图片路径即可
imagePath = uri.getPath();
}
displayImage(imagePath);//根据图片路径显示图片
}
handleImageBeforeKitKat(Intent data){
Uri uri = data.getData();
String imagePath = getImagePath(uri,null);
displayImage(imagePath);
}
String getImagePath(Uri uri,String selection){
String path = null;
//通过Uri和selection来获取真实的图片路径
Cursor cursor = getContentResolver().query(uri,null,selection,null,null);
if(cursor!=null){
if(cursor.moveToFirst()){
path = cursor.getString(cursor.getColumnIndex(MediaStore.
Images.Media.DATA));
}
cursor.close();
}
return path;
}
displayImage(String imagePath){
if(imagePath!=null){
//将图片真实路径转换为Bitmap对象
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
picture.setImageBitmap(bitmap);
}else{
Toast.makeText(this,"failed to get image",Toast.LENGTH_SHORT).show();
}
}
另外还要在AndroidManifest.xml中声明用到的权限:
...
常用方法:
方法名 |
功能描述 |
setDataSource() |
设置要播放的音乐文件的位置 |
prepare() |
在开始播放之前调用这个方法完成准备工作 |
start() |
开始或继续播放音乐 |
pause() |
暂停播放音乐 |
reset() |
将MediaPlayer对象重置到刚刚创建的状态 |
seekTo() |
从指定位置开始播放音乐 |
stop() |
停止播放音乐。调用这个方法后的MediaPlayer对象无法再播放音乐 |
release() |
释放掉与MediaPlayer对象相关的资源 |
isPlaying() |
判断当前是否正在播放音乐 |
getDuration() |
获取载入的音乐文件的时长 |
代码实现(需要先在SD卡根目录下放置music.mp3文件):
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private 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();
}
}
private void initMediaPlayer(){
try{
File file = new File(Environment.getExternalStorageDirectory(),"music.mp3");
mediaPlayer.setDataSource(file.getPath());
mediaPlayer.prepare();
}catch(Exception e){
e.printStackTrace();
}
}
public void onRequestPermissionResult(int requestCode,String[] permissions,int[]
grantResults){
switch (requestCode){
case 1:
if(grantResults.length>0&&grantResults[0]==
PackageManager.PERMISSION_GRANTED){
initMediaPlayer();
}else{
Toast.makeText(this,"you denyed this applicaiton get
permission",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
break;
}
}
@Override
public void onClick(View v) {
switch(v.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.reset();
initMediaPlayer();
}
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
记得在AndroidManifest.xml里声明用到的权限:
...
常用方法:
方法名 |
功能描述 |
setVideoPath() |
设置要播放的视频文件的位置 |
start() |
开始或继续播放视频 |
pause() |
暂停播放视频 |
resume() |
将视频从头开始播放 |
seekTo() |
从指定的位置开始播放视频 |
isPlaying() |
判断当前是否正在播放视频 |
getDuration() |
获取载入的视频文件的时长 |
核心代码:
VideoView videoView;
onCreate(){
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();
}
}
initVideoPath(){
File file = new File(Environment.getExternalStorageDirectory(), "movie.mp4");
//传入视频文件的路径
videoView.setVideoPath(file.getPath());
}
onRequestPermissionResult(int requestCode,String[] permissions,int[] grantResults){
switch (requestCode){
case 1: if(grantResults.length>0&&grantResults[0]==
PackageManager .PERMISSION_GRANTED){
initVideoPath();
}else{
Toast.makeText(this,"you denyed this applicaiton get
permission",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
break;
}
}
onClick(View v){
switch(v.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;
}
}
依旧要记得在AndroidManifest.xml里声明用到的权限:
...