zoukankan      html  css  js  c++  java
  • Android拍照和从相册获取照片

    1.从相册获取照片

       private void openAlumb() {
    
    //mRxPermissions:三方权限库
            mRxPermissions
                    .request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    .subscribe(granted -> {
                        if (granted) { // Always true pre-M
                            Intent intentToPickPic = new Intent(Intent.ACTION_GET_CONTENT, null);
                            // 如果限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" 所有类型则写 "image/*"
                            intentToPickPic.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    
                            /*是否有能处理的外部activity*/
                            if (intentToPickPic.resolveActivity(getPackageManager()) != null) {
    
                                startActivityForResult(intentToPickPic, REQUEST_ALUBM);
                            }
                        } else {
    
                        }
                    });
    
    
        }

    2.拍照

    private void takePhoto() {
    
            mRxPermissions.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(permisssion -> {
                if (permisssion.granted) {
                    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) {//手机是否有探头
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        /*是否有能处理的外部activity*/
                        if (intent.resolveActivity(getPackageManager()) != null) {
    
                            try {
                                File photoFile = creatImageFile();
    
                                Uri photoUri = FileProvider.getUriForFile(UserInfoActivity.this,
                                        "com.ore.jalon.trace.fileprovider", photoFile);
    
                                intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
    
    
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
    
    
                            startActivityForResult(intent, REQUEST_TAKE_PHOTO);
                        }
    
                    }
                } else if (permisssion.shouldShowRequestPermissionRationale) {//拒绝了并且勾选了不再提示
    
                } else {
    
                }
            });
            
        }
     
     
     private File creatImageFile() throws IOException {
            /*判断是否有外存*/
            if (Environment.getExternalStorageState().equals(MEDIA_UNMOUNTED)) {
    
                return null;
            }
    
            String timeStamp = new SimpleDateFormat("yyyy_MMddmmss").format(new Date());
            String imgFileName = "JPEG_" + timeStamp + "_";
    
            /*保存到相册   */
            File fileDirct = Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM);
    
            File imgFile = File.createTempFile(imgFileName, ".jpg", fileDirct);
    
            mCurrentPhotoPath = imgFile.getAbsolutePath();
            return imgFile;
        }

    2.fileprovider: Android7.0开始 file://Uri 不给用,那么换个 Uri 为 content:// 来替代。

    FileProvider使用

    现在xml文件中申明

         <provider
                android:name="android.support.v4.content.FileProvider"
    //authorities:自定义,其他的固定
                android:authorities="com.package.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
    //指定路径文件
                    android:resource="@xml/file_paths"></meta-data>
            </provider>

    新建XML文件夹新建path.xml

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <!--system 相册 path:如果使用私有存储的话自定义一个文件路径比如/pigphoto-->
        <external-path name="my_images" path="DCIM" />
    </paths>

    最后在处理获取到的照片uri

      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
    
    //通过三方的缩放裁切一下图片
                startPhotoZoom(Uri.fromFile(new File(mCurrentPhotoPath)));
     
    
            }
            if (requestCode == REQUEST_ALUBM && resultCode == RESULT_OK) {
          
                Uri uri = data.getData();
                startPhotoZoom(uri);
    
            }
            if (requestCode == UCrop.REQUEST_CROP && resultCode == RESULT_OK) {
    //获取裁切后的图片
                final Uri resultUri = UCrop.getOutput(data);
     
            }
        }
      public void startPhotoZoom(Uri uri) {
            LogUtil.d(this.toString(), "begin cut");
            try {
                File file = creatImageFile();
                UCrop.Options options = new UCrop.Options();
                options.setHideBottomControls(true);
                UCrop.of(uri, Uri.fromFile(file))
                        .withAspectRatio(1, 1)
                        .withMaxResultSize(200, 200).withOptions(options)
                        .start(this);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
  • 相关阅读:
    FreePbx
    ntpdate和date
    Linux系统/dev/mapper目录浅谈
    利用rsync做全平台备份
    windows 共享给 linux
    Linux、UNIX设置开机自动运行命令
    JNU周练1019
    JNU周练1013
    2013/7/30 JNU周练
    二叉树遍历
  • 原文地址:https://www.cnblogs.com/cnman/p/10316280.html
Copyright © 2011-2022 走看看