本系列学习笔记第8章

前言

打算把android基本知识点写一个系列,旨在把android基础书,例如《Android 第一行代码 第2版》、《爱上android》、《疯狂android讲义》等书的一些知识点记录一下,会持续更新内容,为了方便自己复习,也希望可以帮助到大家!

1、使用通知

通知是android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容。

1.1 通知的基本用法

activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>    

activity_notification.xml文件

<?xml version="1.0" encoding="utf-8"?>    

NotificationActivity.java文件

public class NotificationActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_notification);        //取消通知的另外一种写法//        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//        manager.cancel(1);    }}

MainActivity.java文件

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button btnSend = (Button) findViewById(R.id.btn_send);        btnSend.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                initNotification();            }        });    }    /**     *     */    private void initNotification() {        //设置延迟意图:跳转到下一页        Intent intent = new Intent(this,NotificationActivity.class);        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);        //设置标题        builder.setContentTitle("美女来了");        //设置内容        builder.setContentText("美女来了美女来了美女来了");        //设置时间        builder.setWhen(System.currentTimeMillis());        //设置小图标        builder.setSmallIcon(R.mipmap.ic_launcher);        //设置大图标        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));        //配置延迟意图        builder.setContentIntent(pendingIntent);        //自动取消        builder.setAutoCancel(true);        Notification notification = builder.build();        manager.notify(1,notification);    }}

1.2 通知的进阶技巧

查看系统下音频文件


image.png
    
   /**     *     */    private void initNotification() {        //设置延迟意图:跳转到下一页        Intent intent = new Intent(this,NotificationActivity.class);        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);        //设置标题        builder.setContentTitle("美女来了");        //设置内容        builder.setContentText("美女来了美女来了美女来了");        //设置时间        builder.setWhen(System.currentTimeMillis());        //设置小图标        builder.setSmallIcon(R.mipmap.ic_launcher);        //设置大图标        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));        //配置延迟意图        builder.setContentIntent(pendingIntent);        //自动取消        builder.setAutoCancel(true);        //设置声音        builder.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")));        //设置震动        builder.setVibrate(new long[]{0,1000,1000,1000});        //设置灯光        builder.setLights(Color.RED,1000,1000);        //默认设置//        builder.setDefaults(NotificationCompat.DEFAULT_ALL);        Notification notification = builder.build();        //注册        manager.notify(1,notification);    }

1.3 通知的高级功能

   /**     *     */    private void initNotification() {        //设置延迟意图:跳转到下一页        Intent intent = new Intent(this,NotificationActivity.class);        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);        //设置标题        builder.setContentTitle("美女来了");        //设置内容        builder.setContentText("美女来了美女来了美女来了");        //设置时间        builder.setWhen(System.currentTimeMillis());        //设置小图标        builder.setSmallIcon(R.mipmap.ic_launcher);        //设置大图标        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));        //配置延迟意图        builder.setContentIntent(pendingIntent);        //自动取消        builder.setAutoCancel(true);        //设置声音        builder.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")));        //设置震动        builder.setVibrate(new long[]{0,1000,1000,1000});        //设置灯光        builder.setLights(Color.RED,1000,1000);        //默认设置//        builder.setDefaults(NotificationCompat.DEFAULT_ALL);        //设置长文本//        builder.setStyle(new NotificationCompat.BigTextStyle(builder).bigText("我哦哦看空的咔咔咔的口袋空空的口袋空空的看空" +//                "看多空咔咔咔咔咔咔的坎坎坷坷快快赌东道赌东道赌东" +//                "反反复复反反复复反反复复反反复复反反复复道赌东道赌东道赌东道赌东道赌东道"));        //设置大图        builder.setStyle(new NotificationCompat.BigPictureStyle(builder).bigPicture(BitmapFactory.decodeResource(getResources(),R.mipmap.timg)));        //设置优先级:默认是PRIORITY_DEFAULT        builder.setPriority(NotificationCompat.PRIORITY_MAX);        Notification notification = builder.build();        //注册        manager.notify(1,notification);    }

2、调用摄像头拍照

应用关联缓存目录:
是指SD卡中专门用于存放当前应用缓存数据的位置,调用getExternalCacheDir()方法可以得到这个目录,具体路径是/sdcard/Android/data/包名/cache 下。对这个目录进行读写操作,可以避开android6.0运行时权限处理。

file_paths.xml文件


image.png
<?xml version="1.0" encoding="utf-8"?>            

AndroidManifest.xml文件

 
                            

activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>    

MainActivity.java文件

public class MainActivity extends AppCompatActivity {    public static final int TAKE_PHOTO = 1;    private ImageView picture;    private Uri imageUri;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button takePhoto = (Button) findViewById(R.id.btn_camera);        picture = (ImageView) findViewById(R.id.iv_picture);        takePhoto.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 创建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) {                    imageUri = Uri.fromFile(outputImage);                } else {                    imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cameraalbumdemo.fileprovider", outputImage);                }                // 启动相机程序                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);                startActivityForResult(intent, TAKE_PHOTO);            }        });    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        switch (requestCode) {            case TAKE_PHOTO:                if (resultCode == RESULT_OK) {                    try {                        // 将拍摄的照片显示出来                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));                        picture.setImageBitmap(bitmap);                    } catch (Exception e) {                        e.printStackTrace();                    }                }                break;            default:                break;        }    }}
image.png

3、选择相册中的照片

AndroidManifest.xml

    

activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>    

MainActivity.java文件

public class MainActivity extends AppCompatActivity {    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 chooseFromAlbum = (Button) findViewById(R.id.btn_picture);        picture = (ImageView) findViewById(R.id.iv_picture);        chooseFromAlbum.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();                }            }        });    }    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, 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:        }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        switch (requestCode) {            case CHOOSE_PHOTO:                if (resultCode == RESULT_OK) {                    // 判断手机系统版本号                    if (Build.VERSION.SDK_INT >= 19) {                        // 4.4及以上系统使用这个方法处理图片                        handleImageOnKitKat(data);                    } else {                        // 4.4以下系统使用这个方法处理图片                        handleImageBeforeKitKat(data);                    }                }                break;            default:                break;        }    }    @TargetApi(19)    private void handleImageOnKitKat(Intent data) {        String imagePath = null;        Uri uri = data.getData();        Log.d("TAG", "handleImageOnKitKat: uri is " + uri);        if (DocumentsContract.isDocumentUri(this, uri)) {            // 如果是document类型的Uri,则通过document id处理            String docId = DocumentsContract.getDocumentId(uri);            if("com.android.providers.media.documents".equals(uri.getAuthority())) {                String id = docId.split(":")[1]; // 解析出数字格式的id                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())) {            // 如果是content类型的Uri,则使用普通方式处理            imagePath = getImagePath(uri, null);        } else if ("file".equalsIgnoreCase(uri.getScheme())) {            // 如果是file类型的Uri,直接获取图片路径即可            imagePath = uri.getPath();        }        displayImage(imagePath); // 根据图片路径显示图片    }    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;        // 通过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;    }    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();        }    }}
image.png

4、播放音频

image.png
image.png

AndroidManifest.xml文件

    

activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>    

MainActivity.java文件

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(); // 初始化MediaPlayer        }    }    private void initMediaPlayer() {        try {            File file = new File(Environment.getExternalStorageDirectory(), "a.mp3");            mediaPlayer.setDataSource(file.getPath()); // 指定音频文件的路径            mediaPlayer.prepare(); // 让MediaPlayer进入到准备状态        } catch (Exception e) {            e.printStackTrace();        }    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        switch (requestCode) {            case 1:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    initMediaPlayer();                } else {                    Toast.makeText(this, "拒绝权限将无法使用程序", Toast.LENGTH_SHORT).show();                    finish();                }                break;            default:        }    }    @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();        }    }}
image.png

5、播放视频

image.png image.png image.png

AndroidManifest.xml文件

    

activity_main.xml文件

<?xml version="1.0" encoding="utf-8"?>            

MainActivity.java文件

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 = (VideoView) findViewById(R.id.video_view);        Button play = (Button) findViewById(R.id.play);        Button pause = (Button) findViewById(R.id.pause);        Button replay = (Button) findViewById(R.id.replay);        play.setOnClickListener(this);        pause.setOnClickListener(this);        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(); // 初始化MediaPlayer        }    }    private void initVideoPath() {        File file = new File(Environment.getExternalStorageDirectory(), "a.mp4");        videoView.setVideoPath(file.getPath()); // 指定视频文件的路径    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, 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.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;        }    }    @Override    protected void onDestroy() {        super.onDestroy();        if (videoView != null) {            videoView.suspend();        }    }}
image.png

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android中下拉通知栏,Activity会走哪些生命周期?
  6. [Android(安卓)基础] -- 深入理解 Android(安卓)Build 系统
  7. Android之工程目录介绍
  8. Android(安卓)Proguard介绍
  9. android在xml文件中实现背景或按钮颜色渐变

随机推荐

  1. 获取Android短信草稿箱号码为空的解决办
  2. Android异步处理常用方法
  3. Android(安卓)UI开发第二十九篇——Andro
  4. Google Android开发精华教程
  5. .net平台借助第三方推送服务在推送Androi
  6. Android入门前言(一)之------Android应用
  7. 《Android移动应用基础教程》(Android(安
  8. shape基本用法及全部属性定义
  9. Android系统源码阅读(10):Android(安卓)应用
  10. Android中解析XML