通知之 Pending&播放多媒体&调用相册摄像头

安装应用程序到手机

  • 打开其他选项,找到开发者选项,打开USB调试,如果AS一直识别不到手机,检查一下SDK Tools有个USB Devier是否下载了,下载一个360手机助手或者豌豆荚

使用通知

通知的基本用法

//getSystemService()接受一个字符串,确定获取系统的哪个服务
case R.id.send_notice:
	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(getResource(),R.drawable.large_icon));
																 	//decodeResourse(Resource,int id) 从指定id,指定文件中解析Bitmap对象,降低相片像素
																 	.build();
	 	//显示一个通知
		manager.notify(1,notification);
PendingIntent
  • 与intent异同:
    同:都用于启动活动,启动服务即发送广播
    异:intent趋向于 立即执行,pendingIntent等到合适时机才执行,可理解为延迟执行

  • 提供静态方法

    • getActivity() ,getBroadcast() ,getService()
    • 参数:Context,0,Intent对象,PendingIntent行为
  • PendingIntent行为有:FLAG_ONE_SHOT ,FALG_NO_CREATE ,FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_CURRENT

跳转活动
//创建新活动 NotificationActivity

//MainActivity
//case R.id.send_notice:
		
	//表达启用对象意图
	Intent intent=new Intent(this,NotificationActivity.class);
	//把intent对象放到pendIntent里
	PendingIntent pi=PengdingIntent.getActivity(this,0,intent,0);
	...
				.setContentIntent(pi)
	
设置未取消前通知一直在页面上的两种方法
  • NotificationCompat.Builder 连缀 SetAutoCancel(true)
    传入true 表示点击这个通知时,通知会取消掉

  • 在NotificationActivity中

public void onCreate(...){
	...
	NotificationManager manager=(NotificationManager)getSystemsService(NOTIFICATION_SERVICE);
	//上文 notify(1,notification),想取消那条消息,传入哪条消息id即可
	manager.canncel(1);
}

通知的进阶技巧

通知发出时播放音频
			.setSound(Uri.fromFile(new File("/System/media/audio/rightones/Luna.ogg")))
通知时振动
  • 开启权限
<uses-permission  android:name="android.permission.VIBRATE"/>
  • 设置
//长整型数组,为偶数的下标表示静止,奇数为振动
//让手机振动1s,停止1s,振动1s,写法如下:
.setVibrate(new Long[]{0,1000,1000,1000})
控制LED灯显示
		//颜色,亮的时间,灭的时间,以毫秒为单位
		.setLights(Color.GREEN,1000,1000);
通知的默认效果
.setDefaults(NotificationsCompat.DEFAULT_ALL)

通知的高级技巧

setStyle
  • BigTextString 封装长文字信息
		//调用BIigTextStyle的bigText传入即可
		.setStyle(new NotificationCompat.BigTextStyle().bigText("If you can face them head on,you will find out how strong you really are,which is from Mary.Alice"))
  • BigPictureStyle
//decodeResource解析成Bitmap对象传入bigPicture
.setStyle(new NotificationCompat.BigPictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big_image)))

调用摄像头和相册

调用摄像头拍照
  • 设置布局文件
    Button 和 imageView,后者用于将拍摄的图片显示出来

  • MainActivity

public class MainActivity extends AppCompatActivity{
	public static final int TAKE_PHOTO=1;
	private ImageView picture;
	private Uri imageUri;
	protected void onCreate(Bundle saveInstance){
		super.onCreate(saveInstance);
		setContentView(R.id.layout_main);
		//获取Button,imageVIew实例
		BUtton takePhoto=(Button)findViewById(R.id.take_photo);
		picture=(ImageView)findViewById(R.id.picture);
		//注册点击事件
		takePhoto.setOnClickListener(new View.OnClickListener(){
			public void onClick(View v){
			 //创建文件,存放图片
			 //getExternalCacheDir找到SD卡应用关联缓存目录
			 //Android 6.0之后读写SD卡变成危险权限,储存在SD应用相关缓存目录可跳过运行时权限处理这一步
				File outputImage=new File(getExternalCacheDir()."output_image.jpg");
				try{
					if(outputImage.exists()){
						outputImage.delete();
					}
					outputImage.createNewFile();
				}catch(IOException e){
					e.printStackTrace();
				}
				//Build.VERSION.SDK_INT表示操作系统版本号
				if(Build.VERSION.SDK_INT>=24){
					imageUri=FileProvider.getUriForFile(MainActivity.this,"com.example.cameraablebumtest.fileprovider",outputImage);
				}else{
					imageUri=Uri.fromFile(outputImage);
				}
			//启动照相机程序
			//构建intent对象,指定action
				Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
				//putExtra指定输出图片地址
				intent.puExtra(MediaStore.EXTRA_OUTPUT,imageUri);
				//启动活动
				startActivityForResult(intent,TYPE_PHOTO);
			}
		});
	}
	
	protected void onActivityResult(int requestCode,int resultCode,Intent data){
		switch(requestCode){
			//拍照成功,调用BigmapFactory解析图片,在image_view中显示出来
			case TAKE_PHOTO:
				if(resultCode==RESULT_OK){
					try{
					//将拍摄的图片显示出来
						Bitmap bitmap=new BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
						picture.setImageBitmap(bitmap);
					}catch(IOExeption e){
						e.printStackTrace();
					}
				}
				break;
			default:
				break;	
		}
	}
}
从相册中选择图片

