使用通知(Notification)
通知的用法相对灵活,可以在活动里创建,也可以在广播接收器里创建,或是在服务里创建,以后两者居多
package cn.ywrby.notificationtest;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.core.app.NotificationCompat;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button send_notice=findViewById(R.id.bt_notification);
send_notice.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_notification:
//Intent与PendingIntent十分类似,不过从实际使用的角度,Intent更强调立即执行
//PendingIntent更加倾向于在某个合适的时机执行动作
//PendingIntent的获取方式就是通过PendingIntent的静态方法getActivity,getBroadcast,getService来获取
//第一个参数依旧是Context,第二个一般设为0,第三个传入Intent对象,第四个用于确定PendingIntent行为,通常传入0
Intent intent=new Intent(this,NotificationActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,0);
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification=new NotificationCompat.Builder(this,"1")
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.notice)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.title))
.setContentIntent(pendingIntent) //setContentIntent接收的参数正是一个pendingIntent类型,当用户点击时,执行相关的逻辑
//.setAutoCancel(true) //自动关闭通知栏(点击之后),还可以显式调用NotificationManager的cancle方法将其取消
.build();
manager.notify(1,notification);
break;
default:
break;
}
}
}
package cn.ywrby.notificationtest;
import android.app.NotificationManager;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class NotificationActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_layout);
//显式调用方法将其取消
NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.cancel(1); //这里的1是一开始为这条通知设置的ID
}
}
通知的进阶技巧
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Tuba.ogg"))) //在通知发出时播放一段音频
.setVibrate(new long[] {0,1000,1000,1000}) //设置震动并配置相关系数
.setLights(Color.GREEN,1000,1000) //设置呼吸灯参数
.setDefaults(NotificationCompat.DEFAULT_ALL) //直接使用系统默认的通知效果
.setPriority(NotificationCompat.PRIORITY_MAX) //重要程度设置为最高,会立刻显示在屏幕上方,谨慎使用
.setStyle(new NotificationCompat.BigTextStyle().bigText("9月18日,华为全联接2019(HUAWEI CONNECT)大会上,华为副董事长胡厚崑发布了Atlas " +
"900 AI训练集群,以超强算力带给企业人工智能业务的极致体验。世界正从数字化向智能化转型,人工智能产业作为关键驱动力,面临自身的升级进化的挑战。" +
"华为在超强人工智能算力和大规模分布式AI训练集群两个方面加速智能化世界的转型。")) //利用setStyle的BigTextStyle显式长文字内容
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture
(BitmapFactory.decodeResource(getResources(),R.drawable.photo))) //通知栏显式大图
在模拟器上正常运行,在华为mate7上文字无法显式,设置图片导致应用闪退,立即通知功能需要手动开启
调用摄像头或相册
package cn.ywrby.cameraalbumtest;
import android.Manifest;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.annotation.Target;
public class MainActivity extends AppCompatActivity {
public static final int TAKE_PHOTO=1;
public static final int CHOOSE_PHOTO=2;
private ImageView picture;
private Uri imageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button takePhoto=findViewById(R.id.bt_takephoto);
picture=findViewById(R.id.iv_picture);
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建File对象,用于存储拍摄后的图像文件
//getExternalCacheDir方法可以获取应用的关联缓存目录,将文件保存到这个目录不需要进行权限的申请
File outputImage=new File(getExternalCacheDir(),"output_image.jpg");
try{
//删除可能存在的之前缓存的文件
if(outputImage.exists()){
outputImage.delete();
}
//创建新的图像文件
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//由于Android版本不同,这里采用两种不同的方法将File对象转换成Uri对象来标记图片位置
if(Build.VERSION.SDK_INT>=24){
imageUri= FileProvider.getUriForFile(MainActivity.this,"cn.ywrby.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,TAKE_PHOTO);
}
});
//开启相册
Button choosePhoto=findViewById(R.id.bt_choosephoto);
choosePhoto.setOnClickListener(new View.OnClickListener() {
@Override
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();
}
}
});
}
//startActivityForResult拍摄结果返回到onActivityResult方法
//之后再利用onActivityResult方法将这张图片显示在控件上
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
//拍照
case TAKE_PHOTO:
if(resultCode==RESULT_OK){
try{
//将图片解析成Bitmap对象,放置到ImageView中
Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
//选择相片
case CHOOSE_PHOTO:
if(resultCode==RESULT_OK){
if(Build.VERSION.SDK_INT>=19){
handleImageOnKitKat(data);
}else {
handleImageBeforeKitKat(data);
}
}
default:
break;
}
}
//打开相册动作
private void openAlbum(){
Intent intent=new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,CHOOSE_PHOTO);
}
//获取请求权限结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull 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:
}
}
//针对Android4.4以上版本解析数据
@TargetApi(19)
private void handleImageOnKitKat(Intent data){
String imagePath=null;
Uri uri=data.getData();
if(DocumentsContract.isDocumentUri(this,uri)){
String docID=DocumentsContract.getDocumentId(uri);
if("com.android.providers.media.documents".equals(uri.getAuthority())){
String id=docID.split(":")[1];
String selection=MediaStore.Images.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())){
imagePath=getImagePath(uri,null);
}else if("file".equalsIgnoreCase(uri.getScheme())){
imagePath=uri.getPath();
}
displayImage(imagePath);
}
//针对Android4.4之前的版本
private void handleImageBeforeKitKat(Intent data){
Uri uri=data.getData();
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.moveToNext()){
path=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
//摆放图片至控件处
private void displayImage(String imagePath){
if(imagePath!=null){
Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
picture.setImageBitmap(bitmap);
}else {
Toast.makeText(this,"failed to get image!",Toast.LENGTH_SHORT).show();
}
}
}
播放多媒体文件
播放音频
主要涉及的就是MediaPlayer的使用
package cn.ywrby.mediaplayertest;
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.IOException;
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 bt_play=findViewById(R.id.bt_play);
Button bt_pause=findViewById(R.id.bt_pause);
Button bt_replay=findViewById(R.id.bt_replay);
bt_play.setOnClickListener(this);
bt_pause.setOnClickListener(this);
bt_replay.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();
}
}
public void initMediaPlayer(){
try {
//获取音频文件路径
File file=new File(Environment.getExternalStorageDirectory(),"music.mp3");
//设置要播放的音频文件的位置
mediaPlayer.setDataSource(file.getPath());
//进入播放前的准备状态
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length>0 &&grantResults[0]== PackageManager.PERMISSION_GRANTED){
initMediaPlayer();
}else {
Toast.makeText(this,"拒绝权限将无法使用该功能!",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_play:
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();
}
break;
case R.id.bt_pause:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
break;
case R.id.bt_replay:
if(mediaPlayer.isPlaying()){
mediaPlayer.reset();
initMediaPlayer();
}
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mediaPlayer!=null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
播放视频
主要就是利用VideoView类来实现
package cn.ywrby.videoviewtest;
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.widget.VideoView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private VideoView videoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView=findViewById(R.id.vv_video);
Button bt_play=findViewById(R.id.bt_play);
Button bt_pause=findViewById(R.id.bt_pause);
Button bt_replay=findViewById(R.id.bt_replay);
bt_play.setOnClickListener(this);
bt_pause.setOnClickListener(this);
bt_replay.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{
initVideoPath();
}
}
public void initVideoPath(){
File file=new File(Environment.getExternalStorageDirectory(),"movie.mp4");
videoView.setVideoPath(file.getPath());
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length>0 &&grantResults[0]== PackageManager.PERMISSION_GRANTED){
initVideoPath();
}else {
Toast.makeText(this,"拒绝权限将无法使用该功能!",Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_play:
if(!videoView.isPlaying()){
videoView.start();
}
break;
case R.id.bt_pause:
if(videoView.isPlaying()){
videoView.pause();
}
break;
case R.id.bt_replay:
if(videoView.isPlaying()){
videoView.resume();
}
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(videoView!=null){
videoView.suspend();
}
}
}