• 调用摄像头和相册


    1,。首先通过流存储数据

    File outputImage = new File(getExternalCacheDir(),"outImage.jpg"),参数一为路径,二为文件名,接下来判断文件是否存在,如果存在就删除,如果不就创建。如果你的手机版本低于7.0就用Uri中的fromFile()方法将图片的路径封装成uri路径。下面我们调用我们的摄像头

    1.通过Intent启动找的照相机

    2.通过intent找到getExtra()指定照片的输出地址,并且填入Uri路径

    3.通过startActivityForResult()方法,开启意图,并且要传入一个requestCode  id 方便找到我们拍摄的照片,以便显示出来。

    photo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //创建File对象,用于储存拍照后的照片
                    File outImage = new File(getExternalCacheDir(),"image.jpg");
                    try {
                        if (outImage.exists()){
                            outImage.delete();
                        }
                        outImage.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if (Build.VERSION.SDK_INT>=24){//安卓7.0以上
                        mimageUri = FileProvider.getUriForFile(CameraAlbum.this,"com.example.a13522.file",outImage);
                    }else {//低于7.0
                        mimageUri = Uri.fromFile(outImage);
                    }
                    //开启照相机
                Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
                    intent.putExtra(MediaStore.EXTRA_OUTPUT,mimageUri);
                    startActivityForResult(intent,TAKE_PHOTO);
                }
            });
        }
    startActivityForResult(intent,TAKE_PHOTO);的返回值会传给onActivity()方法通过上面传输的id,我们先通过BitmapFactory的decodeStream()方法将照片的uri解析成成Bitmap对象,并把它显示出来
    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(mimageUri));
    
                            mPicture.setImageBitmap(bitmap);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
    }
    }
    
    

    最后配置清单文件

     <provider
           android:authorities="com.example.a13522.file"
           android:name="android.support.v4.content.FileProvider"
           android:exported="false"
           android:grantUriPermissions="true"
           >
           <meta-data
               android:name="android.support.FILE_PROVIDER_PATHS"
               android:resource="@xml/file_paths"
               />
       </provider>
    

     其中的@xml/file_paths是不存在的需要我们自己创建

    在sre中创建xml文件夹在里面创建xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="my_images" path=""/>
    
    </paths>
    

    二:获取相册

    首先定义一个常量作为requestCode  id ,其次在点击按钮事件中添加运行权限

    如果添加就执行打开相册的方法

      choose.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //1.添加运行权限
                    if (ContextCompat.checkSelfPermission(CameraAlbum.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!=
                            PackageManager.PERMISSION_GRANTED){
                        ActivityCompat.requestPermissions(CameraAlbum.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
                    }else {
                        //如果有权限调用openAlbum();
                        openAlbum();
                    }
                }
            });
    
        //2.打开相册
        public void openAlbum(){
            //设置意图打开相册
           Intent intent= new Intent("android.intent.action.GET_CONTENT");
            intent.setType("image/*");//获取图片 称为:图片过滤器
            startActivityForResult(intent,CHOOSE_PHOTO);//打开相册中选择的图片,参数2,可以理解为键值。传到onActivityResult()方法中
        }
    
       case CHOOSE_PHOTO:
                    if (resultCode==RESULT_OK){
                        //判断手机系统版本
                      //  if (Build.VERSION.SDK_INT>=19){
                            handleImageOnKitKat(data);
                      //  }
                    }
                default:break;
            }
    
    private void handleImageOnKitKat(Intent data) {
            String imagePath = null;
            Uri uri = data.getData();
            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())){
                   imagePath= getImagePath(uri,null);
                }else if ("file".equalsIgnoreCase(uri.getScheme())){
                   imagePath= uri.getPath();
                }
                displayImage(imagePath);
            }
        }
    
    //获取图片的地址,显示在Image控件上
        private void displayImage(String imagePath) {
            if (imagePath!=null){
                Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
                mPicture.setImageBitmap(bitmap);
            }else {
                Toast.makeText(this,"图片加载失败",Toast.LENGTH_SHORT).show();
    
            }
        }
    
    
    
  • 相关阅读:
    docker run 参数含义
    java——数组队列 ArrayQueue
    java——数组栈 ArrayStack
    java——时间复杂度、动态数组
    java——异常类、异常捕获、finally、异常抛出、自定义异常
    java——变量
    java——虚拟机、线程
    java——内部类
    java——object类
    java——抽象类、接口、二者区别
  • 原文地址:https://www.cnblogs.com/lyl123/p/7192705.html
Copyright © 2020-2023  润新知