-startActivityForResult(Intent intent,int requestCode)打开新活动,新活动关闭后,向新活动传递数据,并通过重写onActivityResult()获取数据

//指定intent的action为GET_CONTENT
//intent设置参数
//startActivityForResult

	public static final int CHOOSE_PHOTO=2;
		...
		//正常申请权限操作
		chooseFormAlbum.setOnClickListener(new View.OnClickListener(){
			public void onClick(View v){
				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();
				}
		});
	}
	
	public void openAlbum(){
		Intent intent=new Intent("android.intent.action.GET_CONTENT");
		intent.setType("image/*"); //选择图片
		//setType("audio/*") 选择音频
		//setType("video/*") 选择视频
		startActivityForResult(intent,CHOOSE_PHOTO);
	} 
	
	//请求权限
	public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
		switch(requestCode){
			case 1:
				if(grandResults.length()>0&&grandResults[0]==PackageManager.PERMISSION_GRANTED){
					openAlbum();
				}else{
					Toast...
				}
				break;
			...	
		}
	}


	//处理从相册中选择的图片
	protected void onActivityResult(int requestCode,int resultCode,Intent data){
		switch(requestCode){
			..
			case CHOOSE_PHOTO:
				if(resultCode==RESULT_OK){
					//查看手机版本号
		/*			if(Builder.VERSION.SDK_INT>=19){
					//Android版本小于4.4,因为这个版本比较老旧了
					//我就不介绍这个版本的处理了
							handleImageOnKitKat(data);
					}else{   */
						handleImageBeforeKitKat(data);
					//}
				}
				break;
				...
		}
	}
	...
	private void handleImageBeforeKitKat(Intent data){
		//设uri实例,拿到图片信息
		Uri uri=data.getdata();
		//getImagePath获真实路径
		String imagePath=getImagePath(uri,null);
		//让图片显示到界面上
		displayImage(imagePath);
	}
	
	//该部分解答,可见下文链接:内容提供器
	private String getImagePath(Uri uri,String selection){
		String path=null;
		Cursor cursor=getContentResolver().query(uri,null,selection,null,null);
		if(cursor!=null){
			if(cursor.moveToFirst()){
			//getColumnIndex获取该列数据索引
				path=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
			}
			cursor.close();
		}
		return path;
	}
	
	private void displayImage(String imagePath){
		if(imagePath!=null){
			//解析成bitmap形式
			Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
			picture.setImageBitmap(bitmap);
		}else{
			Toast...
		}
	}
}	

内容提供器

播放多媒体文件

播放音频
  • MediaPlayer类中常用的控件方法

在这里插入图片描述

  • 若对于申请权限相关知识请参见
    权限设置
  • 代码
//思路为: 建对象,申请权限,case,销毁资源


//创建MediaPlayer对象
private MediaPlayer musicPlayer=new MediaPlayer();

	public on onCreate...
	...
		//SD卡访问权限
		if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
			ActivityCompat.requestPermissions(MainActivity.class,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
		}else{
			initMediaPlayer();  //初始化MediaPlayer
		}
	
		private void initMediaPlayer(){
			try{
				File file=new  File(Environment.getExternalStorageDirectory(),"music.mp3");
				//setDataSource 设置音频文件路径
				mediaPlayer.setDataSource(file.getPath());
				//调用prepare()使MediaPlayer进入准备状态--与Resume同
				mediaPlayer.prepare();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		private void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grandResults){
			if(grandResults.length>0&&grandResults[0]==PackageManger.PERMISSION_GRANTED){
				initMediaPlayer();
			}else{
				...
				//拒绝申请 调用finish将程序关掉
				finish();
			}
			...
		}
	public void onClick(View v){
		switch(View v){
			case R.id.play:
			//start开始播放音频
				mediaPlayer.start();
				break;
			//pause暂停播放
			case R.id.pause:
				mediaPlayer.pause();
				break;
			//reset停止播放--与stop同,在Git中用作撤销操作
			case R.id.stop:
				//均先需判断一下有没有在播放
				if(mediaPlayer.isPlaying()){  
				//reset() 将MediaPlayer重新设成了刚刚创建的状态
					mediaPlayer.reset();  
					initMediaPlayer();
				}		
		}
	
		//将MediaPlayer相关资源关掉
		protected void onDestory(){
			super.onDestory();
			if(mediaPlayer!=null){
				mediaPlayer.stop();
				mediaPlayer.release();
			}
		}
	}
  • AndroidManifest.xml
<uses-permission android:name="android:permission.WRITE_EXTERNAL_STORAGE">
播放视频
  • 视频播放器常用方法

与音频相比,少了release,stop,reset,音频设置要播放的文件位置方法setDataResource变为了setVideoPath
在这里插入图片描述

  • 代码
//播放视频与播放音频原理相通,只有小部分代码有差别:
	...
		private void initViedoPath(){
			File file=... //获取文件对象
			videoView.setVideoPath(file.getPath);
		}

		protected void onDestory(){
			super.onDestory();
			if(videoView!=null){
			//如果是音频 是 stop,release
				/*mediaPlayer.stop();
				mediaPlayer.release();*/
				videoView.suspend();
			}
		}
		
  • 申请权限同音频

本篇博客浅谈了 如何真机测试, 通知使用技巧,调用摄像头,从相册选取图片,播放音频 及 视频文件这几方面内容,如果对您有帮助的话,是我的荣幸,谢谢观看~不忘点个赞哟♥

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blog....

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值