这里写目录标题
安装应用程序到手机
- 打开其他选项,找到开发者选项,打开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();
}
}
- 申请权限同音频
本篇博客浅谈了 如何真机测试, 通知使用技巧,调用摄像头,从相册选取图片,播放音频 及 视频文件这几方面内容,如果对您有帮助的话,是我的荣幸,谢谢观看~不忘点个赞哟♥