• 第二次冲刺(四)


    今天我完成了照相机的功能。

    关键代码为:

    private void showPop() {
            View bottomView = View.inflate(getActivity(), R.layout.layout_bottom_dialog, null);
            TextView mAlbum = bottomView.findViewById(R.id.tv_album);
            TextView mCamera = bottomView.findViewById(R.id.tv_camera);
            TextView mCancel = bottomView.findViewById(R.id.tv_cancel);
    
            pop = new PopupWindow(bottomView, -1, -2);
            pop.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            pop.setOutsideTouchable(true);
            pop.setFocusable(true);
            WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();
            lp.alpha = 0.5f;
            getActivity().getWindow().setAttributes(lp);
            pop.setOnDismissListener(new PopupWindow.OnDismissListener() {
    
                @Override
                public void onDismiss() {
                    WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();
                    lp.alpha = 1f;
                    getActivity().getWindow().setAttributes(lp);
                }
            });
            pop.setAnimationStyle(R.style.main_menu_photo_anim);
            pop.showAtLocation(getActivity().getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
    
            View.OnClickListener clickListener = new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    switch (view.getId()) {
                        case R.id.tv_album:
                            //相册
                            if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                                //相册中的照片都是存储在SD卡上的,需要申请运行时权限,WRITE_EXTERNAL_STORAGE是危险权限,表示同时授予程序对SD卡的读和写的能力
                                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                            }else {
                                openAlbum();
    
                            }
                            break;
                        case R.id.tv_camera:
                            //拍照
                            File outputImage = new File(getActivity().getExternalCacheDir(),"output_image.jpg");
                            try{
                                if(outputImage.exists())
                                    outputImage.delete();
                                outputImage.createNewFile();
                            }catch (IOException e){
                                e.printStackTrace();
                            }
                            if(Build.VERSION.SDK_INT >=24){
                                imageUri = FileProvider.getUriForFile(getActivity(),
                                        "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,TAKE_PHOTO);
                            break;
                        case R.id.tv_cancel:
                            //取消
                            closePopupWindow();
                            break;
                    }
                    closePopupWindow();
                }
            };
            mCamera.setOnClickListener(clickListener);
            mAlbum.setOnClickListener(clickListener);
    
            mCancel.setOnClickListener(clickListener);
        }
    
        public void closePopupWindow() {
            if (pop != null && pop.isShowing()) {
                pop.dismiss();
                pop = null;
            }
        }
    
        private void openAlbum(){
            Intent intent = new Intent("android.intent.action.GET_CONTENT");
            intent.setType("image/*");
            startActivityForResult(intent,CHOOSE_PHOTO);//打开相册
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case TAKE_PHOTO:
                    if (resultCode == RESULT_OK) {
                        try {
                            Bitmap bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(imageUri));
                            Touxiang.setImageBitmap(bitmap);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
    
                case CHOOSE_PHOTO:
                    if(resultCode == RESULT_OK) {
                        //因为sdk19以后返回的数据不同,所以要根据手机系统版本进行不同的操作
                        //判断手机系统版本
                        if(Build.VERSION.SDK_INT >= 19) {
                            handleImageOnKiKai(data);
                        }else {
                            handleImageBeforeKiKai(data);
                        }
                    }
                    break;
                default:
                    break;
            }
        }
        //>=19的操作
        @TargetApi(19)
        private void handleImageOnKiKai(Intent data) {
            String imagePath = null;
            Uri uri = data.getData();
            if(DocumentsContract.isDocumentUri(getActivity(), uri)) {
                //如果是Document类型的Uri,则通过document id 处理
                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())) {
                    //不是document类型的Uri,普通方法处理
                    imagePath = getImagePath(uri, null);
                }
                displayImage(imagePath);
            }
        }
    
        //<19的操作
        private void handleImageBeforeKiKai(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 = getActivity().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 path) {
            if(path != null) {
                Bitmap bitmap = BitmapFactory.decodeFile(path);
                Touxiang.setImageBitmap(bitmap);
            }else {
                Toast.makeText(getActivity(), "Load Failed", Toast.LENGTH_LONG).show();
            }
        }
  • 相关阅读:
    python:时间格式转化
    python:将时间戳格式化为yyyyMMdd hh:mm:ss
    Oracle 实现表中id字段自增长
    django:将query-set类型转为json类型
    mysql:获取某个表的所有字段
    Navicat连接Mysql8.0.11出现1251错误
    Java垃圾回收(GC)机制详解
    Mybatis学习总结(九)——查询缓存
    Mybatis学习总结(八)——延迟加载
    Mybatis学习总结(七)——调用存储过程
  • 原文地址:https://www.cnblogs.com/20193925zxt/p/14910737.html
Copyright © 2020-2023  润新知