调用摄像头和相册

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();

        }
    }

原文地址:https://www.cnblogs.com/lyl123/p/7192705.html