【Anroid学习笔记】通知、拍照、音乐播放、视频播放

通知

基本用法

先使用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中进行注册:

 
     
                   
     

 

这里在标签中指定了Uri的共享路径,并引用了一个@xml/files_paths资源,接下来创建file_paths.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里声明用到的权限:

 
     
    ... 


你可能感兴趣的:(Android学习笔记)